簡體   English   中英

Java HashMap如何為“獲取”操作執行恆定時間查找O(1)?

[英]How is it possible for Java HashMap to perform constant time lookup O(1) for “get” operations?

我了解HashMap的工作原理-hm.put(obj)根據obj.hashCode值找到將對象放入的正確存儲桶。 然后在該存儲桶中,如果另一個對象.equals(obj)則將其替換,如果未將其添加到存儲桶中。

但是我不清楚HashMap.put和HashMap.get如何可以是恆定時間O(1)。 據我了解,存儲桶的數量應基於哈希碼,因此將100個對象放入哈希圖中將(大約)創建100個存儲桶(我確實知道哈希碼有時會發生沖突,因此它可能少於100個,但不是經常)。

因此,隨着添加到哈希圖中的對象數量的增加,存儲桶的數量也隨之增加-並且由於很少發生沖突,所以這並不意味着存儲桶的數量幾乎與添加的對象的數量呈線性增長,在這種情況下為HashMap。 put / HashMap.get將為O(n),因為它必須在找到正確的每個存儲桶之前對其進行搜索。

我想念什么?

哈希表不需要搜索每個存儲桶,就像您不需要搜索庫中的每個架子一樣,因為您可以在索引卡中查找哈希表的位置,也不需要搜索索引中的每個卡。索引,因為它們已排序...(不確定是否有幫助,因為我不確定人們是否仍在去圖書館或他們是否還有索引卡)

想想這樣說:當你調用get(key) ,密鑰的哈希碼進行計算,並從該上百間的一個桶指出,在一個單一的 (一套)操作(一個或多個),即你沒有搜索所有100以找到正確的存儲桶(在這種情況下,這將是線性運算)

這是我的兩分錢,朋友。 像對待數組一樣思考HashMap。 實際上,它是一個數組。 如果我給您索引11,則不必遍歷數組即可在索引11處找到對象。您只需直接轉到那里。 這就是HashMap的工作方式:訣竅是使索引與值相同-本質上。

這就是哈希碼的來源。讓我們看一下哈希函數為單位乘數(即1)的簡單情況。 然后,如果您具有0到99的值,並且想要將它們存儲在數組中,那么它們將分別存儲在索引0到99處。 因此,放置和獲取顯然是O(1),因為將事物放入並放置在數組中是O(1)。 現在,讓我們想象一個不那么瑣碎的哈希函數,例如y = x + 2。 因此,在這種情況下,值0到99將存儲在索引2到101中。在給定值11的情況下,您必須計算哈希以找到它或將其放入(哈希為11 + 2 = 13)。 好的,哈希函數正在做一些工作來計算給定值的正確索引(在我們的情況下,y = x + 2 = 11 + 2 = 13)。 但是,這項工作所花費的精力與您擁有多少個數據點無關。 如果我需要放置999或123,則單個放置或獲取的工作量仍然相同:y = x + 2:每次執行放置或獲取時,我只需要加兩個:這是恆定的工作。

您可能會想一次輸入n個值,這是您的困惑。 那么在這種情況下,每個看跌期權仍為常數c 但是c乘以n就是c*n = O(n)。 因此,n與看跌期權本身無關,而是您一次制造n個看跌期權。 我希望這種解釋會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM