哈希函数与哈希表的简单使用知识总结

1.哈希函数与哈希表等

1.哈希函数的特征:

哈希函数与哈希表的简单使用知识总结_第1张图片

1.输入无穷,输出有限,
2.相同的输入只会有相同的输出,他不是随机的
3.因为输入无穷,输入有限,所以有可能不通的输入,相同的输出,叫哈希碰撞,概率小
4.均匀性和离散性,随机点一千个点,拿个圈去圈,圈到的个数都是差不多的。
5.哈希函数的增删改查调用为O(1),但可以看成是个大常数。
6.哈希这个链,扩容的话,大概复杂度为O(logN),整体上看,每次扩容都得过一遍整体,所以整体的复杂度O(NlogN),所以一次的话就是O(NlogN)/N,所以基本上可以看成O(logN),可以把链的长度定的长一些,logN会很小,也就基本上为O(1)了

要存储一个数据对:张三 1882356;李四 23456789;王五 58856456;
张三经过哈希函数算出来的值是138,那么哈希表最少需要138个单元,因为张三对应的数据1882356要存储在指针数组的p[138]的位置上。
李四经过哈希函数算出来的值是500,那么2356789这个数据就要存放在p[500]这个位置上。
所以你明白了,“数据的地址放在指针数组的哪个单元格是算出来的,是有迹可寻的,并不是想放在哪里就放在哪里”
那查找的时候就好查找了,你要查找张三对应的数据,直接把张三用哈希函数算一下,得到138,哦 张三的数据就在p[138]这个位置上,所以一下就找到了。哈希表是一个key- value的数据对,p是一个指针数组,用来存放value的地址,那么key和value的关系是下面这样的。
p[f(key)]=&value 可以看出哈希表有时候会浪费很大空间的,

2.设计RandomPool结构

在该结构中有如下三个功能:
insert(key):将某个key加入到该结构,做到不重复加入 (this.keyIndexMap.containsKey(key))s
delete(key):将原本在结构中的某个key移除
this.keyIndexMap.remove(key);
getRandom(): 等概率随机返回结构中的任何一个key。
this.keyIndexMap.get(key);
Insert、delete和getRandom方法的时间复杂度都是O(1)
这个可以,设计两个哈希表,一个是key-index,一个是index-key,插入,就是没重复就插入,size++,获取随机就是,0-size-1,随机获取一个,删除还得保证随机获取,那就,每次删,就把最后的数与想删的位置作交换,然后删除最后的,size-1,就ok。

3.布隆过滤器:

黑名单问题,不让他访问,只有插入查询,无删除,很省内存空间,允许一定的失误率。把白的认成黑的,这个失误率可以很低,但无法避免,但黑看成白,不会发生。1字节=8bit,
布隆过滤器,就是个大位图,每个数u1进来,都调用k个hash函数,然后生成的数再%m,最后的值,在这个大位图上抹黑,如果某个u在这上边有白的,那就不属于这里。
这就能知道为什么会有,白黑,而没有黑白的错误率了,你只要是黑,那你都抹黑了,咋会有白的,但是你是白,可能你的位置刚好都被别人抹黑过了,所以,把你认成黑的。
哈希函数与哈希表的简单使用知识总结_第2张图片
只与两个参数相关,P失误率,n样本量,
哈希函数与哈希表的简单使用知识总结_第3张图片
M当然越大,错误率越低,但是越往后,低的就不明显了
K越大,刚开始是错误率变低,但k如果又大了,就又很容易把m占满,导致错误率提高,所以是个凹函数。
哈希函数与哈希表的简单使用知识总结_第4张图片

4.一致性哈希原理:

逻辑端,无所谓,都是随机分,
数据端,分布式数据库,得看,哈希key怎么选择,一定要满足高频,中频,低频的数量都均匀随机分布的。(像性别,只有男女,如果是三个机器,那必然有一个负载低下,选年龄这样的,就不用担心,毕竟每个年龄段都有几乎随机分布的人。)
但是一致性哈希原理不需要%m,加减都通过加节点。
哈希函数与哈希表的简单使用知识总结_第5张图片
怎么解决分配不均衡呢,就是虚拟节点技术,每个机器分为1000个虚拟节点均匀随机分配到圈上,都随机了,那就差不多了。也可以根据机器的强弱改变虚拟节点的个数,这大公司的分布式存储都这样,谷歌改变世界的三驾马车之一。

你可能感兴趣的:(学习,哈希算法,哈希表,哈希)