1. 程式人生 > 其它 >Hash表的時間複雜度為什麼是O(1)?

Hash表的時間複雜度為什麼是O(1)?

一句話總結:雜湊表用陣列儲存了<key,value>的記憶體地址

【hash表的時間複雜度】hash表的時間複雜度為什麼是O(1)?
能回答這個問題的答案之前,肯定必須先了解hash表的資料結構。如下圖所示:

如圖中清晰可知,hash表是基於陣列+連結串列的實現的。陣列在記憶體中是一塊連續的空間,只要知道查詢資料的下標就可快速定位到資料的記憶體地址,即陣列查詢資料的時間複雜度為O(1)。hash表的儲存結構是<key,value>的形式,資料讀取時,只需提供key就可快速查詢到value。hash表依據陣列利用下標快讀查詢資料的特性來實現這樣的查詢方式的。也就是如上圖中所示,hash表的物理儲存其實是陣列


如果我們能夠根據 key 計算出陣列下標,那麼就可以快速在陣列中查詢到需要的 key 和 value。那hash表示怎樣實現的呢,如下圖所示:

由圖中展示的一樣,最簡單的方法就是餘數法,即使用 hash 表的陣列長度對 key的hashCode 求餘, 餘數即為 hash 表陣列的下標,使用這個下標就可以直接訪問得到 hash 表中儲存的 <key, value>。但是如果不同的 key 計算出來的陣列下標相同怎麼辦?於是就有了圖一中所示的連結串列,它就是為了解決這個問題(所謂的hash衝突)而衍生的。這裡需要注意的是,<key, value> 資料並不會直接儲存在 Hash 表的陣列中,因為陣列要求儲存固定資料型別,主要目的是每個陣列元素中要存放固定長度的資料。所以,陣列中儲存的是<key, value> 資料元素的地址指標。一旦發生 Hash 衝突,只需要將相同下標,不同 key 的資料元素新增到這個連結串列就可以了。查詢的時候再遍歷這個連結串列,匹配正確的 key。
————————————————
版權宣告:本文為CSDN博主「隱者自怡悅」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:
https://blog.csdn.net/YYQ_QYY/article/details/105992427