哈希表-拉链法及应用举例
生活随笔
收集整理的這篇文章主要介紹了
哈希表-拉链法及应用举例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
哈希表存儲結構:
1.開放尋址法
2.拉鏈法
哈希表的主要作用:
把一個較大(0-10^9 )的數據映射到較小(0-N(N一般為10^5 到 10^6))的數據
哈希函數:可以把一個從-10^19 到10^19 的中的一個數映射到0-10^5之間的一個數
1.哈希函數怎么寫?
一般情況下,直接取模,x%10^5,我們一般模的數,一般取為質數,并且離2的整次冪盡可能的遠,這樣取,沖突的概率最小
2.沖突:把2個不一樣的數映射成同一個數怎么辦?
我們可以用開放尋址法或者拉鏈法來解決這個問題
首先我們先定義哈希函數:h(a) = b,指我們將a映射成b
這里我們只介紹拉鏈法。
拉鏈法:
參考文獻:
圖示算法
舉個例子:
維護一個集合,支持如下幾種操作:
“I x”,插入一個數x;
“Q x”,詢問數x是否在集合中出現過;
現在要進行N次操作,對于每個詢問操作輸出對應的結果。
輸入格式
第一行包含整數N,表示操作數量。
接下來N行,每行包含一個操作指令,操作指令為”I x”,”Q x”中的一種。
輸出格式
對于每個詢問指令“Q x”,輸出一個詢問結果,如果x在集合中出現過,則輸出“Yes”,否則輸出“No”。
每個結果占一行。
數據范圍
1≤N≤105
?109≤x≤109
輸入樣例:
5
I 1
I 2
I 3
Q 2
Q 5
輸出樣例:
Yes
No
代碼如下:
#include <iostream> #include <cstring> using namespace std; const int N = 1e5+3; int h[N],e[N],ne[N],idx; void Insert(int x) {int t = (x%N+N)%N;e[idx] = x;ne[idx] = h[t];h[t] = idx++;}bool find(int x) {int t = (x%N+N)%N;for (int i = h[t];i!=-1;i = ne[i]){if (e[i]==x){return true;}}return false; }int main() {int cnt;cin>>cnt;memset(h,-1,sizeof(h));while(cnt--){string a;int b;cin>>a>>b;if (a[0]=='I') Insert(b);else{if (find(b)){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}}}return 0; }總結
以上是生活随笔為你收集整理的哈希表-拉链法及应用举例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AcWing 1234. 倍数问题
- 下一篇: 递推求组合数