首先,我們來看一道題:
problem : 元素查詢
time limit: 10 sec memory limit: 128 mb
submit: 87 solved: 42
[submit][status][web board]
給出n個正整數,然後有m個詢問,每個詢問乙個整數,詢問該整數是否在n個正整數**現過。
第一行兩個整數 n 和m。
第二行n個正整數(1<=n<= 100000)
第三行m個整數(1<=m<=100000)
所有資料都不超過10^8
一共m行,若出現則輸出yes,否則輸出no
4 2
2 1 3 4
1 9
yes
no
[submit][status]
#includeusing namespace std;
int a[100001];
int main()
for(int i=1,b;i<=m;i++)
if(ok==false)puts("no");
} return 0;
}
開開心心交題,結果!
機智的你又想到了乙個好方法!
#includeusing namespace std;
int a[100001];
bool c[100000001];
int main()
for(int i=1,b;i<=m;i++)
return 0;
}
沒錯,桶是可以ac的,但是!
怎麼看怎麼不舒服,再說可能被別人限制記憶體
那我們該怎麼優化呢?
首先看雜湊表,這道題用雜湊表做不難
什麼是雜湊表?
雜湊表就是把雜湊值存在表裡(感覺我跟沒說似的)
而雜湊值,是數字(或字元,字串)經過mod得到的乙個值,這個值最好用unsigned long long儲存。而雜湊錶用乙個類似樹的方式儲存雜湊值
#includeconst int mod=170001;
int cnt,n,m,ans,h[170001],pre[100001],nxt[100001];
void add(int x)
bool find(int x)
int main()
}
查詢 雜湊表查詢(雜湊表)
1 雜湊表查詢定義 雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查詢集合中存在這個記錄,則必定在f key 的位置上。採用雜湊技術將記錄儲存在一塊連續的儲存空間中...
雜湊表(雜湊表)查詢
雜湊技術是在記錄的儲存位置和它的關鍵字之間建立起乙個確定的對應關係f,使每個關鍵字key對應乙個儲存位置f key f為雜湊函式,又稱雜湊函式。採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續的儲存空間成為雜湊表 雜湊表。直接用key值的某個線性函式當位址。f key a key b 簡單,不...
雜湊表 雜湊表 查詢
直接定址法 數字分析法 平方取中法 平方取中法是將關鍵字平方之後取中間若干位數字作為雜湊位址。摺疊法摺疊法是將關鍵字從左到右分割成位數相等的幾部分,然後將這幾部分疊加求和,並按雜湊表表長取後幾體作為雜湊位址。除留餘數法 隨機數法 選擇乙個隨機數,取關鍵字的隨機函式值為它的雜湊位址。即 f key r...