Hash函式與取模運算

2021-05-22 11:04:37 字數 1626 閱讀 4197

1.

hash 函式

雜湊表也稱雜湊表

,是一種資料結構

,它可以提供快速的插入操作和查詢操作

,不論有多少資料項

,插入與刪除只需要接近常量的時間

:o(1)

時間級。但雜湊表也有缺點

,它是基於陣列的

,陣列一旦被建立

,就難以擴充套件

。某些雜湊表被填滿時

,效能急劇下降

。,所以程式設計師必須清楚表中要儲存多少資料。

雜湊表操作的平均時間是基於統計特性而不是隨機輸入的期望值。

雜湊表的重要特性就是雜湊函式。

我們用乙個將大數

(或解釋為數的字串

)對映成乙個較小的

,更容易管理的數的函式來達到這個目的

。將乙個項對映成乙個較小的下標的函式稱為雜湊函式。

需要雜湊函式

,是因為雜湊表是基於陣列的

,而且關鍵字值的範圍通常比陣列容量大

。,關鍵字值通過雜湊函式對映為陣列的下標

雜湊函式一般是通過取模運算來實現(

key = tag % constant)

,這就是乙個簡單的雜湊函式

。但也帶來了不可避免的麻煩

:兩個或更多的不同項可能被雜湊到同乙個位置

,引起衝突。

2. 減少衝突

2.1. 開放位址法

開放位址法

: 讓指定的陣列大小兩倍於需要儲存的資料量。因此,可能一半的單元是空的。當衝突發生時,乙個方法是通過系統的方法找到陣列的乙個空位,並把這個資料填入,而不再用雜湊函式得到的陣列下標。

在開放位址法中如果資料不能直接放在由雜湊函式中,就得尋找空白位置,其中簡單的三種探索方法。

線性探索法

,二次探索法

,再雜湊法。

2.2. 鏈位址法

鏈位址法

:建立乙個存放資料鍊錶的陣列,陣列內不直接儲存資料。這樣,當發生衝突的時候,新的資料項直接接到這個陣列下標所指的鍊錶中。

在鏈位址法中

,資料項的關鍵字值還是對映到陣列下標

,而資料本身儲存在每個單

元的鍊錶中。

當然如果鍊錶中有許多項

,訪問時間變長

,找到初始單元的時間為

o(1)

,而搜尋鍊錶的時間與鍊錶中的資料項數目

m成正比,為

o(m)

。因此並不希望鍊錶太滿。

3. 經驗

專家發現以下雜湊函式形式很好:

key = (tag % constant )

其中constant

為質數,

並且小於雜湊表容量

。這樣雜湊值就分布的比較均勻,效率就不會受影響。

3. 開源專案雜湊實現

hashtable.h

hashtable.c

整除運算與取模運算

凡是呈現明顯週期性的,比如十二生肖 以十二為週期 比如星期 以 7 為週期 比如天乾 以 10 為週期 比如地支 以 12 為週期 最佳的解決方案就是取模 或者簡單地說對該週期取餘數 在 c語言的環境下,將乙個整數對 2 不斷地做整除 也即除了 0 1 之外的任何正整數,不論是奇數還是偶數,不斷地對...

辨析取模運算與取餘運算

通常情況下,取模運算 mod 和取餘運算 rem 被混為一談,因為在大多數的程式語言裡,都用 符號來表示取模運算或者取餘運算。所以有必要編寫本文件,來為在此環節遇到問題的程式設計師理清思路,同時也提醒各位需要注意在不同程式語言環境下 運算子的具體意義,因為在有負數存在的情況下,兩者的結果是不一樣的。...

大數取模運算

問題分析 1 大數儲存 由於x的位數最大為400位,我們不能用現有的int,long,long long,double等資料型別進行儲存。一般儲存大數的方法是用乙個字串來表示。2 取模運算 模擬手算豎式的方法。用x從高到低的每一位加上前一位餘數 10來對bi進行 最後得到的結果就是x bi的結果。利...