2011-12-16 10 views
1

頻繁な追加/削除をサポートするためのコンテナを探しています。私はコンテナがどれだけ大きくなるかわからないが、巨大な再割り当てのために屋台を望んでいない。私は、パフォーマンスと一貫した振る舞いの間に良いバランスが必要です。一貫したパフォーマンスのための高速コンテナ

最初は、std :: tr1 :: unordered_mapを考慮しましたが、データセットの上限がわからないため、衝突によって実際にunordered_mapのパフォーマンスが低下する可能性があります。それは良いハッシュ関数の問題ではないので、マップの占有率がバケット数の半分以上であれば、衝突が問題になる可能性があるためです。

私はstd :: mapを検討していますが、衝突の問題はありませんが、ログ(n)のパフォーマンスしかないためです。

unordered_mapのターゲットサイズがわからないときに、インテリジェントに衝突を処理する方法はありますか?私が想像するこの状況を処理するための他のアイデアは珍しくありませんか?

ありがとう

+5

正しい答えはもちろん、クラスの中に隠すことによってコンテナの選択を抽象化することです。次に、実際のアプリケーションを異なるコンテナでプロファイルすることができます。それは...私は 'std :: unordered_map'があなたが思うよりもうまくいくだろうと確信しています。 – Nemo

+0

私は連想コンテナが必要だと思いますか? – GWW

+3

おそらくstd :: vectorのパフォーマンスに驚かれるでしょう。非常に特殊な要件があるまでは、非常に良い選択です。 –

答えて

1

これは実行時のコンテナです。

最後に追加していますか(push_backなど)か、正面か中央ですか? ランダムな場所で削除していますか、それとも何ですか?

どのように情報を参照していますか? ランダムに、または正面または背面から、または何ですか?

ランダムアクセスが必要な場合は、配列またはハッシュに基づくものが優先されます。

再割り当てが大きな問題である場合は、ツリーやリストのようなものが必要です。

あなたは常にnew -ing(およびdelete -ing)あなたはコンテナに入れているオブジェクト、ある場合はそうであっても、一人でいることが、その場合には、あなたが見つけるかもしれない、 時間の大部分を消費する可能性があります使用済みのオブジェクトを迷惑メールリストに保存してリサイクルすることは理にかなっています。

私の提案は、コンテナの選択に悩まされるのではなく、1つだけを選んでプログラムを書いてからtune it, as in this exampleと書いてください。 あなたが選んだものとは無関係に、恐らくそれを変更したいかもしれません。 私がこの例で見つけたのは、既存のコンテナクラスがプログラミングの容易さによって、その存在を正当化することであり、できるだけ高速ではありませんでした。

あなたのプログラム内のいくつかの他のアクティビティが支配的なコストとなり、それを縮小できない限り、 はわかりませんが、最終的なスピードのスピードはデータ構造を手動でコーディングする必要があります。

+0

はい、これは実行時のコンテナです。私はランダムアクセスが必要です。なぜなら、削除を高速にする必要があるからです。追加は高速である必要がありますが、それは簡単です。毎回new-ing/delete-ingをしたくないと思っていたので、ある種のプールが適切と思われました。多分、dequeのような構造(上記のような人)が始まる場所です:ランダムアクセスですが、連続しないので、追加/削除は高価なrehash/reallocにならないでしょう。 – impulsionaudio

0

どのようなアクセスが必要ですか?シーケンシャル、ランダムアクセス、キーによる検索?さらに、順序付けされていないマップを手動で再ハッシュしたり(rehashメソッド)、負荷率を設定することができます。いずれにしても、チェーンが長すぎるとき(すなわち、負荷率を超えたとき)にハッシュが再構築される。さらに、ハッシュテーブルのスローダウンポイントは、50%ではなく、80%に満たないときです。

実際には、hereなどのドキュメントをお読みください。

関連する問題