我試圖實現使用鏈散列動態哈希表的執行情況(陣列中的每個元素是一個鏈表)。 我想知道,複雜明智的,它的下面可能是更好的: 1.當數組已滿,這意味着每個鏈表至少有一個元素,我應該加倍數組大小。 2.當我總共有N個元素時(在所有鏈表中),我應該將數組大小加倍 - 其中N是數組大小。動態哈希表使用鏈散列
0
A
回答
0
大量的散列表實現在野外,包括C++標準中的幾個(unordered_set,unordered_map)。
要回答你的問題,最好是折起來的箱數(內部數組),當元素計數到達N的其他方式將更難和耗時(找出如果所有垃圾桶都滿)。
你需要保持持有的元素數量的成員。
您不必擔心使用像{ return 0;}
這樣的不良散列函數的用戶。
0
複雜性的角度來看,他們都是一樣的。散列表的複雜性以平均大小寫的O(1)給出,因爲一旦散列函數具有良好的散列函數,散列衝突就可以歸結爲運氣。無論你做什麼,任何散列表的最壞情況複雜度都是O(N)。
也就是說,有用的實現基於負載因子調整大小,該負載因子是總元素和桶數(「數組大小」)之間的比率。等到每個存儲桶至少有一個條目時,往往會導致次優行爲。但是載荷因子1(N個桶中的N個元素)可能過高;大多數實現我已經看到默認0.7左右(10個桶7個元素),並且通常讓用戶配置負載因子(請參閱C++和Java兩者)。這是交易內存與速度,哈希表通常都是關於速度。一般來說,只有分析才能顯示任何特定程序的正確值。
此外,大小不需要一倍。典型的vector
實現每個調整大小的大小增加50%或70%,因爲對實際應用程序的大規模測試表明,更好的速度/內存摺衷比雙倍。它有理由相似的事情將適用於散列表,雖然這再次受到分析。
相關問題
- 1. 哈希散列
- 2. 寫散列哈希
- 3. 散列哈希perl
- 4. 哈希散列與陣內哈希
- 5. 在javascript中列表的散列哈希哈希
- 6. 陣列哈希散列
- 7. 使用散列訪問哈希
- 8. 使用哈希作爲鹽的散列?
- 9. 鏈式哈希錶鏈接列表
- 10. 哈希表散列避免負面哈希碼
- 11. 構建散列哈希
- 12. 製作md5散列哈希
- 13. 排序散列哈希
- 14. 哈希表 - 散列函數實現
- 15. 散列哈希散列,Itunes心願列表
- 16. 哈希散列使它更安全嗎?
- 17. 哈希錶鏈puttall()
- 18. 哈希錶鏈接
- 19. 如何共享哈希散列在多線程的perl分享哈希散列
- 20. 在Perl中引用散列的哈希
- 21. Perl哈希散列解引用
- 22. 使用鏈接的快速哈希表
- 23. 靜態哈希表
- 24. 哈希表vs哈希列表與哈希樹?
- 25. 遍歷和更新散列哈希的哈希
- 26. 如何遍歷包含哈希數組的哈希散列?
- 27. 如何從散列哈希中獲得哈希切片?
- 28. 在Ruby中訪問哈希散列哈希
- 29. 將散列數組傳遞給哈希哈希值
- 30. 哈希散列:返回哈希與特定的子項