雜湊 完美雜湊

2022-07-24 03:30:19 字數 2242 閱讀 4875

目錄​ 在部分雜湊表(分離鏈結,開放定址)中,當裝填因子\(\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...