雜湊表的概念:
雜湊,又叫做雜湊表,是把任意長度的輸入(又叫做預對映pre-image)通過雜湊演算法變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來確定唯一的輸入值。簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。
雜湊兩大重點:雜湊對映(也就是確定雜湊位址的函式):y(x)=f(x);
比如y(x)=x;這是直接取址法;
雜湊位址不是真正意義上的位址,是抽象的參照位址
一般用的比較多的建構函式是取餘法:
y=x%p
例如:資料: 1 4 11 19 23
int array [10]
1%10=1;
4%10=4;
11%10=1;
19%10=9;
23%10=3;
這些餘數就是要存到陣列的下標;
這就是雜湊對映的主要內容,但是可以看到11和1的雜湊位址發生了重疊,也就是儲存的會有問題
這就叫做雜湊衝突
發生了雜湊衝突,那我們就需要來解決這個雜湊衝突,這叫做雜湊衝突解決方案:
第一種方法是開放位址法:
看下面這個圖:
就是如果發生衝突,就往左或者往右找空餘的位置進行插入,這就是開放位址法,也是我們陣列實現的主要方式。
一般雜湊位址的個數是大於元素個數的,這樣方便使用這樣的開放位址法
第二種方案是採用陣列鍊錶的方式,也就是圖內容裡面的鄰接表法
在衝突的位置上新增鍊錶
看下圖了解一下即可:
還有一種是有序鍊錶來實現,叫做跳表
這種辦法我單獨寫個部落格,這裡我先只用陣列雜湊
雜湊的應用,有一種演算法叫做lzw,有興趣的小夥伴可以去看看,是一種壓縮演算法,還有,雜湊表的key也可以是字串,需要自己設計字串的雜湊對映,構建函式來自己實現。
下面是我的c語言**實現整數關鍵字的雜湊表:
首先是hash儲存要的需要對映的鍵值,還有要儲存的資料,封裝成結構體二元組:
接下來是hash表的結構體封裝:struct pair
;
struct hashtable
;
插入的函式:int
search
(struct hashtable* hash,
int first)
}while
(curpos=
(curpos +1)
% hash->div)
;//當沒有找到,就往下走更改curpos的值
return curpos;
//轉了一圈沒有找到返回現在的值,也就是表滿的情況
}
那麼現在的主體函式已經完成了,下面是驗證的時刻,我們先做乙個列印的函式:void
inserthash
(struct hashtable* hash,
struct pair data)
else
else
}}
下面是主函式驗證:void
(struct hashtable* hash)
else
}}
int
main()
,,,,
};for(
int i =
0; i <
5; i++
(hash)
;inserthash
(hash,);
//驗證位址衝突的處理
inserthash
(hash,);
inserthash
(hash,);
inserthash
(hash,);
inserthash
(hash,);
(hash)
;inserthash
(hash,);
//驗證表滿的處理
(hash)
;return0;
}
資料結構之雜湊表(雜湊表)
今天學的是資料結構的雜湊查詢篇,其他的查詢可參見以前的傳送門 以前的查詢都是基於比較關鍵字的基礎上,所以查詢的效率依賴於查詢過程中所進行的比較次數。理想的情況是不經過任何比較,通過計算就能直接得到記錄所在的儲存位址,雜湊查詢 hashed search 是基於上述思想的一種查詢方式。雜湊法又稱為雜湊...
資料結構之雜湊表
雜湊表和雜湊化有乙個重要的概念是如何把關鍵字轉換成陣列下標,在雜湊表中這個轉換是通過雜湊函式來完成的。比如規定乙個單詞含有4個字元,對於單詞cats,我們採用 冪的連乘 的方式將乙個單詞對映成數字。因為有27個可能的字元,包括空格,所以冪採用27,則cats的數字下標是3 27 3 1 27 2 2...
資料結構之雜湊表
wikipedia上的解釋 下圖示意了雜湊表 hash table 這種資料結構。雜湊表 如上圖所示,首先分配乙個指標陣列,陣列的每個元素是乙個鍊錶的頭指標,每個鍊錶稱為乙個槽 slot 哪個資料應該放入哪個槽中由雜湊函式決定,在這個例子中我們簡單地選取雜湊函式h x x 11,這樣任意資料x都可以...