目錄 在部分雜湊表(分離鏈結,開放定址)中,當裝填因子\(\lambda\)合理,雜湊函式合適的情況下,期望的插入、刪除、和查詢的平均時間都是\(o(1)\),即在沒有衝突的情況下計算雜湊所需要的時間。
但是在最壞情況(衝突)下,查詢的最壞情形是多少?
我們期望最壞的情況下,查詢的時間函式也是\(o(1)\) —完美雜湊
開放定址 簡單起見:我們首先定義所有的項n都事先已知。在分離鏈結法中,我們如果多用一些表,那麼這些表的長度就會相應減少,假設我們有充分多的表,則在相當高的概率下可以期待根本沒有衝突。但是,這種方法存在2個基本問題。1,表的數量可能會大得離譜;2,即使有很多表,還是可能碰到衝突,這個跟運氣也有關係。
定義完美雜湊:我們已經知道在分離鏈結法中,當發生衝突的時候,我們會在衝突地點構建乙個鍊錶來處理衝突,在鍊錶中依次放入衝突值。但這裡提供另一種做法:我們在每個位置建立二級雜湊表,並將二級雜湊表的大小設定為位置中元素數量的平方。
**說明:在位置0處有乙個元素,我們給它建立乙個長度為1都雜湊表。位置1,位置2都沒有元素,我們不建立雜湊表。在位置3有2個元素,我們建立乙個大小為\(4(2^2)\)都雜湊表。在位置7有3個元素,我們在位置7建立乙個大小\(9(3^2)\)的雜湊表。第一次雜湊到位置3,但是不將資料直接放入位置3,而是放入位置3所保留的二級雜湊表中,第二次雜湊決定在二級雜湊表中的位置。這種使用二級雜湊表的方法叫做完美雜湊。
完美雜湊的優勢:所有的元素都可以存入二級雜湊表中,那麼任何元素的查詢都只需要雜湊2次得到。
說明1:完美雜湊的前提是所有的元素的值都已經知道,所以元素的一次雜湊值和二次雜湊值已經知道,上述圖中的資料結構在元素存入前已經可以確定。
說明2:為什麼是元素個數的平方呢??— 見定理2.2.1
說明3:我們可以確定:當我們的主雜湊表大小是n時,二級雜湊表的期望大小時2n。 — 見定理2.2.2
2.2 定理
2.2.1定理:假設將n個資料放入\(m=n^2\)個位置,則沒有衝突的概率最少是\(1/2\)。
證明:問題轉化,將n個球,放入m個盒子!
若一對球\((i,j)\)被放入同乙個盒子,則稱之為衝突。
1.衝突的概率:
\[球i被放入1號盒子的概率是:f(i) = 1/m \\
球j被放入1號盒子的概率是:f(j) = 1/m\\
總共m個盒子:f(i) * f(j) *m= 1/m
\] 任意2個球衝突的概率是\(1/m\)
2.在n個球中,類似1中\(i,j\)的組合有\(n*(n-1)/2\)對:
\[1號球跟其他球的組合方式:1*(n-1)\\
2號球跟其他球的組合方式:1*(n-1)\\
共n個球,去除重複項後的組合方式:n(n-1)/2
\] 3.整個雜湊表的衝突期望值:
\[\sum_\\
位置i的空間b_i^2:\quad b_i^2 = 2c_i+b_i
\] 4.得到上述描述:
a) \(c_i\)表示位置\(i\)的衝突次數,\(b_i\)表示位置\(i\)的項數。\(b_i^2\)表示位置\(i\)所用的空間。
b) 所謂位置\(i\),可以是第乙個位置,也可以是第n個位置。
5.因為位置\(i\)一共多少個?n個
\[n個位置的總空間是:\quad \displaystyle \sum_^b_i^2 = 2 \sum_^c_i^2+\sum_^b_i^2\\
可知衝突總次數:\quad \sum_^c_i^2 = (n-1)/2\\
總項數:\quad \sum_^b_i^2 = n\\
所以:\qquad \sum_^b_i^2 = 2(n-1)/2+n\\
=2n-1<2n
\] 定理得證
雜湊雜湊雜湊雜湊
雜湊,是解決字串 實際上是各種類 問題的重要工具,講字串儲存讀取速度降低到了線性,雜湊的用法十分豐富,可以用了進行狀態壓縮等。include include include includeusing namespace std 這與jdk string.hashcode 的函式在足夠大的資料下失配率...
Hash 雜湊 雜湊
hash 一種用於查詢的資料結構 雜湊查詢的前提是已經一定的規則方法建好了雜湊表。基本思想是 關鍵字 位址轉換法 以資料物件的關鍵字為自變數,通過乙個確定的函式關係h,計算出對應的函式值h key 把這個值解釋為資料物件的儲存位址,並按此存放,即儲存位置 h key 關鍵 1.構造好的雜湊函式 2....
雜湊表 雜湊
有乙個公司,當有新的員工報道時,要求該員工的資訊加入 id,性別,年齡,住址 當輸入該員工的id 時,要求查詢該員工資訊,要求不使用資料庫,盡量節損記憶體,資料越快越好 package main import fmt type emplink struct func this emplink fin...