我最近被問到'你會如何實現一個hastable'。我知道哈希算法是至關重要的,因爲碰撞越少,WRT性能越好,但是應該採用什麼算法/數據結構來爲插入/刪除/查找提供分期不變的時間{O(1)}?Hashtable實現
5
A
回答
7
哈希表有兩種主要的可能性:
- 開放尋址,這是一個簡單的陣列 [動態數組actualy如果你 可以讓你的桌子生長在飛。一旦遇到衝突 - 您需要使用第二個哈希函數來查找元素將映射到的下一個主元。注意當你的哈希表也允許刪除時,這個解決方案有一些麻煩[可以解決]。 [特殊標記爲「已刪除」主菜]
- 鏈接 - 在這個解決方案中,陣列在每個主菜是鏈表 - containig散列到這個主菜所有元素。在這裏 - 映射到特定值的所有元素都在列表中。
以便允許armotorized O(1)插入/刪除/查找關於哈希表[在這兩種解決方案]重要的部分 - 被分配一個較大的表和重散列一旦達到定義load factor預。
編輯:複雜analsis:
承擔p
負載因數一些p < 1
。
- 在每個接入「碰撞」的概率爲
p
因此陣列的平均訪問爲:Sigma(i * p^(i-1) * (1-p)) for each i in [1,n]
這給你:Sigma(i * p^(i-1) * (1-p)) = (1-p) * Sigma(i * p^(i-1)) <= (1-p) * 1/(p-1)^2 = 1-p = CONST
。 [看看Sigma(i * p^(i-1)) < 1/(p-1)^2 in wolfram alpha的正確性]。因此平均得到對該陣列的連續數量的訪問。另外:在達到加載因子後,您可能需要重新哈希所有元素,從而導致對該陣列的訪問O(n)
。這導致n * O(1)
ops [添加n個元素]和1 * O(n)
op [rehashing],所以您得到:(n * O(1) + 1 * O(n))/n = O(1)
armotorized時間。 - 與(1)非常相似,但分析是在列表訪問上完成的。每個操作只需要一個數組訪問,並且需要不同數量的列表訪問 - 具有與之前相同的分析。
相關問題
- 1. C++ HashTable對象實現
- 2. 對Java HashTable實現的線性探測
- 3. 在Java中自定義實現HashTable?
- 4. 在java中需要內部實現HashTable
- 5. Java HashTable實現get方法返回null?
- 6. Hashtable實現中使用的算法?
- 7. 在Hashtable實現中需要幫助
- 8. 爲什麼Hashtable實現ICollection和IEnumerable?
- 9. 的Hashtable和BST實施
- 10. HashTable實現與ZERO碰撞的集合?思考的食物?
- 11. 如何正確實現Runnable在Hashtable中搜索元素?
- 12. Hashtable是否實現Map接口中的每個方法?
- 13. 在Java中使用數組的簡單HashTable實現?
- 14. 如何實現hashTable作爲索引器在java中的鏈表?
- 15. Hashtag Hashtable
- 16. 實現從電話簿中讀取聯繫人在J2ME中使用Hashtable
- 17. 自定義的GetHashcode實現會導致Dictionary或Hashtable的「桶」問題
- 18. C++ ADT在HashTable上設置實現(解決與獨立列表的衝突)
- 19. HashTable併發性
- 20. Hashtable重寫
- 21. J2ME Hashtable比較
- 22. Hashtable解釋
- 23. Hashtable添加 - C
- 24. HashMap/HashTable說明
- 25. cmd.exe powershell HashTable
- 26. Array into HashTable
- 27. jQuery inArray with Hashtable
- 28. 2 Hashtable鍵
- 29. 熊貓Hashtable KeyError
- 30. Boost Intrusive Hashtable
可能陣列的力量與你 – 2012-02-23 08:54:22
你看了一本書,說Cormen等人的「算法導論」? – Raphael 2012-02-23 11:37:34
這正是我正在獲取的書。 – 2012-02-23 12:02:52