1

HashSet<T>ジェネリックinに独自のコンパレータを定義しSystem.Collections.Generic、そのランタイムが O(1) の場合、ハッシュセットのルックアップ時間は O(1) のままですか?

コンパレータを設定する方法がないように見えるという理由だけで、いいえと思います。

4

2 に答える 2

3

通常のハッシュセットのルックアップ時間が O(1) である理由は、オブジェクトを配列に配置するためにオープン アドレッシングを使用しているためです。そのため、独自のコンパレータを使用しても変わりません。

于 2010-08-25T00:59:31.847 に答える
1

最良のケースでは、償却された O(1) の挿入と O(1) のルックアップがあります。

最悪の場合、償却された O(n) の挿入と O(n) のルックアップが行われます。

優れたコンパレーターは、優れたハッシュ方法を使用することで、実際のケースを最悪のケースよりも最良のケースに近づけるのに役立ちます。

悪いコンパレータは、まあ悪いでしょう。(すべてのハッシュコードに対して同じ値を返す意図的に悪いコンパレータを作成します[有効ですが無意味]、このO(n)の動作を見ることができます)。

優れたコンパレーターは運が悪くなる可能性がありますが、ほとんどの場合、実際のケースは O(1) に十分近いため、O(1) と見なすことができ、遠くに誘導することはできません。

編集:

「コンパレータを設定する方法がない」ということについて少し見逃しました。あります。 HashSet には、1 つを取るコンストラクターがあります。

于 2010-08-25T01:06:34.483 に答える