哈希表算法
来源:互联网 发布:中国数据泄露防护市场 编辑:程序博客网 时间: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,而是其他的,以便查找。
再说复杂度,原本看起来只有一个冲突的一组数据在开地址后会发生连锁反应,多次冲突。哈。。。所以我们又机智的想到我们可以再定义另一个函数,使得开地址时跳一跳(延后几个地址储存),这样就可以有效防止增加冲突。但记住这个往后跳的数值必须与表长互质,不然就可能出现死循环,就是算出来表已满但实际并没有。
就是这些,啊,太晚了,休息了。
- 哈希表 算法
- 哈希表算法
- 哈希表算法
- 哈希表算法
- 算法-哈希表
- 哈希表算法
- 【算法】哈希表
- 哈希表算法
- 哈希表算法
- 哈希表算法
- 哈希表算法讲解
- 哈希表的ELFhash算法
- 哈希表算法讲解
- 算法学习-哈希表应用
- POJ 1813 哈希表算法
- 哈希表算法原理
- 【数据结构与算法】哈希表
- 哈希表算法实现
- 深拷贝、浅拷贝、对象引用概念
- L3总线接口
- Beat
- Codeforces Round #321 (Div. 2)【A 最长不减子串】【B tow-pointer】【C dfs】【D 状压DP】
- ubuntu 14.04上Samba服务失败的问题
- 哈希表算法
- Android动画知识点汇总
- POJ1700 【经典过河问题,贪心】
- android学习之自定义适配器
- struts2.0文件上传及展示
- Android 自定义 View(一) 绘制动态时钟
- sdut oj3326 顺序表应用3:元素位置互换之移位算法
- 暑假集训二顺序表-顺序表应用6:有序顺序表查询
- 子类能否重写父类的静态方法