全域哈希和徹底哈希——麻省理工算法導論公開課

公開課地址:html

http://open.163.com/movie/2010/12/3/A/M6UTT5U0I_M6V2TGI3A.htmldom

全域哈希函數

誕生:性能

哈希的根本缺陷:對於任意哈希函數而言,都存在一個很差的健集,使得全部的健都會哈希到同一個槽裏去,那麼如何解決這種狀況呢?如何防止對某個鍵集永遠有較差的表現?如何防止競爭對手使用這個鍵集來下降你的性能表現? 一個詞解決這個問題 —— random!spa

全域哈希的方法就是隨機選擇一個哈希函數H(固然不是每次操做都選擇一個哈希函數,而是構建一個哈希表的時候隨機選一個,選定以後這個哈希表的全部操做都是基於這個哈希函數,這種方法能夠防止競爭對手別有用心的設計一個鍵集,同時也能避免某些鍵集永遠會致使較差的性能,若是是,那麼從新建一個表就行!)設計

定義:指針

設U爲鍵的全域,H是哈希的有限集,H裏面的每一個哈希函數h將集合U映射到哈希表的m個位置上,若是哈希表知足:對於U裏面的兩個值x,y x≠y {h∈H:h(x)=h(y)}=|H|/m,那麼H就是全域的。
|H|的意思是指全域哈希函數的個數,那麼從裏面任意取一個函數h,這個函數把x和y哈希到同一個位置的機率就是1/m,也就是說,這些函數都是均勻函數。htm

 

Hash Function Group構造的一個方法以下blog

取 m 爲素數,取隨機數 A 爲 r+1 位 m 進制的數,表示爲 <A0,A1,...,Ar> (其中 0 <= Ai <= m-1爲隨機選擇),則哈希函數H[A](K) 定義爲:

  H[A](K) = sum { Ai * Ki | i =0, 1, ... , m-1 }  mod m
io

 

證實:


定理得證

 

徹底哈希

哈希的基本缺陷,即便構造了全域哈希,仍是不必定能解決很差的鍵集輸入的問題,能不能找到一個完美的解決方案呢?
能不能保證在任何狀況下查找的複雜度都在Θ(1)呢?並且哈希表還不能太大,必須知足n=O(m)
如今來作作推理,若是咱們要求對於哈希表中任意一個數x,發生碰撞的次數的指望,小於1
在均勻哈希的狀況下,對於每個數來講,碰撞的可能性都是1/m,那麼
Cn2*1/m=n(n-1)/2m <1 那麼m>n(n-1)/2 也就是說m是n的平方的量級,因此普通的哈希表是不可能完成這種任務的,除非哈希表構造得很是的大。
解決方案是構造一個雙層哈希的結構,哈希表的底層用來存放第二層的入口指針和所用的哈希函數,第二層纔是存放數據元素,證實略

相關文章
相關標籤/搜索