摘要:小概哈希容器也可以理解為是一種映射容器,采用哈希算法映射算法,散列算法,將不定長的數據壓縮成定長的數據,這串定長值我們稱為哈希值,并將不同的哈希值分組存起來,每一個分組我們認為是一個槽我們將不同的數據格式通過哈希算法,將其映射到不同的槽內,
小概
哈希容器也可以理解為是一種映射容器,采用哈希算法(映射算法,散列算法),將不定長的數據壓縮成定長的數據,這串定長值我們稱為 哈希值,并將不同的哈希值分組存起來,每一個分組我們認為是一個 槽
我們將不同的數據格式通過哈希算法,將其映射到不同的槽內,當我們需要取數據時,把需要的數據轉化成哈希值,再憑借哈希值去找對應的槽,然后便可以將數據取出來
可以理解為一個鍵值對容器
put(key, value)
get(key)
圖解如下
并且進行以下設定
$key$ - 鍵
$h_{key}$ - 哈希值
$hash(key)$ - 哈希算法
$bucket$ - 槽
$bucketNum$ - 槽數
哈希表我們現在假設 key 為整數,用 數組 分配槽的情況,并開始討論如何設計,讓對這一容器增刪改查的時間復雜度趨近于 $O(1)$
哈希算法映射可以如下表示,下標 $n$ 代表變化的取值
$$(x_n, y_n) -> (x, y)$$
更通常的映射關系如下,并且我們在這里討論這種情況
$$(x_n, y_n) -> (0, bucketNum - 1)$$
如何將不定長的數據壓縮成定長的數據,我們主要給出以下幾種常用的方法
線性哈希:$hash(key) = a × key + b $
平方哈希:$hash(key) = sub(key^2, a, b)$,設函數 $sub(num, a, b)$ 代表取 $num$ 第 $a$ 位數到第 $b$ 位數,則
余數哈希:$hash(key) = key % a $
入槽設 $bucketNum = 4,hash(key) = key % 4$,我們現在要對一對值為 6-"6號書籍" 的鍵值對進行如下操作
hashMap.put(6, "6號書籍"); hashMap.get(6);
那么,$hash(6) = 2$,并把 "6號書籍" 存入 $bucket[2]$ 中,查詢時再取出 $bucket[h_6]$
碰撞處理我們處理$(x_n, y_n) -> (0, bucketNum - 1)$映射時,不定長的數據集可以認為是無窮大的,現在要將無限大的數據集壓縮進有限數據集內,一定會引發 碰撞,即不同的數據裝入一個槽內
解決沖突的方法有很多,我們主要給出以下幾種常用的方法:
再哈希:遇到碰撞時,將哈希值再哈希,直到無碰撞
公共溢出區:將碰撞數據存入其中
接數據結構:碰撞時,往該槽內接入其他數據結構,并把膨脹的數據存入其中,如圖解中接的就是 鏈表
性能瓶頸現在開始討論如上設計哈希表的性能問題
我們在對容器進行操作時,處理最頻繁的便是 $hash(key)$,每次存儲和查找都需要計算 $h$,所以 如何設計哈希算法 便顯得十分重要
另一個瓶頸在于,如何更加合理地分配 $ bucketNum $,能夠盡可能地減少沖突,這也是一個值得思考的方面,我們要知道雖然我們對碰撞已經進行過處理,但這步操作也會損耗相當的效率
退一步來講,假設已經出現碰撞,如何處理碰撞、碰撞的數據應當如何搜索 也非常值得我們考慮,比方說,若采用的是如圖解中的鏈表法,假設 $bucketNum = 100$,但一堆數據很不幸運地落入同一個 $bucket$ 內,那么我搜索這堆數據時,和遍歷搜索已經基本沒區別了,時間復雜度趨近與 $O(n)$
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67540.html
摘要:前言在使用加載數據數據庫常見的優化操作后端掘金一索引將放第一位,不用說,這種優化方式我們一直都在悄悄使用,那便是主鍵索引。 Redis 內存壓縮實戰 - 后端 - 掘金在討論Redis內存壓縮的時候,我們需要了解一下幾個Redis的相關知識。 壓縮列表 ziplist Redis的ziplist是用一段連續的內存來存儲列表數據的一個數據結構,它的結構示例如下圖 zlbytes: 記錄整...
摘要:本篇的上篇為源碼分析上。主體思路分析中使用的哈希函數,圍繞初始化時使用的結構體展開。這樣得到一個關于請求的首部哈希數組。源碼中大多數的代碼是跟預估表大小相關的。的哈希表的核心是表的管理結構體數組及表內存空間分配。 本篇的上篇為 Nginx 源碼分析:ngx_hash_t(上)。 建議先讀完上篇再來讀下篇。 上篇回顧了hash表的基礎概念,分析了Nginx中hash表的內存模型及邏輯...
閱讀 3532·2021-10-09 09:41
閱讀 2739·2021-10-08 10:18
閱讀 2174·2021-09-10 10:51
閱讀 2674·2021-09-10 10:50
閱讀 771·2021-09-09 09:33
閱讀 3377·2021-09-06 15:14
閱讀 3011·2019-08-30 11:06
閱讀 3242·2019-08-29 14:04