重學資料結構系列之 雜湊表

2022-04-13 06:06:30 字數 2178 閱讀 2749

1.定義

雜湊表,也叫雜湊表。根據關鍵碼值(key value)而直接進行訪問的資料結構。

比如你要查a,通過雜湊函式f(a) = k就可以得到雜湊表b的索引,b[k]即可獲取a 對應的value

這個可以用來快速查重吧,就是你給我乙個a,a在不在雜湊表裡呢?大家平時註冊的時候,使用者大的時候就可以用這個來快速查重了

什麼是衝突呢,就是多對一,比如:f(a) = k,同時f(c) = k,f(d) = k

開放位址法。如果發生衝突,那麼就使用某種策略尋找下一儲存位址,直到找到乙個不衝突的位址或者找到關鍵字,否則一直按這種策略繼續尋找。如果衝突次數達到了上限則終止程式,表示關鍵字不存在雜湊表裡。一般常見的策略有這麼幾種:

1. 線性探測法,如果當前的衝突位置為 d,那麼接下來幾個探測位址為 d + 1,d + 2,d + 3 等,也就是從衝突位址往後面乙個乙個探測;

2. 線性補償探測法,它形成的探測位址為 d + m,d + 2 * m,d + 3 * m 等,與線性探測法不同,這裡的查詢單位不是 1,而是 m,為了能遍歷到雜湊表裡所有位置,我們設定m 和表長 size 互質;

3. 隨機探測法,這種方法和前兩種方法類似,這裡的查詢單位不是乙個固定值,而是乙個隨機序列。

4. 二次探測法,它形成的探測位址為 d + 1^2,d + (-1)^2,d + 2^2,d + (-2)^2 等,這種方法在衝突位置左右跳躍著尋找探測位址。

開放位址法計算簡單快捷,處理起來方便,但是也存在不少缺點。線性探測法容易形成「堆聚」的情況,即很多記錄就連在一塊,而且一旦形成「堆聚」,記錄會越聚越多。另外,開放位址法都有乙個缺點,刪除操作顯得十分複雜,我們不能直接刪除關鍵字所在的記錄,否則在查詢刪除位置後面的元素時,可能會出現找不到的情況,因為刪除位置上已經成了空位址,查詢到這裡時會終止查詢。

鏈位址法。該方法將所有雜湊位址相同的結點構成乙個單鏈表,單鏈表的頭結點存在雜湊陣列裡。鏈位址法常出現在經常插入和刪除的情況下。

相比開放位址法,鏈位址法有以下優點:不會出現「堆聚」現象,雜湊位址不同的關鍵字不會發生衝突;不需要重建雜湊表,在開放位址法中,如果雜湊表裡存滿關鍵字了就需要擴充雜湊表然後重建雜湊表,而在鏈位址法里,因為結點都是動態申請的,所以不會出現雜湊表裡存滿關鍵字的情況;相比開放位址法,關鍵字刪除更方便,只需要找到指定結點,刪除該結點即可。

#include #include using namespace std;

//下面說得雜湊表就是elem這個儲存字串的指標變數

class hashtable

} ~hashtable()

//雜湊函式,就是我在定義裡隨便說得f()函式

//簡單來說就是計算出你這個字串要放在我雜湊表(陣列)的哪個位置

int hash(string& index)

return code;

} //雜湊表的查詢函式

//index:我們要查詢的字串

//pos:我們的雜湊表中可以插入index這個字串的位置

//times:衝突的次數

bool search(string &index, int &pos, int ×)else

} //該位置上的值等於index字串,說明找到了

if (elem[pos] == index) else

} //插入字串到雜湊表中

int insert(string &index)else if (times < size/2) else

} //重建雜湊表

void recreate()

//擴大雜湊表

int copy_size = size;

//擴大兩倍

size = size * 2;

//申請前先釋放之前的空間

delete elem;

elem = new string[size];

//先賦初值 :"#"

for (i = 0; i < size; i++)

for ( i = 0; i < copy_size; i++)

} delete temp_elem;

}};int main()

} int ans = hashtable.insert(buffer);

if (ans == 0) {

cout<

資料結構之雜湊表(雜湊表)

今天學的是資料結構的雜湊查詢篇,其他的查詢可參見以前的傳送門 以前的查詢都是基於比較關鍵字的基礎上,所以查詢的效率依賴於查詢過程中所進行的比較次數。理想的情況是不經過任何比較,通過計算就能直接得到記錄所在的儲存位址,雜湊查詢 hashed search 是基於上述思想的一種查詢方式。雜湊法又稱為雜湊...

資料結構之雜湊表

雜湊表和雜湊化有乙個重要的概念是如何把關鍵字轉換成陣列下標,在雜湊表中這個轉換是通過雜湊函式來完成的。比如規定乙個單詞含有4個字元,對於單詞cats,我們採用 冪的連乘 的方式將乙個單詞對映成數字。因為有27個可能的字元,包括空格,所以冪採用27,則cats的數字下標是3 27 3 1 27 2 2...

資料結構之雜湊表

wikipedia上的解釋 下圖示意了雜湊表 hash table 這種資料結構。雜湊表 如上圖所示,首先分配乙個指標陣列,陣列的每個元素是乙個鍊錶的頭指標,每個鍊錶稱為乙個槽 slot 哪個資料應該放入哪個槽中由雜湊函式決定,在這個例子中我們簡單地選取雜湊函式h x x 11,這樣任意資料x都可以...