所以有很多消息來源說hashmap刪除函數是O(1),但我不明白這可能是如何,除非散列表由鏈表返回,因爲列表清除是O(n)。有人可以解釋嗎?hashmap刪除複雜性
回答
您可以將Hasmap視爲一個數組。想象一下,你想把地球上所有人的物體存儲在地球上。您可以爲每個人獲取唯一的編號,並使用尺寸爲10 * 10^20的數組。 如果某人出生,她/他會獲得下一個免費號碼並被添加到結尾。如果有人死亡,則使用她/他的號碼,數組條目設置爲空。
你可以很容易地看到,添加一些或刪除某人,你只需要恆定的時間。計算陣列地址,完成(如果你有隨機存取存儲器)。
什麼是由Hashmap添加的?有2個動機。一方面,你不想擁有如此龐大的陣列。如果你只想存儲來自世界各地的10個人,幾乎所有的數組條目都是免費的。另一方面,並非所有要存儲在某處的數據都有唯一的編號。有時會有多次相同的號碼,有些號碼現在顯示爲整體,有時候您沒有任何號碼。因此,您可以定義一個函數,該函數使用輸入中的大數字並將其減小到較小範圍內的數字。這種減少應該是一種方式,即最終的數字對於不同的輸入來說可能是唯一的。
例如:假設您想要存儲10個數字,從1到100000000.您可以使用一個有100000000個索引的數組。或者你可以使用一個有100個索引的數組,並且函數f(x)= x%100.如果你的數字是1234,那麼f(1234)= 34。
現在你可以問,如果你的號碼是2234,會發生什麼?那麼我們碰撞了。你需要一些策略來處理這個問題,有幾個。研究一些文獻或爲此提出具體問題。
如果你想存儲一個字符串,你可以想象使用每個字符的長度或ascii值的總和。如您所見,我們可以輕鬆存儲某些內容,並輕鬆地再次訪問它。我們必須做什麼?計算函數中的散列(一個好函數的恆定時間),訪問數組(恆定時間),存儲或刪除(恆定時間)。
在現實世界中,一個好的散列函數並不那麼容易。嘗試堅持在Java中包含的。
如果您想了解更多的細節,關於哈希表維基百科的文章是一個很好的起點:http://en.wikipedia.org/wiki/Hash_table
很好的回答!我有一個關於這個例子的問題:「你可以使用一個有100個索引和函數f(x)= x%100的數組。」你不覺得因爲我們有10個數字,所以f(x)= x%10 (或11)就夠了? – Hengameh
是的,10就足夠了。一般來說,Hashmaps爲未來的作品留出一些空間是一種很好的做法。否則,你會得到很多的衝突(或者你需要一些到位的重新平衡)。在這個特定的情況下,這是一個很好的例子來說明總體目的:) –
我不認爲刪除(鍵)複雜度爲O(1)。如果我們有一個有很多碰撞的大散列表,那麼在最壞的情況下它就是O(n)。很難得到最壞的情況,但我們不能忽視O(1)不能保證的事實。
複雜性不是O(1)。其攤銷O(1)。 – Tahlil
- 1. SQL:複雜的刪除
- 2. 複雜SSIS刪除方案
- 3. 複雜刪除SQL語句
- 4. 複雜的刪除查詢
- 5. 操縱複雜的HashMap
- 6. 添加\刪除NSMutableArray中的對象的複雜性是什麼?
- 7. 哈希表運行時複雜性(插入,搜索和刪除)
- 8. JavaScript刪除複雜的div在qml
- 9. 實體框架 - 刪除複雜對象
- 10. Breeze.js rejectChanges刪除非標複雜類型
- 11. 哈希表刪除複雜度
- 12. Priority Queue刪除複雜時間
- 13. HashMap中刪除本身是一個HashMap
- 14. 複雜性復發
- 15. 在線性時間迭代Array時HashMap的空間複雜度
- 16. 在java中使用/獲取HashMap複雜性8 jdk
- 17. 併發hashmap大小()方法複雜度
- 18. 複雜的Hashmap ArrayList的發電機
- 19. std :: set擦除複雜性異常?
- 20. 複雜性類
- 21. Hashtbl.create複雜性
- 22. 複雜性將
- 23. 從HashMap中刪除位置
- 24. Java HashMap刪除鍵/值
- 25. 刪除hashmap中的值
- 26. 從字符串刪除重複,不使用HashMap和O(n)的時間複雜度
- 27. 空間複雜性復發
- 28. itertools.permutations的複雜性
- 29. Tableview UiDesign複雜性
- 30. 複雜性證明
你的問題自相矛盾。你能解釋一下鏈表支持哈希映射的意思嗎? – abellina
我的問題基本上是問,爲什麼hashmap刪除O(1)?忽略其餘。 –