2012-05-06 10 views
3

O(1)ルックアップを持つC++のデータ構造はありますか?C(+)でのO(1)ルックアップ

std::mapには、O(log(n))の検索時間(右?)があります。

私はstdの中から何かを探しています(Boost plsはありません)。また、もしあれば、どのように機能するのですか?

EDIT:わかりました。私は値を関連付けたい、mapのような種類。だから、私はstd::map<int,string>のようなものを、findinsertO(1)とする必要があります。

+2

すべてはデータ、特にキーのタイプと可能な*値によって決まります。したがって、どのような種類のデータを保存したいですか? – Nawaz

+0

リンクされた配列に似たものがありますか?それはO(1)についてです。リンクされた配列は、配列のリンクされたリストです。 –

+0

'std :: unordered_map <>'名前空間 'std'にあるのは、名前空間' boost'に最初にあったからです。 – ildjarn

答えて

9

アレイはO(1)ルックアップを持っています。 C++ 11のHashtable(std :: unordered_map)にはO(1)ルックアップがあります。

マップのようなツリーベースのデータ構造には大きな利点があり、log(n)だけで十分ではないこともよく言及したいと思います。

編集への回答文字通り、配列のインデックスを値の1つに関連付けることができます。また、ハッシュテーブルは連想的ですが、完全なハッシュ(各キーは正確に1つの値にマップされます)は実際には得難いです。

さらに言及する価値のあることは、アレイは優れたキャッシュパフォーマンスを持っています(ローカリティのために、要素はすぐ隣にあり、prefectエンジンでキャッシュにプリフェッチできます)。木々、そうではありません。妥当な量の要素では、ハッシュ・パフォーマンスは漸近的なパフォーマンスよりも重要です。

+0

また、TR1には順序付けられていないマップがあることに言及する価値があります。 VS2008以前のGCCのようなコンパイラの中にはTR1を実装していますが、C++ 11は実装していません。 – Puppy

+0

@scarletamaranth主な理由は、配列がとてもパフォーマンスが良いということです - あなたが話しているように正確にはっきりしていないと言ったように、システムはメモリ内でジャンプします(インデックス+ sizeof(type)*インデックスの終わり)キャッシュの –

+0

@Shingetsuそれは私が言ったことです... – ScarletAmaranth

3

arrayO(1)ルックアップを有する。 O(1)ルックアップ(キーのサイズを無視する)と

+0

私はOPの手が前にサイズを知らないと思う –

+0

キーが非整数の場合はどうなりますか?シンプルな配列はうまくいきません。したがって、キーのデータ型に依存します。 – Nawaz

4

データ構造は次のとおり

  • アレイを
  • ハッシュテーブル
  • 複合タイプの

、バランスのとれたツリーになりますO(log n)で罰金、またはpatricia trieO(k)で取得することがあります。参考

complexity of search structures

+0

配列は結合的ではありません。 'std'にはどのようなハッシュテーブルがありますか? – AMCoder

+0

@AMCoder: 'std :: unordered_map'があります。 – Puppy

+0

ハッシュテーブルはO(1)ではありません - まだ衝突処理のチェックが必要であり、衝突があればバケットを反復する必要があります。最良のケースはO(1)ですが、必ずしもそうとは限りません。 –

関連する問題