MySQL中哈希表

也稱爲散列表 由直接尋址表改進而來.先看直接尋址表 當關鍵字的全域U比較小時,直接尋址是一種簡單而有效的技術。加入某應用要用到一個動態集合,其中每一個元素都有一個取自全域U={0,1,...,m-1}的關鍵字。同時假設沒有兩個元素具備相同的關鍵字算法

用一個數組(即直接尋址表)T[0...m-1]表示動態集合,其中每一個位置(或稱槽或桶)對應全域U中的一個關鍵字。圖5-38說明了這個問題。槽K指向集合的一個關鍵字爲k的元素。若是該集合沒有關鍵字k的元素,則T【k】=NULL數據庫

直接尋址存在一個很明顯的問題。若是域U很大,在一臺典型計算機的可用容量的限制下,要在機器中存儲大小爲U的一張表T就有點不太實際,甚至不太可能。若是實際要存儲的關鍵字集合K相對U來講很小,那麼分配給T的大部分空間都要浪費掉

所以,哈希表出現了,在哈希方式下,該元素處於h(k)中,即利用哈希函數h,根據關鍵字k計算出槽的位置,函數h將關鍵字域U映射到哈希表T[0...m-1]的槽位中,若是5-39所示數組

哈希表技術很好的解決了直接尋址遇到的問題。可是這樣仍是有個小問題。如圖5-39中所示兩個關鍵字可能映射到同一個槽上。通常將這種狀況稱之爲發生了碰撞。在數據庫總通常採用最簡單的碰撞解決技術,這種技術被稱爲連接法函數

在連接法中,把散列到同一槽中的全部元素都放在一個鏈表中,若是5-40所示,槽j中有一個指針,它指向全部散列到j的元素構成鏈表的頭。若是不存在這樣的元素,那麼j爲NULL3d

最後要考慮的是哈希函數,哈希函數h必須能夠很好的散列,最好的狀況是能避免碰撞發的發生。即便不能避免,也應該使碰撞在最小的成都下產生。通常來講,都將關鍵字轉換成天然數,而後經過除法散列、乘法散列或全域散列來實現。數據庫中通常採用觸發散列的方法指針

在哈希函數的除法散列算法中,經過取k除於m的餘數,將關鍵字k映射到m個槽的某一個去,即哈希函數爲code

h(k)=k mode mblog

相關文章
相關標籤/搜索