哈希表

哈希表:算法

哈希表(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;
}
相關文章
相關標籤/搜索