演算法 模擬雜湊表(雜湊拉鍊法,開放選址法)

2021-10-17 23:52:28 字數 1469 閱讀 5693

用陣列h[n]來表示拉鍊法上對應的鏈,如果遇到衝突則在對應衝突的位置開乙個鏈,建立鏈的方式和之前單鏈表的方式相同。如果要插入乙個值:

計算當前值在雜湊之後的對映位置int k = (x % n + n) % n;之所以要取兩次模,是為了處理負數的模

將x儲存在e[idx]中

該鍊錶的下乙個位置就是當前衝突位置的鍊錶的頭,故ne[idx] = h[k];當前衝突位置鍊錶的頭變為了當前的idxh[k] = idx++;只需要乙個一維陣列用來儲存。

在插入時遇到衝突,按陣列順序向後查詢,直到找到空位置將其插入。

在查詢時,從雜湊對映的位置開始查詢,如果找到這個值,則返回其下標,如果直到當前位置為空時,還沒有找到,則說明該值不存在。

維護乙個集合,支援如下幾種操作:

「i x」,插入乙個數x;

「q x」,詢問數x是否在集合**現過;

現在要進行n次操作,對於每個詢問操作輸出對應的結果。

第一行包含整數n,表示運算元量。

接下來n行,每行包含乙個操作指令,操作指令為」i x」,」q x」中的一種。

對於每個詢問指令「q x」,輸出乙個詢問結果,如果x在集合**現過,則輸出「yes」,否則輸出「no」。

每個結果佔一行。

1≤n≤105

−109≤x≤109

5i 1

i 2i 3

q 2q 5

yesno

// 拉鍊法

#include

#include

using

namespace std;

const

int n =

100003

;int h[n]

, e[n]

, ne[n]

, idx =0;

void

insert

(int x)

bool

find

(int x)

}return

false;}

intmain()

else

else}}

return0;

}

#include

#include

using

namespace std;

const

int n =

200003

;int null =

0x3f3f3f3f

;int h[n]

;int

find

(int x)

if(h[i]

== x)

}return k;

}int

main()

else

else}}

return0;

}

原題鏈結

雜湊表(拉鍊法)

開雜湊法又叫鏈位址法 開鏈法 開雜湊法 首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個 桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中。設元素的關鍵碼為37,25,14,36,49,68,57,11,雜湊表為ht 12 表的大...

雜湊表(閉雜湊 拉鍊法 雜湊桶)

雜湊表,也稱雜湊表,是一種通過key值來直接訪問在記憶體中的儲存的資料結構。它通過乙個關鍵值的函式 被稱為雜湊函式 將所需的資料對映到表中的位置來訪問資料。關於雜湊表,主要為以下幾個方面 一 雜湊表的幾種方法 1 直接定址法 取關鍵字key的某個線性函式為雜湊位址,如hash key key 或 h...

雜湊錶開雜湊法(拉鍊法)

開雜湊法又叫鏈位址法 開鏈法 設元素的關鍵碼為37,25,14,36,49,68,57,11,雜湊表為ht 12 表的大小為12,雜湊函式為hash x x 11 hash 37 4 hash 25 3 hash 14 3 hash 36 3 hash 49 5 hash 68 2 hash 57 ...