1. 程式人生 > 實用技巧 >基礎資料結構(一)——雜湊表和字串雜湊

基礎資料結構(一)——雜湊表和字串雜湊

這篇文章主要討論了雜湊表和字串雜湊

雜湊表

雜湊,就是給一個元素(可以是數字,字串,甚至是樹)一個在小區間內的編號,以便用陣列來儲存。
這個從元素到編號的函式就稱為雜湊函式。
那麼,從元素集合到編號集合構成一個對映,並且可能有許多元素對應同一個編號,如果還是要存,這時候稱為雜湊衝突,下文會提到它的解決辦法。
雜湊表在STL裡面已經給出了實現方法:mapunordered_mapmap單次操作是\(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;
}