乘法雜湊表的分析

2021-09-08 16:53:05 字數 3354 閱讀 8457

構造乘法雜湊表的乘法方法包含了兩個步驟:

1. 用關鍵字 k 乘上常數 a (02. 然後再用 m 乘以這個值,再向下去整

總之雜湊函式為:

h(k) = |_ (m*(k*amod1)) _|

這裡對m沒有太大的要求,一般選擇他為2的某個冪次方( m 的取值規定了hash的長度)

knuth提出 a 的最佳選擇為 a ≈ (√5-1)/2 = 0.618 033 988 7....

這裡引出了我對這個 a 的值的思考。於是我寫了程式來對 a 的選擇做了測試。

首先我以 a= 這些數字做了測試,並且m的取值為1000。

從而得出以下的結果:

case 1000:

a:0.010000 num:0

a:0.020000 num:49

a:0.030000 num:0

a:0.040000 num:74

a:0.050000 num:79

a:0.060000 num:50

a:0.070000 num:0

a:0.080000 num:74

a:0.090000 num:0

a:0.100000 num:89

a:0.110000 num:0

a:0.120000 num:74

a:0.130000 num:0

a:0.140000 num:49

a:0.150000 num:79

a:0.160000 num:74

a:0.170000 num:0

a:0.180000 num:50

a:0.190000 num:0

a:0.200000 num:95

a:0.210000 num:0

a:0.220000 num:50

a:0.230000 num:0

a:0.240000 num:75

a:0.250000 num:96

a:0.260000 num:50

a:0.270000 num:0

a:0.280000 num:75

a:0.290000 num:0

a:0.300000 num:90

a:0.310000 num:0

a:0.320000 num:75

a:0.330000 num:0

a:0.340000 num:50

a:0.350000 num:80

a:0.360000 num:75

a:0.370000 num:0

a:0.380000 num:50

a:0.390000 num:0

a:0.400000 num:95

a:0.410000 num:0

a:0.420000 num:50

a:0.430000 num:0

a:0.440000 num:75

a:0.450000 num:80

a:0.460000 num:50

a:0.470000 num:0

a:0.480000 num:75

a:0.490000 num:0

a:0.500000 num:98

a:0.510000 num:0

a:0.520000 num:75

a:0.530000 num:0

a:0.540000 num:50

a:0.550000 num:80

a:0.560000 num:75

a:0.570000 num:0

a:0.580000 num:50

a:0.590000 num:0

a:0.600000 num:95

a:0.610000 num:0

a:0.620000 num:50

a:0.630000 num:0

a:0.640000 num:75

a:0.650000 num:80

a:0.660000 num:50

a:0.670000 num:0

a:0.680000 num:75

a:0.690000 num:0

a:0.700000 num:90

a:0.710000 num:0

a:0.720000 num:75

a:0.730000 num:0

a:0.740000 num:50

a:0.750000 num:96

a:0.760000 num:75

a:0.770000 num:0

a:0.780000 num:50

a:0.790000 num:0

a:0.800000 num:95

a:0.810000 num:0

a:0.820000 num:50

a:0.830000 num:0

a:0.840000 num:75

a:0.850000 num:80

a:0.860000 num:50

a:0.870000 num:0

a:0.880000 num:75

a:0.890000 num:0

a:0.900000 num:90

a:0.910000 num:0

a:0.920000 num:75

a:0.930000 num:0

a:0.940000 num:50

a:0.950000 num:80

a:0.960000 num:75

a:0.970000 num:0

a:0.980000 num:50

a:0.990000 num:0

這裡 hash 長度是1000,插入數字為 0~100, num 表示碰撞次數,可以看到乙個明顯的現象:對於a的末尾為奇數時,大部分均有很低的概率發生碰撞,而當為偶數的時候碰撞次數均很大,而且很多均是 50 或者是 75。

分析發現,這裡和末尾那個偶數有關,因為這裡是兩位小數,乘數是10x 級,所以只要是偶數,當對 1 取模後就必然會和前面某個數重複。

例如:a = 0.22 時, k = 1 和 k = 51結果是一樣的,均為 0.2 ,那麼自然就會發生重複了。

之後我又進行更改,hash長度仍是 1000,但是插入資料也是1000個,即是全部插入,a 每次遞增 0.001 結果發現在碰撞次數低的依舊很多

當我將a每次遞增改為0.000 001 ,我等了10多分鐘都沒跑完。。。。最後強行終止了,開啟檔案後發現這裡面碰撞次數低的依舊還是很多,由此可見,a值的選取方式是很多的,取**分割比只是乙個建議~

乘法雜湊表的分析

構造乘法雜湊表的乘法方法包含了兩個步驟 1.用關鍵字 k 乘上常數 a 02.然後再用 m 乘以這個值,再向下去整 總之雜湊函式為 h k m k amod1 這裡對m沒有太大的要求,一般選擇他為2的某個冪次方 m 的取值規定了hash的長度 knuth提出 a 的最佳選擇為 a 5 1 2 0.6...

雜湊表查詢的效能分析

雜湊表的查詢過程基本上和造表過程相同。一些關鍵字可通過雜湊函式轉換的位址直接找到,另一些關鍵字在雜湊函式得到的位址上產生了衝突,需要按處理衝突的方法進行查詢。在處理衝突的方法中,產生衝突後的查詢仍然是給定值與關鍵碼進行比較的過程。所以,對雜湊表查詢效率的量度,依然用平均查詢長度來衡量。查詢過程中,關...

雜湊表(雜湊表)的定義

chapter 雜湊表 雜湊表 1.雜湊表 雜湊表 的定義 2.雜湊表是怎麼進行查詢的?3.雜湊函式設計 直接定址法 4.雜湊函式設計 除留餘數法 5.雜湊衝突處理 開放定址法 6.雜湊衝突處理 鏈位址法 7.雜湊表的鏈位址法實現 8.linux核心中的hash與bucket 9.引入雜湊桶的概念來...