解決雜湊表衝突問題 開放定址法

2021-08-07 05:18:07 字數 1502 閱讀 8026

指標是我們學習c語言的一大瓶頸,用分離鏈結雜湊演算法的一大缺點也是因為他用到了指標,涉及到了記憶體分配。開放定址雜湊法是另一種解決衝突而不需要用到指標的演算法。

開放位址雜湊法的基本思想是,遇到了衝突,我們就用另一套法則,將此關鍵字放在其他的空缺位置上。顯而易見,他的缺點是雜湊表的建立必須足夠大,才能夠容許我們進行相關的操作,比起分離鏈結法來講,雖然演算法速度上有所提公升,但是記憶體浪費比較大。因為他的裝填因子λ應該低於0.5

裝填因子:雜湊表的裝填因子(load factor)λ為雜湊表中的元素個數與雜湊表大小的比值。

1.線性探測法

只要表足夠大,我們就能根據這個方法找到相應的位置,但是這樣花費的時間更多,且浪費了很多空間,這樣佔據的單元也會開始形成一些區塊,這樣的結果稱為一次聚集

2.平方探測 – 二次探測

偽**描述

型別宣告

struct hashentry

;typedef

struct hashentry cell;

struct hashtbl

初始化開放定址雜湊表

hashtable

initializetable(int tablesize)

/*allocate table*/

h = malloc( sizeof(struct hashtbl));

if(h == null)

fatalerror("out of space!!");

h->tablesize = nextprime(tablesize);

/*allocate array of cells*/

h->thecells = malloc( sizeof(cell) * h->tablesize);

if(h->thecells == null)

fatalerror(" out of space !!");

for(i = 0; i < h->tablesize; i++)

h->thecells[i].info = empty;

return h;

}

看得出來開放定址的初始化和分離鏈結的初始化大致相同。

find例程

position

find(elementtype

key, hashtable

h) return

currentpos; //return

theposition

雖然說平方探測派出了一次聚集,但是雜湊到同一位置上的那些元素將探測相同的備菜單元。形成了二次聚集。

開放定址法解決衝突的雜湊表

題目描述 找是否有兩片完全相同的雪花,雪花總數為 0 n 100000,判斷兩片雪花是否相同的標準為其中一片雪花的的六角陣列經過向左 右 迴圈移位後與另一片的六角陣列相同 pragma warning disable 4786 include include includeusing namespa...

雜湊表(開放定址法處理衝突)

題目 雜湊表 開放定址法處理衝突 雜湊表的基本思路是,設要儲存的元素個數為n,設定乙個長度為m m n 的陣列,每個元素ki的下標為對應函式f ki 這樣在查詢ki的時候就可以通過下標f ki 查詢 在建立雜湊表的時候會有所衝突,即ki和kj的函式值可能一樣,因此有處理衝突的方式 線性探測法 當產生...

演算法 開放定址法解決雜湊衝突方式

開放定址法 又稱開放定址法,當雜湊衝突發生時,從發生衝突的那個單元起,按照一定的次序,從雜湊表中尋找乙個空閒的單元,然後把發生衝突的元素存入到該單元。這個空閒單元又稱為開放單元或者空白單元。開放定址法需要的表長度要大於等於所需要存放的元素數量,非常適用於裝載因子較小 小於0.5 的雜湊表。查詢時,如...