一句話總結:哈希表用數組保存了<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