2016-10-20 8 views
0

私はプログラムをより効率的に走らせようとしています。このリニアサーチを修正することは、スピードの面で大きな助けになると思いますが、これをバイナリ私はリストが必ずしも注文されていないと思うので、検索。最初の引数keyに基づいてリストを注文する方法はありますか?私は現在で働いて何リストを検索する方法は簡単ですか?

int* key_sequences::data(int key){ 
    for(it=myList.begin(); it!=myList.end(); ++it){ 
     if(it->first==key){ 
      return &(it->second[0]); 
     } 
    } 
    return nullptr; 
}; 
+1

ソートされたシーケンスなしではバイナリ検索ができません。 –

+2

明白な答えは、リストを使用して終了し、より適切なデータ構造(物の外見から 'map'または' unordered_map')に置き換えることです。挿入/削除がいつ/どのくらい頻繁に行われるかによって、ソートされた配列のバイナリ検索である "FlatMap"も考えられます。 –

+2

多くの場合、連続したキーに対してシーケンスが繰り返し検索されます。最後の検索結果をキャッシュすると、O(n²)からO(n)までの合計時間が短縮されます。しかし、データ構造を 'map'のようなより適切なものに変更したいと思います。 –

答えて

0

は、単にリンクリストでの検索はnは、リストのサイズであるO(n)と、です。

しかし、一部の実装では、開始時に1つ、中央に1つ、最後に1つの3つのリストポインタを使用するため、検索が始まると処理が高速化され、オンラインで検索できますこの。

しかし、私があなたであり、検索を高速化するのに面白かった場合は、別のデータ構造(ハッシュはstd::unordered_mapのような)を試してみるか、リストをソートします。

関連する問題