資結筆記|雜湊表(Hash Table)

更新於 發佈於 閱讀時間約 3 分鐘

基本概念


  Hash其實是一個人名,他發明了hash algorithm(雜湊演算法)其主要的目的是提高搜尋的效率,透過將物件相關訊息映射成一個唯一的數值,這個值就是雜湊值。在電腦中會透過雜湊函數來處理這件事,將輸入的訊息轉換成數值,一個好的雜湊函數須包含以下特性

  1. 每個字串可以產生唯一的雜湊值
  2. 相同字串在不同時間輸入,也要得到相同的雜湊值
  3. 不論字串大小都可以產稱相同長度的雜湊值
raw-image

我們會用表單來表示"鍵(key)值(value)"的配對關係,在python又稱為字典(dict)的資料格式,用以下的表格舉例,用動物對應到體重

raw-image

上述資料結構只要當我們有key就可以得到value,我們又稱為雜湊表,透過key搜尋value的時間複雜度是O(1)。


雜湊表轉換成陣列


  本質上雜湊表也是一種陣列,所以我們可以將雜湊表轉成陣列索引

首先我們計算鍵(key)的雜湊值,以上面的表格為例輸入狗會得到雜湊值0023,以程式表達的方式如下

hashcode = hashfunction(key)

接著假設陣列的長度是n可以使用求餘數(mod)的方式計算鍵的索引值。

index = hashcode % n


雜湊表寫入


  假設有一個空的雜湊表,此陣列包含三個空間元素,如下圖


raw-image

因為狗對應的值為0023,除以3的餘數為2,因此要存入index為2的的位置

raw-image

雜湊碰撞與鏈結法


  你會發現有時候求索引值是會出現相同的餘數,像是上面的雞 -> 0026 % 3 = 2,就跟狗的索引值相同,遇到這種情況我們就稱為雜湊碰撞,這時候我們可以使用鏈結串列將資料接在前面的資料後,當所有的資料儲存至陣列,雜湊表就算完成了,見下圖


raw-image

除了用鏈結串列的方式解決雜湊碰撞,還可以用開放定址的方式,我們有機會再來補充。


搜尋雜湊表


  假設我們要搜尋狗的體重,先計算雜湊值得到0023,除以3取餘數得2,因此我們知道狗的資料放在陣列中索引2的位置,接著可以找到12000,得知狗的體重是12000公克。而假設我們要搜尋雞的體重,因為雞的索引值一樣是2,但索引2的第一個資料不是雞,我們就在索引2進行線性搜尋,就可以找到雞了。


雜湊表的規模與擴充


  假設要存放的資料太多,雜湊表的空間太少,就會導致碰撞的機率過高,使搜尋效率下降;反之若資料的數量太少,但建立了超大的雜湊表就會浪費非常多空間,造成記憶體浪費。因此跟大家介紹一個新的名詞叫做負載系數(loadfactor),其計算方式如下

負載系數 = 雜湊表的項目數 / 雜湊表的陣列容量

一般來說當負載系數 > 0.75雜湊表就需要擴充了。


雜湊表的效能分析


raw-image

和其他資料結構做分析

raw-image

在做搜尋的時候,如果跟二元樹相比,二元樹的時間複雜度為O(log n),但雜湊表的時間複雜度為O(1),所以效能差異非常大。


以上大家對雜湊表有沒有基本的概念拉,後續會再補充用python實作雜湊表,請各位讀者敬請期待。


竹林裡的呢喃:

哇凌晨3點11分快累鼠拉,跟大家分享達文西的一句話

如果今天我很努力地學習 過得很充實 則我晚上將睡得很安穩

要不是因為睡前發現今天好像沒有讀新東西,晚上感覺會睡不安穩,所以就硬著頭皮坐在電腦桌前坑吃吭哧的啃書加上輸出成文章了,希望這些文章可以幫助到以後學資結的人~




留言
avatar-img
留言分享你的想法!
avatar-img
資治通艦的沙龍
3會員
45內容數
人生中有的時候你會感知到,現在就是那個命運的分歧點,如果我不挽起袖子努力的話,我這一輩子大概就這樣了,所以我決定開始這個部落格,記錄我每天的努力,也希望可以分享學習的筆記與心得,大家可以一起交流學習。
資治通艦的沙龍的其他內容
2025/04/08
請使用 C 或 Java 語言寫一副程式,此副程式對一個長度為 10 的整數陣列 A[0:9],最多花費 15 次的數值比較運算,尋找陣列中的最小值及最大值,並分別存入 Min 及 Max。(注意:請加註解說明程式碼寫法) 【103.關務】
Thumbnail
2025/04/08
請使用 C 或 Java 語言寫一副程式,此副程式對一個長度為 10 的整數陣列 A[0:9],最多花費 15 次的數值比較運算,尋找陣列中的最小值及最大值,並分別存入 Min 及 Max。(注意:請加註解說明程式碼寫法) 【103.關務】
Thumbnail
2025/04/07
第 1 題 題目 設有一三維陣列(three dimensional matrix) A[1...u₁, 1...u₂, 1...u₃],請問其中一元素(element)A[i,j,k] 之儲存位置為何?其中 1 ≤ i ≤ u₁,1 ≤ j ≤ u₂,1 ≤ k ≤ u₃,請列出推導過程。
Thumbnail
2025/04/07
第 1 題 題目 設有一三維陣列(three dimensional matrix) A[1...u₁, 1...u₂, 1...u₃],請問其中一元素(element)A[i,j,k] 之儲存位置為何?其中 1 ≤ i ≤ u₁,1 ≤ j ≤ u₂,1 ≤ k ≤ u₃,請列出推導過程。
Thumbnail
2025/04/07
陣列和鏈結串列的比較以及陣列位址的計算方式
Thumbnail
2025/04/07
陣列和鏈結串列的比較以及陣列位址的計算方式
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高效生活,幫助你找回更多自己的時間 歡迎來到 AL 的 Googlesheet 學習筆記系列文章。在這個系列中,我們將一步步介紹各種函數,並將它們應用於日常生活中,加速工作、提高效率。 今天要介紹的是使用 Index 、 Counta 函數尋找最後一列的資料!
Thumbnail
高效生活,幫助你找回更多自己的時間 歡迎來到 AL 的 Googlesheet 學習筆記系列文章。在這個系列中,我們將一步步介紹各種函數,並將它們應用於日常生活中,加速工作、提高效率。 今天要介紹的是使用 Index 、 Counta 函數尋找最後一列的資料!
Thumbnail
我捨棄了編號系統,解放三倍大腦思考能量
Thumbnail
我捨棄了編號系統,解放三倍大腦思考能量
Thumbnail
演算法映射化簡的核心觀念 在面對新題目的時候,除了重頭想一個新的演算法之外; 還有另一個方法,想看看有沒有核心觀念彼此相同的問題與演算法, 如果有,就可以把新的題目映射化簡到已知解法的問題,用已知的演算法去解開。 接著,我們會介紹幾個範例,並且使用映射化簡的技巧來解題,透過化
Thumbnail
演算法映射化簡的核心觀念 在面對新題目的時候,除了重頭想一個新的演算法之外; 還有另一個方法,想看看有沒有核心觀念彼此相同的問題與演算法, 如果有,就可以把新的題目映射化簡到已知解法的問題,用已知的演算法去解開。 接著,我們會介紹幾個範例,並且使用映射化簡的技巧來解題,透過化
Thumbnail
這一集我將說明,利用「工具羅盤」的概念,搭配先前提過的「原子筆記法」,而衍生的「白板筆記法」。
Thumbnail
這一集我將說明,利用「工具羅盤」的概念,搭配先前提過的「原子筆記法」,而衍生的「白板筆記法」。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
我利用 Heptabase這套工具,參考了防彈筆記法、卡片筆記法的做法,同時結合 PARA、CODE、PDCA、GTD 的執行方式,發展出一套自己的「原子筆記」。
Thumbnail
我利用 Heptabase這套工具,參考了防彈筆記法、卡片筆記法的做法,同時結合 PARA、CODE、PDCA、GTD 的執行方式,發展出一套自己的「原子筆記」。
Thumbnail
專案分享-計算機 邏輯思維:首先,要建立幾個變數與函式,方便我們作業。接下來針對每一個函式進行解釋。 讓大家可以自己動手做一個簡易的計算機
Thumbnail
專案分享-計算機 邏輯思維:首先,要建立幾個變數與函式,方便我們作業。接下來針對每一個函式進行解釋。 讓大家可以自己動手做一個簡易的計算機
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News