用陣列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 ...