搜尋結構 雜湊

2021-09-10 16:40:02 字數 988 閱讀 4547

雜湊函式設計:(1)直接定製法(2)除留餘數法(3)數學分析發

雜湊衝突乙個可能原因就是雜湊函式設計不合理;如果雜湊函式設計巧妙,雜湊衝突可能性越低,但是不能夠避免雜湊衝突。

雜湊衝突的處理:閉雜湊和開雜湊

閉雜湊閉雜湊也叫開放位址法,當發生雜湊衝突時,如果雜湊表未被裝滿,說明雜湊表中還有空位置,那麼可以吧key衝放到雜湊表中下乙個空位置去。如何尋找下乙個空位置?(1)線性探測(2)二次探測。採用閉雜湊處理雜湊衝突不可以直接刪除元素,如果直接刪除可能導致後續元素找不到,所以我們設定雜湊表三種狀態分別為空、已刪除、有元素。刪除元素只是更改狀態,而不是真正刪除該元素。

採用線性探測優點實現起來簡單,缺點:一旦發生雜湊衝突可能導致所有衝突連在一塊,容易產生資料堆積,所以查詢效率降低,那麼如何緩解?負載因子

雜湊表的載荷因子 = 填入表中元素個數/雜湊表長度

上述公式,可以看出雜湊表長度一定,載荷因子和表中元素個數成正比。所以載荷因子越大,表中元素個數越多,衝突可能性大。所以科學研究決定載荷因子因該嚴格限制在0.7—0.8,超過需要擴容以降低雜湊衝突。

線性探測是1、2、3、、、二次探測是1^2、2^2、3^2、、、

開雜湊開雜湊也叫鏈位址法,關鍵碼通過雜湊函式得到雜湊位址,具有相同的雜湊位址歸為一類,每一類通過單鏈表連線,煉表頭結點儲存在雜湊表中。

開雜湊增加了指標開銷,但是閉雜湊需要大量的空閒空間保證效率,所以總的來說開雜湊反而比閉雜湊節省空間。

雜湊部分常見兩種模型:(1)key模型:判斷key存在與否(2)key—value模型:通過key得到對應的value

雜湊搜尋結果應用:

key:(1)判斷乙個單詞拼寫是否正確(2)判斷乙個網名是否被使用過

//字串轉雜湊演算法

static size_t bkdrhash(const char * str) 

return (hash & 0x7fffffff);

}

雜湊搜尋(多次探測,雜湊桶)

為什麼提出雜湊?順序搜尋和二叉樹搜尋中,元素儲存位置和元素關鍵碼之間沒有聯絡。因此在查詢乙個資料時,必須經過關鍵碼的多次比較,搜尋效率取決於比較次數。而乙個理想的搜尋是不經過比較,直接拿出資料,建立關鍵碼和儲存位置的關係。雜湊衝突的產生與解決 不同的關鍵碼通過相同的雜湊函式計算出相同的位址,產生衝突...

unordered map,雜湊結構

c 11中新增4個unordered系列關聯式容器 unordered map說明 unordered map的容量 函式宣告 功能介紹 bool empty const 檢測unordered map是否為空 size t size 獲取unordered map的有效元素個數 unordered...

c 雜湊結構

雜湊表查詢演算法 hash include include define true 1 define false 0 define hashsize 7 define nullkey 32768 無效索引 typedef int status int m 0 雜湊表表長 typedef struct...