哈希表
哈希表:
哈希表(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;
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号