問題:
1. hash演算法主表實現為什麼不直接用陣列,而使用malloc動態申請?
2. 另外每個桶的使用 線性佇列 和 雙向佇列 以及 二級hash的區別以及好處是什麼?
答案:1.
1)hash表大小如果是固定的,當然可以採用陣列;
struct hash_head *hash_list[1024];
2)如果hash大小沒有確定,在程式中動態變化的,那就需要使用malloc動態申請。
int hash_size = get_hash_size();
struct hash_head **hash_list;
*hash = malloc(hash_size);
memset(*hash, 0, hash_size);
2. 線性鍊錶只能單相查詢結點,即知道乙個已知結點,不能找到它的前驅。
雙向鍊錶可以向前向後二個方向查詢結點。
還有雙向迴圈鍊錶,我在專案中用的比較多。直接用核心裡扒下來用的。
二級hash我到覺的沒什麼必要。使結構太複雜。可以用一級hash來代替。設計好hash演算法就行了。
問題:3.
1)已知乙個線性表(38,25,74,63,52,48),採用的雜湊函式為h(key)=key%7,將元素雜湊到表長為7的雜湊表中儲存。若採用線性探測的開放定址法解決衝突,則在該雜湊表上進行等概率成功查詢的平均查詢長度為 ____ ;
2)若利用拉鍊法解決衝突,則在該雜湊表上進行等概率成功查詢的平均查詢長度為 ____;
答案:1)11/6 ,2)8/6.對於1)中,答案給出的是12/6=2,經過驗證是錯誤的。
分析過程:
1)採用開放定址法
key3825
7463
5248
位址3 44
036解決衝突過程
54 5 6
7查詢次數11
2142
平均查詢長度:(1*3+2*2+4)/6=11/6
2)採用拉鍊法 拉鍊
鍊錶中元素
查詢次數063
1338 52
38(1次) 52(2次)
425 74
25(1次) 74(2次)648
1 平均查詢長度(1*4+2*2)/6=4/3
4.設一雜湊表長為13,採用線性探測法解決衝突,雜湊函式h(key)=key%13
1 )畫出在空表中依次插入關鍵字25.20.36.15.41.52.29.72.67後的雜湊表
2 )求在等概率情況下,查詢成功和查詢不成功的平均查詢長度
答案:
1)hash表
hash表下標(位址)01
2345
6789
1011
12hash表元素
5215
4129
6720
7236
25解決衝突過程
2 33 4
2 3 4 5
7 8查詢次數11
2241
211
2)查詢成功的平均查詢長度:(1*5 +2*3 +4*1)/9 = 15/9 。查詢成功的平均查詢長度為sum(查詢次數)/sum(元素個數)
3) 查詢失敗的平均查詢長度
計算長度為m的雜湊表中裝填有n個記錄的查詢不成功時的平均查詢長度相當於計算在這張表中填入第n+1個記錄時所需要的比較次數的期望值。
第n+1個記錄可能是0~12
若 n+1個記錄是0,由於位置0已經被占用,位置1沒有占用,所以比較2次,依次類推。
hash表下標01
2345
6789
1011
12hash表元素
5215
4129
6720
7236
25解決衝突過程
2 33 4
2 3 4 5
7 8查詢次數11
2241
211查詢不成功21
5432
1321
213
故查詢不成功的平均查詢長度為(2+1+5+4+3+2+1+1+2+2+1+2+1+3)/13=30/13
5.將關鍵字序列(7、8、30、11、18、9、14)雜湊儲存到雜湊表中。雜湊表的儲存空間是乙個下標從0開始的一維陣列,雜湊函式為: h(key) = (keyx3) mod 7,處理衝突採用線性探測再雜湊法,要求裝填(載)因子為0.7。
(1) 請畫出所構造的雜湊表。
(2) 分別計算等概率情況下查詢成功和查詢不成功的平均查詢長度。
答案:(1)
(2)查詢成功的平均查詢長度
(表3)
所以aslsuccess= (1+1+1+1+3+3+2)/ 7 = 12/7
查詢不成功的平均查詢長度
計算查詢不成功的次數就直接找關鍵字到第乙個位址上關鍵字為空的距離即可, 但根據雜湊函式位址為mod7,因此初始只可能在0~6的位置
因此查詢不成功的次數表如下表所示
(表4)
所以aslunsuccess= (3+2+1+2+1+5+4)/ 7 = 18/7。
參考文獻
資料結構 hash
雜湊表 hash table,也叫雜湊表 是根據鍵 key 而直接訪問在記憶體儲存位置的資料結構。分為兩個步驟 hash函式 通過乙個關於鍵值的hash函式,得到所查詢的資料對映到表中乙個位置。訪問資料 不同的key 經過hash函式 可能計算得到相同的輸出。此時叫做衝突,衝突的資料又成乙個表。一般...
資料結構基礎 字串Hash
取一固定值p,把字串看作p進製數,並分配乙個大於0的數值,代表每種字元。一般般來說,我們分配的數值都遠小於p。例如,對於小寫字母構成的字串,可以令a 1,b 2,z 26。取一固定值m,求出該p進製數對m的餘數,作為該字串的hash值。字串hash函式把乙個任意長度的字串對映成一乙個非負整數,並且其...
《資料結構與演算法》《基礎》Hash雜湊
1.hash的基本原理 總共有m 1個桶,hash key 指向乙個特定的桶。2.hash function雜湊函式 略3.雜湊衝突及解決 閉合定址 closed addressing linked list chaining 每個桶存放乙個指標,衝突的詞條組織成列表。新進來的插在第乙個和第二個之間...