雜湊(2)線性探測法和雙重雜湊法

2021-07-01 23:53:11 字數 2118 閱讀 1530

接上篇 雜湊的簡要描述和鏈位址法

解決雜湊衝突的方法:

如果我們能夠**將要存入表中元素的數目,而且我們有足夠的記憶體空間可以容納帶有空閒空間的所有關鍵字,那麼使用鏈位址法是不值得的。我們依靠空的儲存空間解決衝突:設計表長m大於元素數目n,開放位址法,最簡單的開放位址法是線性探測法:

該符號表的實現將元素儲存到大小是元素個數兩倍的雜湊表中。

void hashtableinit(int max)

void hashtableinsert(item item)

hash_table[hash_key] = item;

n++;

}

item hashtabelsearch(keyitem v)

return hash_table[hash_key];

}

線性探測表中的刪除,僅僅移走刪除關鍵字對應的元素時不夠的。因為當移走後形成的空位會導致其後面元素的搜尋失敗(空位終止向後搜尋)。因此,應該將刪除位置與其右邊的下乙個空位之間所有元素重新雜湊插入到表中。

void hashtabeldelete(item item)

if (hash_table[hash_key] == nullitem)

return;

hash_table[hash_key] = nullitem;

n--;

//將刪除位置到其右邊下乙個空位之間所有的元素重新雜湊

for (int j = hash_key+1; hash_table[j] != nullitem; j = (j+1)%m)

}

開放位址法的效能依賴於α=

n/m ,表示表中被位置被佔據的百分比,成為裝填因子。

對於稀疏表(

α 較小),預期幾次探測就能找到表的空位,但對於接近滿的表(

α 對於線性探測法,當聚焦問題嚴重或者表接近滿時,要搜尋乙個關鍵字,往往要逐個檢查很多個無關項(先於和搜尋關鍵字匹配的元素插入)。為了解決聚焦問題,提出了雙重雜湊演算法,其基本策略和線性探測法一項,唯一不同是:它不是檢查衝突位置後的每乙個位置,而是採用另乙個雜湊函式產生乙個固定的增量。(跳躍式檢查和插入,減小聚焦大小)

注:第二個雜湊函式要仔細選擇,需滿足條件

(1)排除雜湊值是0的情況

(2)產生的雜湊值必須與表長m互素

常用`#define hash2(v) ((v % 97) + 1)

void hashtableinsert(item item)

hash_table[hash_key] = item;

n++;

}item hashtabelsearch(keyitem v)

return hash_table[hash_key];

}

如果雙重雜湊表的刪除操作繼承線性探測演算法:那麼刪除演算法會降低雙重雜湊表的效能,因為待刪除關鍵字有可能影響整個表中的關鍵字,解決辦法是:用乙個觀察哨代替已刪除元素,表示該位置被占用,不與任何關鍵字匹配。

如果要保證所有搜尋的平均開銷小於t次探測,那麼線性探測法和雙重雜湊法的裝填因子分別要小於1−

1/t√

和1−1

/t因為隨著表中關鍵字的增多,表的效能會下降,一種解決辦法是:當表快要滿時,表的大小加倍,然後被所有元素重新插入。(非經常性操作,可以接受)

如果表支援刪除的adt操作,隨著表元素減少,值得對錶大小減半。但需要注意的是表長加倍和減半的閾值時不同的。如在半滿時加倍,在1/8滿時減半。

表長動態變化能夠合理處理各種元素個數的變化,缺點是表的擴張和縮減時的重新雜湊和記憶體分配的開銷。

如何選擇:

- 是選擇線性探測還是雙重雜湊主要取決於:計算雜湊函式的開銷和裝填因子。

α 較小,兩者均可;長關鍵字計算雜湊函式開銷大;裝填因子

α 接近於1,雙重雜湊效能大於線性探測。

- 鏈位址法需要額外的記憶體空間儲存鏈結,但是有一些符號表中已經事先分配好了鏈結欄位的元素。雖然不如開放位址法快,但效能仍然比順序搜尋快的多。

- 當以搜尋為主且關鍵字數目不能精確**時,動態雜湊表是可選的。

雜湊 線性探測法

time limit 1 secs,memory limit 256 mb 使用線性探測 法 linear probin g 可以解決雜湊中的衝突問題,其基本思想是 設雜湊函式為 h key d,並且假定雜湊的儲存結構是迴圈陣列 則當衝突發生時 繼續探測 d 1,d 2 直到衝突得到解決 例如,現有...

雜湊之線性探測法

資料結構實驗之查詢七 線性之雜湊表 time limit 1000ms memory limit 65536kb problem description 根據給定的一系列整數關鍵字和素數p,用除留餘數法定義hash函式h key key p,將關鍵字對映到長度為p的雜湊表中,用線性探測法解決衝突。重...

線性探測法解決雜湊衝突

線型探測法 解決雜湊衝突的一種方法 include include using namespace std const int indexbox 10 雜湊表最大元素 const int maxnum 7 最大資料個數 void printdata int data,int n void creat...