哈希表

哈希表數組

使用哈希函數插入數據的數組叫哈希表函數

哈希化性能

把一個大範圍的數字轉化成一個小範圍的數字叫哈希化編碼

哈希函數spa

把一個大範圍的數字轉化成一個小範圍的數字的函數叫哈希函數設計

把關鍵字轉化爲數組下標內存

一、關鍵字不須要轉換,好比員工編號從0到1000,關鍵字員工編號能夠直接作爲數組下標效率

二、關鍵字須要轉換,把一部英文字典裝入哈希表,a是1,b是2,c是3,依此類推,z是26,還有空格是0擴展

1)數字相加 cats=3+1+20+19=43
假設單詞最長有10個字母組成a的編碼是1,zzzzzzzzzz是26*10=260,這樣單詞編碼的範圍是從1到260。不幸的是,字典中一共有50000個單詞。數組下標太少,每一個數組元素大概要存儲50000/260=192個單詞。搜索

2)冪的連乘
7564= 7*10+ 5*10+ 6*101  +  4*100
cats=  3*27+ 1*10+ 20*101+ 19*100
這樣每一個單詞對應獨一無二的一個數字
最長的10個字母的單詞zzzzzzzzzz,將轉化成26*279+26*278+26*277+26*276+26*275+26*274+26*273+26*272+26*271+26*270
僅279就超過7000000000000,結果很是巨大,內存中的數組根本不可能有這麼多的單元,產生的數組下標太多

3)哈希函數

取餘法:index = x / arrayLength

哈希化後的衝突

一、開放地址法

指望的數組平均起來,每兩個數組單元,有一個單詞;有些單元沒有單詞,而有些單元有多個單詞。因此設計數組大小應該兩倍於須要存儲的數據量,這樣可能一半的單元是空的,衝突後,找到數組的一個空位並填入。

1)線性探測:+1,+2,+3,+4

裝填因子是二分之一或三分之二時,哈希表的性能最好;裝填因子接近1時,哈希表效率很是低。一連串已填充的單元愈來愈長,叫彙集,大塊的彙集下降了哈希表的效率。

2)二次探測:+1,+4,+9,+16

3)再哈希法

二次探測的問題,產生的步長老是固定的一、四、九、16...,再哈希法不一樣的關鍵字使用不一樣的步長
再哈希法函數必須具有的特色:一、和第一個哈希函數不一樣。二、不能獲得0,不然老是原地踏步
一個再哈希函數:stepSize = constant - ( key % constant ),constant是質數且小於數組容量
裝填因子是9/10或更大,大多數數據項仍是能一次哈希函數找到

再哈希法和二次探測要求數組容量是一個質數,不然會形成死循環

二、鏈地址法

當裝填因子是1時,大約三分之一的單元是空白單元,三分之一的單元有一個數據項,三分之一的單元有兩個或更多的數據項。

鏈地址法裝填因子能夠達到1以上,對性能影響並不大;找到初始單元須要O(1)的時間級,搜索鏈表的時間與鏈表的平均數據項成正比。

表容量不像在再哈希法和二次探測中顯得那麼重要,鏈地址法不須要探測,不會出現死循環;但當表容量不是質數時,仍是可以致使彙集

哈希表優缺點

優勢:
哈希表的速度明顯比樹快。插入、查找、刪除時間複雜度接近O(1)。

缺點:基於數組,難於擴展。哈希函數根據數組大小計算數據項的位置,因此在擴展哈希表時,不能簡單地從一個數組向另外一個數組拷貝數據;須要順序遍歷舊數組,從新計算數據項的下標,再插入新數組不能以任何一種順序遍歷數據某些哈希表被基本填滿時,性能降低得很是嚴重

相關文章
相關標籤/搜索