ハッシュマップを拡張するクラスmyhashmapを持っていて、次に関数ハッシュをオーバーライドして定数を返すと、マップの挿入と参照がどのように影響を受けますか?Myhashmapがhashmapを継承し、ハッシュ関数をオーバーライドします
答えて
ハッシュ関数で定数値を返すことには意味がありません。これを行うと、hashMapは単純なリンクリストに変わります。
tab[i = (n - 1) & hash]
ここでnはマップのサイズです。 ハッシュ値が定数より大きい場合、結果は常に一定になり、get/put関数はO(N)時間かかることになります。
全くありません。 Myhashmap
で上書きできるのは、Myhashmap
の場合はhashCode()
となります。これにより、Myhashmap
のパフォーマンスには影響しません。一方、HashSet<Myhashmap>
とMap<Myhashmap, ?>
はかなり恐ろしい動作をします。
これを理解するには、HashSet
(またはHashMap
ですが、原則は同じです)の基本的な機能を理解する必要があります。そのハッシュに応じてバケットにObject
Sを配布することで、両方の仕事:今、この実装はoversimplistic維持され、実際のコードでは使用すべきではないながら
List<T>[] buckets = new List<>[bucketnum];
void add(T t){
List<T> l = buckets[t.hashCode() % buckets.length];
if(!l.contains(t))
l.add(t);
}
は、それはかなり明確に一つのことを示していますHashSet
があるため、高速でそれはバケツを使用します。しかし、hashCode()
メソッドが定数を返すようにすると、すべての値が単一のバケットに挿入されるHashSet
になります。すなわち、HashSet/-Map
がList
と比較してオーバーヘッドを導入するため、を離れて投げて、List
を使用してください。ランタイムはまったく変わらないでしょうし、悪い場合もあります。例えば。 HashSet/-Map
は、特定の負荷係数に達した場合にバケット番号を増やします。追加のリソースが必要です。
EDIT:
これは深さにもう少し行くと、それはHashSet/-Map
秒の異なる実装を示して、それは興味深いですが、それは、データ構造をハッシュする上記導入のちょうど拡張だとして、それは、理解する必要はありませんし、脚注として考慮する必要があります。実際には別のオプションがあります:Collision resolution。この場合、特定のハッシュバケットを共有するオブジェクトを格納するためのList
は存在しません。代わりに、アルゴリズムは特定のパターンで使用可能なバケットを検索します。これは..
例えば:
T[] buckets;
boolean add(T t){
int index = t.hashCode() % bucketnum;
for(int i = 0; i < bucketnum; i++){
if(buckets[(i + index) % bucketnum] == null){
buckets[(i + index) % bucketnum] = t;
return true;
}
}
return false;
}
このコードは衝突ハッシュに対応する線形衝突戦略を使用する等、線形二次することができた(二つのオブジェクトa
、b
、その結果a.hashCode() % bucketnum == b.hashCode() % bucketnum
)。この実装では少し異なる動作が示され、異なる負荷係数が必要ですが、適切なハッシュ関数が必要です。そうしないと、パフォーマンスはバケットリスト手法よりもさらに悪くなります。
- 1. オーバーライドと継承
- 2. インスタンス変数をオーバーライドするJava継承
- 3. 継承されたクラスのベース変数をオーバーライドします
- 4. 継承されたプロトタイプメソッドをオーバーライドし、元のプロトタイプメソッドをオーバーライドします
- 5. Javaは継承した文字列をオーバーライドします
- 6. 色を継承しますが、不透明度/透明度をオーバーライドします
- 7. 引数が "generified"クラスを継承するメソッドをオーバーライド
- 8. インターフェイスを継承していますが、メソッドをオーバーライドしていません
- 9. 継承されたCSSの高さをオーバーライドします。
- 10. どのように継承プロパティのi18nをオーバーライドしますか?
- 11. Python継承とメソッドのオーバーライド
- 12. 複数の継承関数
- 13. 継承したクラス関数の参照
- 14. メンバをオーバーライドしている間に継承セキュリティルールが違反しました: 'System.Data.Entity.Utilities.TaskExtensions
- 15. Numpy関数が継承したデータ型を壊す
- 16. Cssは継承された値をオーバーライドしません
- 17. Sparkはスカラ関数を継承します(Java/SparkSQL)
- 18. JavaScriptコンストラクタは関数を返し、継承できますか?
- 19. 継承したクラスを継承する
- 20. 継承を使用してコンストラクタフィールドをオーバーライドする理由
- 21. Python:クエリーセットを持つメソッドを継承してオーバーライドする方法
- 22. SKActionを継承してtimingModeをオーバーライドする
- 23. アンカーカラーをオーバーライドしてデフォルトカラーを継承する
- 24. 継承と仮想関数
- 25. 仮想関数の継承
- 26. 関数による継承?
- 27. 関数パラメータの継承
- 28. CSSが継承しない継承
- 29. memoize継続継承スタイル関数
- 30. 関数がプロトタイプをオーバーライドします
'HashMap'はハッシュ関数を提供しませんが、キーに対して' hashCode() '(と' equals() ')を呼び出します。そこであなたのメソッドを実装し、検索や挿入がどのように行われているかについての多数のドキュメント、特に定数ハッシュを使用する場合に重要な役割を果たす衝突に関する部分を読み上げてください(その場合の質問は、なぜHashMap最初は?)。 – Thomas
これが可能ならば、マップを大きなリンクリストに変換し、マップ操作(つまり挿入と参照)はO(1)ではなくO(N)になります。 –
はい、基本的にhashCode()をオーバーライドし、MyHashMapの定数を返すとHashMapクラスが拡張されても効果はありませんか? – Abhishek