關於解決Hash衝突的線性探測開放位址法和拉鍊法

2021-08-25 02:55:47 字數 1359 閱讀 6722

在實際應用中,無論如何構造雜湊函式,衝突是無法完全避免的。

鏈位址法解決衝突的做法是:如果雜湊表空間為 0 ~ m - 1 ,設定乙個由 m 個指標分量組成的一維陣列 st[ m ], 凡雜湊位址為 i 的資料元素都插入到頭指標為 st[ i ] 的鍊錶中。這種方法有點近似於鄰接表的基本思想,且這種方法適合於衝突比較嚴重的情況。

鏈位址法解決衝突的雜湊表如下圖所示。

通過雜湊演算法,變換成固定長度的輸出;

雜湊值的空間通常遠小於輸入的空間, 不同的輸入可能會雜湊成相同的輸出,

而不可能從雜湊值來唯一的確定輸入值

一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式 hash主要用於

資訊保安領域中加密演算法,一些不同長度的資訊轉化成雜亂的128位的編碼,hash值

雜湊表長度該定義多大:

一般採用雜湊演算法的時候,雜湊表的長度設為多大?有什麼依據?

越長碰撞越少,但耗得資源也就多了

最大的出發點就是沒有衝突

雜湊就是雜湊,雜湊就是把關鍵字分布均勻撒到到每乙個桶內,雜湊表越長,雜湊函式越好,自然查詢效率就越高.

雜湊表長度定義舉例說明:

比如說要處理的資料集合有100,000個,每一項的資料占用記憶體約為50bytes,我的雜湊表的長度在多大比較合適?

hash表裡面存指標,表長整成資料集合的10倍,100000*4*10 也就是4mb記憶體

空間換時間(越長碰撞越少,記憶體消耗越多,查詢和插入速率越接近o(1))

一萬,一千萬,一億資料需要多少空間:

1萬資料,1個資料1byte

1,0000 -> 10,000 大約10kb

1千萬資料,1個資料1byte

1000,0000 -> 10,000,000 大約10m

1億資料,1個資料1byte

10000,0000 -> 100,000,000 大約100m

10億資料,1個資料1byte

10,0000,0000 -> 1,000,000,000 大約1g

1byte = 8bit 表示最大數值 2^8 = 256

2byte = 2*8bit 表示最大數值 2^16 = 65536 = 6,5536(約6千) = 65,536

4byte = 4*8bit 表示最大數值 2^32 = 4294967296 = 42,9496,7296(約42億) = 4,294,967,296

32位機器,位址4個位元組表示,定址就是42,9496,7296(約42億),所以記憶體最多可以用4g,但不是所有位址都用於記憶體,所以記憶體最大支援會小於4g。

線性探測解決hash衝突

我們來簡單的例子說明什麼是線性探測 假設我們有乙個陣列 假設我們用當前公式計算當前資料在陣列中的下標位置 int i num 11 假設我們有一組資料需要放置在陣列中 那麼他們對應的下標位置應該分別為 資料 1 下標 1 11 1 資料 2 下標 2 11 2 資料 3 下標 3 11 3 資料 1...

hash解決衝突之 平方探測

資料結構實驗之查詢五 平方之雜湊表 time limit 400ms memory limit 65536k 有疑問?點這裡 題目描述 給定的一組無重複資料的正整數,根據給定的雜湊函式建立其對應hash表,雜湊函式是h key key p,p是雜湊表表長,p是素數,處理衝突的方法採用平方探測方法,增...

hash解決衝突之 平方探測

資料結構實驗之查詢五 平方之雜湊表 time limit 400ms memory limit 65536k 有疑問?點這裡 題目描述 給定的一組無重複資料的正整數,根據給定的雜湊函式建立其對應hash表,雜湊函式是h key key p,p是雜湊表表長,p是素數,處理衝突的方法採用平方探測方法,增...