面試官問你什麼是Hash表

Hash表(哈希表),也叫散列表,在這之前還以爲這是兩種數據結構呢,不知道爲啥他倆能扯上關係,翻譯了一波才知道,hash就是把……弄亂;斬碎的意思,這下明白名字的由來了。
由於數組的查詢快,增刪慢,而鏈表的增刪快,而查詢慢,於是出來了哈希表這種數據結構,吸取了數組和鏈表的優先。
在我們使用數組鏈表數據結構時,也就是實現通過一個key去查找value,對數組而言就是通過下標來找對應的值,對於鏈表而言,就是通過data裏面存的key,來對應value。正是如此,所以數組的查找比較快,直接通過索引,而鏈表呢,就需要遍歷鏈表,判斷key,來獲取value。而哈希表是通過數組的快速查詢進行一個模糊的定位,然後再通過這個小範圍去查找對應的value。
在這裏插入圖片描述
提取上圖的一條鏈,方便下面講解
在這裏插入圖片描述
核心思想
首先構造出這個數組,這裏是0~15,通過除留餘數法進行構造,如果一個key是26,26%16=10,所以這裏把key爲26的數據存入下標爲10的鏈表裏,這裏是通過拉鍊法實現的,也就是數組的每一個元素都有一個指針執行一個鏈表,當有餘數與該索引對應時,那麼就把該元素的key和value存入鏈表裏,如果我們在查詢的時候,如果key是126,那麼我們會找到下標爲10的索引值,而這裏對應了兩個值,那麼我們就需要對該鏈表進行遍歷,看看哪個key是126,就取key是126的value,這樣一來,查詢的速度通過數組快速定位,增刪也是通過數組快速定位,然後鏈表直接追加上。如果key是字符串,可以通過一些算法,進行數字化,然後存儲進去。
多扯一點
到這裏你可能會想到Map,對的就是Map,還有HashMap,是吧跟Hash扯上關係了,在JDK1.7之前,當找到一個數組下標後,就是通過遍歷鏈表實現的,此時時間複雜度是O(n),但是在JDK1.8之後當鏈的長度大於等於8的時候,就把這個鏈表的實現改成了紅黑樹了,這樣一來,就提高了找具體的key的效率,時間複雜度是Olog(n)
在這裏插入圖片描述
在這裏插入圖片描述![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200325121055385.png在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章