哈希表算法

来源:互联网 发布:中国数据泄露防护市场 编辑:程序博客网 时间:2024/05/15 21:58


   今天大概讲一讲哈希表的原理,构造,冲突等。

哈希(HASH)是什么,其实哈希就是一种映射,将一些线性数据通过一个函数h算出一个值作为下表,定义一个A数组单元来按照下标储存数据。

举例:离散优化就是一种特殊的哈希,它的函数比较简单。

 

 

 


如图,如果这个数组的数据下标不大的话,我们就可以直接排序算出距离,但当下标太大时,我们开不出那么大的数组,所以我们就可以采用一种特殊的哈希思想,将每个两个点截出的线段开一个从下标1开始的数组来存储。实际上就是把下标作为数据值存入一个新的数组里,这样使用时只用遍历一下即可找到想要的点,又避免了数组过大。

代码:#include<stdio.h>

#include<algorithm>

using namespace std;

int x[2000];

int mid(int a,int i,int j){

int z;

while(i<=j){

z=(i+j)>>1;

if(x[z]==a){

while(x[z-1]==x[z]) z--;

return z;

}else if(x[z]>a)

j=z-1;

else i=z+1;

}

}

int flag[3000];

main()

{

int n,a[2000],b[2000];

scanf("%d",&n);

int t=1,y;

for(int i=1;i<=n;i++){

scanf("%d%d",&a[i],&b[i]);

x[t++]=a[i];

x[t++]=b[i];

}

sort(x+1,x+2*n+1);

int p,q,j;

for(int i=1;i<=n;i++){

p=mid(a[i],1,2*n);

q=mid(b[i],1,2*n);

for(j=p;j<=q-1;j++){

flag[j]=1;

}

}

}

构造哈希的函数有多种类型,包括:直接定址法(数据本身或关键字加上常量)、除余法、数字分析法等。

但有时候哈希表会出现一个严重的问题,那就是不同的数据,不同的key通过函数会得到相同的地址。这就非常尴尬了,所以我们必须解决这个问题。

1.拉链法,在同一个地址定义一个链表储存多个数据,当找数据时遍历整个链表。

2.开地址法,既然不能存在这,那就另外找个空的地址存就可以了,当遍历找某个数据时找到空地址还没发现则说明该数据未存入。

但是真的是这样吗?一旦我们删了某个数据,那就有个地址空出来,就会漏根。所以删除时千万记得不要把地址内容标记为0,而是其他的,以便查找。

再说复杂度,原本看起来只有一个冲突的一组数据在开地址后会发生连锁反应,多次冲突。哈。。。所以我们又机智的想到我们可以再定义另一个函数,使得开地址时跳一跳(延后几个地址储存),这样就可以有效防止增加冲突。但记住这个往后跳的数值必须与表长互质,不然就可能出现死循环,就是算出来表已满但实际并没有。

就是这些,啊,太晚了,休息了。

0 0
原创粉丝点击