資結筆記|雜湊表(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
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
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 的執行方式,發展出一套自己的「原子筆記」。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News