哈希表

哈希表:

哈希表(hash table)是一种高效的判重算法,一般用于元素范围大但数量不多的情况,还可用于快速查找等部分,而且空间开销也不大。说明白了,就是把定义域内的整数映射到一个我们选定的范围内。


分析:

写一个哈希表,首先你要确定一个映射函数——哈希函数h(x),哈希函数的优劣将直接决定你的哈希表查找效率。

一般来说,通常把h(x)设计成平方取中(即把这个数平方后取中间几位)或是直接取余(即模一个大质数,这么做即方便,效率也不低)。

对于相同哈希值的元素,我们把他们组织成一个链表,查找时遍历链表,找到元素说明重复,否则插入(这也就是哈希函数要选好的原因——如果元素冲突太严重,整个表会退化为几条长链,降低效率)。


代码:

#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;
}
posted @ 2016-06-04 23:32  Krew  阅读(156)  评论(0)    收藏  举报