簡體   English   中英

HashMap || 哈希碼查找如何保持恆定

[英]HashMap || How hashcode lookup is constant

在哈希圖中,哈希碼查找如何為常數O(1)

我們知道,哈希表在內部會創建一個數組來保存給定鍵值的哈希碼。 通過使用散列函數,hashmap生成散列代碼。 我們還知道,對於查找來說,哈希圖需要花費恆定的時間(假設沒有沖突)。 每當我們請求哈希映射以查找給定鍵的值時,它首先會計算存儲桶位置(即與給定鍵的哈希碼映射的數組的索引)。 然后,它獲取值。 我知道第二部分將花費固定的時間。 但是第一部分呢? 哈希碼的數組索引查找常量如何? 特別是當哈希圖具有數百萬個值時?

我的StackOverflow搜索在哈希圖上發現了多個問題,但大多數情況下,它們回答了我問題的第二部分,而不是第一部分。

我發現的鏈接很少:

  1. 為什么哈希表查找為O(1)即恆定時間?
  2. 哈希表真的可以是O(1)

我還發現了用戶在javarevisited.blogspot上發布的這個問題:

嗨,Javin,您需要澄清我最近一次面試的問題之一。 為了搜索和排序首選哪個Collection數據結構:ArrayList或LinkedList。 我提到ArrayList是實現隨機訪問的檢索操作的選擇,而鏈表則是插入/刪除的更好選擇,因為它保留了節點之前和之后的指針。 我的后續問題,那么您是說使用擁有100萬條記錄的Arraylist來加快檢索速度嗎? 我說過,如果索引已知,我們可以使用contains()並獲取值。 但是請在真實的動態情況下(即不知道索引)對此100萬個場景進行說明。 ArrayList會更快嗎?

您似乎對數據結構有誤解。 創建陣列時,該陣列將在內存中保存一個空間。 該空間的大小是數組中元素的數量乘以每個元素大小

因此,包含八個2字節數字的數組將為16字節。

可以說我們想要第四個索引處的數字:我們無需迭代即可查找該數字因為我們對數據結構的性質有所了解:特別是它的起始位置和每個元素的大小。 在這種情況下,我們知道如果將2個字節乘以3(3 = 4-1:記住我們是零索引的),我們將得到6,而想要的元素的起始位置要比數組的起始位置晚6個字節。

Hashmap通常由這種性質的數組作為后盾。 所需數組元素的起始位置的計算較為復雜,但無需迭代即可完成。 因此它是O(1) 在數組位置找到的是所檢索在內存中的實際位置。

  • 使用提供的鍵來計算后備陣列中位置(存儲值的存儲位置)的功能是恆定時間操作。
  • 讀取第一步中計算出的存儲位置是恆定時間操作。
  • 讀取存儲在第二步中讀取的位置中的存儲位置是恆定時間操作。

因此,整個操作在恆定時間內進行。

給定索引的數組查找是在恆定時間內完成的。 實際上,這是一個簡單的地址計算(基址+索引*跨度),然后是間接尋址。

當您找到哈希碼時,您也可以找到恆定時間的單元格編號

cellIndex = hash(X) % array.length

所以你完全有const時間

暫無
暫無

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

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