幾分鐘理解 資料結構 雜湊表及其優化

2021-09-16 19:10:45 字數 1125 閱讀 8367

雜湊容器也可以理解為是一種對映容器,採用雜湊演算法(對映演算法,雜湊演算法),將不定長的資料壓縮成定長的資料,這串定長值我們稱為雜湊值,並將不同的雜湊值分組存起來,每乙個分組我們認為是乙個

我們將不同的資料格式通過雜湊演算法,將其對映到不同的槽內,當我們需要取資料時,把需要的資料轉化成雜湊值,再憑藉雜湊值去找對應的槽,然後便可以將資料取出來

可以理解為乙個鍵值對容器

**如下

並且進行以下設定

我們現在假設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)$對映時,不定長的資料集可以認為是無窮大的,現在要將無限大的資料集壓縮進有限資料集內,一定會引發碰撞,即不同的資料裝入乙個槽內

解決衝突的方法有很多,我們主要給出以下幾種常用的方法:

現在開始討論如上設計雜湊表的效能問題

資料結構 雜湊表理解與實現

一 雜湊表的簡介 1 在我們c 11中的unordered set unordered map以及unordered multiset unordered multimap底層最主要的實現就是雜湊表 而雜湊表則是通過關鍵字 key 按照一定的規律對映到表中的位置。2 最常用構造雜湊表的方法 1 直接...

資料結構 雜湊表及其模擬實現

直接定址法 hashfunc date a date b a,b為常數 從雜湊衝突的位置,找下乙個空餘位置插入元素。尋找方式有兩種,線性探測和二次探測。直接向後 1查詢。h i h0 i 2 或者h i h0 i 2 de需要的原因,此位置不可以插入元素,也不可設定為em 查詢時遇em就停止了,可能...

資料結構例程 雜湊表及其運算的實現

本文是 資料結構基礎系列 8 查詢 中第11課時 雜湊表 雜湊結構 和第12課時 雜湊表的運算 的例程。define maxsize 100 定義最大雜湊表長度 define nullkey 1 定義空關鍵字值 define delkey 2 定義被刪關鍵字值 typedef int keytype...