雜湊表(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。
對不同的關鍵字可能得到同一雜湊位址,即k1≠k2,而f(k1)=f(k2),這種現象稱為碰撞(英語:collision)。具有相同函式值的關鍵字對該雜湊函式來說稱做同義詞。綜上所述,根據雜湊函式f(k)和處理碰撞的方法將一組關鍵字對映到乙個有限的連續的位址集(區間)上,並以關鍵字在位址集中的「像」作為記錄在表中的儲存位置,這種表便稱為雜湊表,這一對映過程稱為雜湊造表或雜湊,所得的儲存位置稱雜湊位址。
(1)直接定址法
取關鍵字的某個線性函式為雜湊位址,hash(key)= key 或 hash(key)= a*key + b,a、b為常數。
(2)除數留餘法
設雜湊表中允許的位址數為m,取乙個不大於m,但接近或者等於m的質數p作為除數,按照雜湊函式:hash(key) = key mod p p<=m,將關鍵碼轉換成雜湊位址。對p的選擇很重要,一般取素數或m,若p選的不好,容易產生同義詞。
(3)平方取中法
平方後取中間的,每位包含資訊比較多。假設關鍵字是1234,那麼它的平方就是1522756,再抽取中間的3位就是227作為雜湊位址;再比如關鍵字是4321,那麼它的平方就是18671041,抽取中間的3位就可以是671或者710用作雜湊位址。
(4)摺疊法
有時關鍵碼所含的位數很多,採用平方取中法計算太複雜,則可將關鍵碼分割成位數相同的幾部分(最後一部分的位數可以不同),然後取這幾部分的疊加和(捨去進製)作為雜湊位址,這方法稱為摺疊法。
比如:關鍵字是9876543210,雜湊表表長為三位,我們將它分成四組987|654|321|0|,然後將它們疊加求和987+654+321+0=1962,再求後3位得到雜湊位址為962。有時可能這還不能夠保證分布均勻,不妨從一段向另一端來回摺疊後對齊相加。比如將987和321反轉,再與654和0相加,程式設計789+654+123+0=1566,此時的雜湊位址為566。
解決衝突的技術可以分為兩類:開雜湊方法(open hashing,也稱單鏈方法,separate chaining)和閉雜湊方法(closed hashing,也稱開位址方法,open addressing)。開雜湊方法解決衝突是將衝突記錄在表外,而閉雜湊方法是將衝突記錄在表內的另乙個空槽。
(1)開雜湊方法:運用單鏈表儲存方式,不產生堆積現象,但因為附加了指標域而增加了空間開銷。
**如下:
function hashtable()
function put(key,data)
this.table[pos][index]=data;
}function get(key)else
return this.table[pos][index]; }}
//容易發生碰撞
function ******hash(data)
function put(key,data)
this.table[pos]=key;
this.values[pos]=data;
}function get(key)else
return this.values[pos]; }}
//使用霍納演算法的雜湊函式
function betterhash(string){
const h=37;
let total=0;
for(let i=0;i
第八章 指標 第八章 指標
1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...
第八章(筆記)
能在 中進行記憶體單元的定址的暫存器只有4個,分別是bx si di bp 其中bx bp 是基址,bx對應的段位址是ds,bp對應的段位址是ss si di 是變址,單獨使用時段位址是ds,組合使用段位址是跟隨組合的基址對應的段位址 中進行記憶體單元定址彙總 si di bx bp 常量 si 常...
第八章 字典
d 空字典 d 這就是字典 d dict.fromkeys a b d dict zip keyslist,valslist d dict name bob age 22 建立字典的函式 d name 通過索引key獲取對應的value d.keys 返回d字典物件所有key,返回乙個列表 d.va...