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的結果。利...