基礎資料結構(一)——雜湊表和字串雜湊
阿新 • • 發佈:2020-09-02
這篇文章主要討論了雜湊表和字串雜湊
雜湊表
雜湊,就是給一個元素(可以是數字,字串,甚至是樹)一個在小區間內的編號,以便用陣列來儲存。
這個從元素到編號的函式就稱為雜湊函式。
那麼,從元素集合到編號集合構成一個對映,並且可能有許多元素對應同一個編號,如果還是要存,這時候稱為雜湊衝突,下文會提到它的解決辦法。
雜湊表在STL裡面已經給出了實現方法:map
與unordered_map
,map
單次操作是\(O(\log n)\)的,noip比賽裡面可以使用,而unordered_map
單次操作是\(O(1)\)的,但noip比賽裡面不可以使用。
圖書管理
#include <bits/stdc++.h> using namespace std; const int N=2e2+5,MOD=1e5,M=1e5+5,P=131; int n; int head[M],nxt[M],cnt; string val[M]; //雜湊函式 int calc(string str) { int res=0; for(int i=0;i<str.length();i++) res=(res*P%MOD+str[i]-'0'+MOD)%MOD; return res; } //新增一個值,鏈式前向星寫法 void add(string str) { int hsh=calc(str); val[++cnt]=str; nxt[cnt]=head[hsh]; head[hsh]=cnt; } //判斷有無跟它相同的 bool search(string str) { int hsh=calc(str); bool flg=false; for(int i=head[hsh];i;i=nxt[i]) //遍歷這一個連結串列 flg|=(str==val[i]); //簡便的寫法 return flg; } int main() { cin>>n; while(n--) { string opt,str; cin>>opt; getline(cin,str); //讀入一行資料 if(opt[0]=='f') puts(search(str)?"yes":"no"); else if(!search(str)) //如果已經有值了,就不加入 add(str); } return 0; }