雜湊查詢 解決衝突的方法

2021-07-25 13:50:15 字數 1066 閱讀 5627

因為是期末複習(●ˇ∀ˇ●),淺淺地記個開放定址法的線性探測法和平方探測法;

例:設關鍵字序列,雜湊表表長tablesize=13,雜湊函式為:h(key)=key mod 11。

萌新瞎補:

雜湊表表長:對於一串數,就看做乙個整形陣列來存這些數,tablesize就是陣列的大小;

雜湊函式:咳咳,這是之前的知識啊!就是本來是這個數,通過一種關係變成了另外乙個數,比如為了實現離散化操作。

ok,繼續。

見表:關鍵字477

2911984

5420

30雜湊位址37

7097

1098衝突次數00

1003

136

可見啊,有些關鍵字對應的雜湊位址有衝突!

線性 探測 上

所謂線性,就是對於原衝突雜湊位址+1再往雜湊函式搞搞,h(new)=(h(old)+1)%13,其實很顯然就是往他右邊看看,如果右邊沒有就在右邊住下了,如果右邊還有持續往右,但是注意,最右邊的時候,本來式子就是取膜啊,所以就是往回看起,就是這麼一步一步的探測,找空位子。

平均查詢長度(asl):就是一共找了幾次然後除以關鍵字的個數。比如:上面的例子:asl=(1+1+2+1+1+4+2+4+7)/9≈2.56;

這個時候,平方 探測  出場。

線性不是每次+1取膜麼?平方就是如果「聚集」,我是加乙個數k的平方,而且這個k會越來越大,而且線性只往右邊(其實是往右的迴圈),平方是往兩端,具體序列是:

+1^2,-1^2,+2^2,-2^2,+3^2,-3^2,...,+k^2,-k^2  這樣的話找的更快啊!

有證據(略)表明:tablesize如果是4x+3(x是正整數)形式的素數,平方探測法就可以探查到整個雜湊表空間;

有一題譬如:pat1078

題目是嚴格向右探測的:

貼一小段**,當找不到的時候,注意+k^2 並取膜;

bool flag=false;

int inc=1;

while(incok,that's all;

解決雜湊衝突的方法

在實際的應用中,選取合適的雜湊函式可減少衝突,但衝突是不可避免的。所以我就想給大家說幾種解決雜湊衝突的方法啦 首先就是開放定址法,用這個方法處理衝突的核心思想就是在衝突發生的時候,形成乙個位址序列,順著這個序列挨個去檢查探測,一直等到找到乙個 空 的開放位址。把我們發生衝突的關鍵字值存放到這個 空 ...

解決雜湊衝突的方法

開放定址法和鏈位址法 開放定址法 當衝突發生時,使用某種探查 亦稱探測 技術在雜湊表中形成乙個探查 測 序列。沿此序列逐個單元地查詢,直到找到給定 的關鍵字,或者碰到乙個開放的位址 即該位址單元為空 為止 若要插入,在探查到開放的位址,則可將待插入的新結點存人該位址單元 查詢時探查到開放的 位址則表...

解決雜湊衝突的方法

解決雜湊衝突的方法 1 開放定址法 當衝突發生時使用某種探查技術在雜湊表中形成乙個探查序列。沿此序列逐個單元的查詢,直到找到給定的關鍵字,或者碰到乙個開放的位址為止。線性探測法 挨個向後找。線性補償探測法 將步長從1改為q,要求q與m互質。j j q m 隨機探測法 步長改為隨機數。雙重雜湊法 又稱...