哈希表:算法
哈希表(hash table)是一種高效的判重算法,通常用於元素範圍大但數量很少的狀況,還可用於快速查找等部分,並且空間開銷也不大。說明白了,就是把定義域內的整數映射到一個咱們選定的範圍內。函數
分析:spa
寫一個哈希表,首先你要肯定一個映射函數——哈希函數h(x),哈希函數的優劣將直接決定你的哈希表查找效率。設計
通常來講,一般把h(x)設計成平方取中(即把這個數平方後取中間幾位)或是直接取餘(即模一個大質數,這麼作即方便,效率也不低)。code
對於相同哈希值的元素,咱們把他們組織成一個鏈表,查找時遍歷鏈表,找到元素說明重複,不然插入(這也就是哈希函數要選好的緣由——若是元素衝突太嚴重,整個表會退化爲幾條長鏈,下降效率)。string
代碼:hash
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #define rep(i,x,y) for (int i=x;i<=y;i++) #define dep(i,y,x) for (int i=y;i>=x;i--) using namespace std; const int maxn=2000000+10,hash_size=1000003; int n,a[maxn],head[hash_size],next[maxn]; int hash(int k) //哈希函數 { return k%hash_size; } bool insert(int k) { int h=hash(a[k]),u=head[h]; while (u) //遍歷鏈表 { if (a[k]==a[u]) return 0; //找到了,插入失敗 u=next[u]; } next[k]=head[h]; //插入成功,將元素插入鏈表 head[h]=k; return 1; } int main() { scanf("%d",&n); rep(i,1,n) { scanf("%d",&a[i]); if (!insert(i)) printf("Exist!\n"); } system("pause"); return 0; }