雜湊函式
雜湊表是基於陣列的,通過雜湊函式把key和陣列的下標進行轉換。
雜湊函式的實現方式有很多種,以hashmap中的雜湊函式為例:每個物件都有屬於自己的hashcode(唯一性),而hashcode都是乙個整型變數,再由hashcode對陣列長度取模運算(index = hashcode(key) % array.length
),實現key轉換為陣列的下標index。
雜湊表的讀寫操作
(1)寫操作(put)
寫操作即插入新的鍵值對(在jdk中叫做entry)。
如呼叫hashmap.put(「002931」,「小明」)的步驟:
a. 通過雜湊函式,把key轉換為陣列下標5;
b. 若陣列下標為5的位置沒有元素,就把這個entry填充到此位置;
c. 若陣列下標為5的位置有元素了(即發生了我們常說的雜湊衝突
,解決方法有:開放定址法、鍊錶法
),hashmap採用了鍊錶法解決雜湊衝突,先判斷此煉表中是否有了這個key,如果有了此key則用新的value值代替舊的value值,如果沒有此key,則將鍵值對插入到煉表頭。
【拓展】解決雜湊衝突的兩種方法
開放定址法
:當乙個key通過雜湊函式獲得對應的陣列下標被占用時,尋找下乙個空檔位置。
鍊錶法
:當乙個key通過雜湊函式獲得對應的陣列下標被占用時,先判斷此煉表中是否有了這個key,如果有了此key則用新的value值代替舊的value值,如果沒有此key,則將鍵值對插入到煉表頭。
(2)讀操作(get)
讀操作即通過給定的key,在雜湊表中查詢對應的值。
如呼叫hashmap.get(「002931」)的步驟:
a. 通過雜湊函式,把key轉換為陣列下標5;
b. 找到陣列下標為5所對應的元素,如果這個元素的key是002931,就找到了;若key不是002931,順著鍊錶往下找,找到匹配的節點即可。
(3)擴容 (resize)
a. 影響擴容的因素:
capacity:即hashmap的當前長度;
loadfactor:即hashmap的負載因子,預設是0.75f。
b. 衡量擴容的條件:hashmap.size >= capacity x loadfactor
c. 擴容的步驟
擴容
:建立乙個新的entry空陣列,長度是原來陣列的2倍;
重新hash
:遍歷原entry陣列,把所有的entry重新hash到新陣列中,其目的就是將原來的entry盡可能均勻的分配。
雜湊表 雜湊表
一 定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式...
雜湊表(雜湊表)
雜湊表是最基礎的資料結構之一,利用鍵值對儲存並檢索資料的一種非線性結構。在其它各種結構線性表 樹等資料結構中,記錄在結構中的位置是隨機的,和記錄關鍵字之間不存在確定的關係,因此,在結構中查詢記錄時需進行一系列和關鍵字的 比較 的基礎上。在順序查詢時,比較的結果為 與 兩種可能 在折半查詢 二叉排序樹...
雜湊表(雜湊表)
原文 雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程...