哈希函数和哈希表

经典哈希函数的性质(散列函数)

1.输入域无穷大

2.输出域是有穷尽的

3.输入参数相同,返回哈希值不变(不是随机函数)

4.输入不同,哈希值亦可能相同,哈希碰撞

5.离散性:举例:input-0~98,out-0、1、2,得出结果,差不多33个分布在0上,差不多33个分布在1上,差不多33个分布在2上(最重要的

特征:

1.与输入规律无关,是一个打乱的过程(打乱函数,否则无法做均匀分布了)

2.对输入来说,哈希函数得到的结果若能在S域上能均匀分布,取模(%m)后依然均匀分布

 

哈希函数得到的是16位的码,每一个码上是16进制的数,这16个码彼此相互独立

工程应用:急需1000个哈希函数,并且要彼此相互独立,如何做?为何这样做独立?

用一个哈希函数,就能改出1000个哈希函数

1.split:高八位作为h1,低八位作为h2

2.两个哈希函数做函数变换,也能生成两两之间相互独立的第三个哈希函数,相互独立?

h3相对于h1、h2独立,为什么相互独立?

每一个位置,针对其他位置都是独立的

 

哈希表:

10:(A,17)

2:(B,3)

若存在A,但值变了,则修改值,若无A,则在当前点后再接一个

0~16:桶中个数几乎就是均匀长得

如何保证O(1)-增删改查都是O(1)

used/size=loadFactor----桶中元素数/桶数大于1时,无法保证查找时为常数规模时间O(1),扩容

扩容,倍数扩容,时间复杂度均摊,离线扩容(并行的思维)因而时间复杂度较低

jvm里,每个桶里是一个红黑树

经典情况,里面是一个链表

哈希函数很重要,比哈希表要重要

 

大数据题目:大文本文件查重,100TB,哈希函数(计算哈希code,取模,分流)

相同文本,一定在同一台机器上

将所有重复字符串打印出来

若有m种字符串,会将这m种字符串均匀地分到1000台机器上

1000台机器并发:哈希函数来做分流

大数据题目,有一半都是用哈希函数

 

哈希表是用哈希函数的桶

相同输入相同输出,不同输入均匀分布!

默认哈希表的增删改查为O(1)

 

准备两张哈希表

两张哈希表:当元素较少时,某些位置没有,当元素较多时,也不是完全一样

等概率随机的方式是什么?

10个元素的数组,随机一个数,再随机一个数?

做不到严格等概率,返回一个!

哈希表和map有什么区别?

在哈希表中,A和B的位置以致Z的位置,都乱七八糟的

add remove getRandom

删除会产生洞

洞太多的话,getRandom无法再使用了

map是无序的,填洞操作,并不需要维持顺序,不产生洞就OK!

将待删除元素,变为size处的元素,同时删除size位置的元素,并更新size

两个map,1.随机等概率返回一个key 2.删除

c++中的map插入一个相同key时???

一个主map,一个用于随机等概率返回的副map(str,size,分作key与value,用于O(1)时间内删,随即返回以及增补)

map1.find(str17)->first=str999;

map2.find(map1.find(str17)->seccond)->seccond=str999;

c++会忽略后面相同键值的插入操作

java——hashmap,对于已经存在的key,会直接更改对应的value

填洞,常规操作!

 

布隆过滤器:

解决什么问题?

100亿个URL(64字节):黑名单

看URL是否是黑名单?

hashset:至少6400亿字节

640G

设计耗费巨大代价

有失误率:URL不在黑名单,却返回在黑名单,错杀不漏杀

经典解法:哈希来,哈希去

接受失误率的话:布隆过滤器!

进入布隆过滤器:

比特类型数组需要开多大:

公式1:n:样本量/P:预期失误率:100亿,16G

公式2:确定哈希函数的个数

m和K都向上取整,因此失误率也发生改变:

数组越大,失误率越低!

公式怎么推的?查帖子!

 

一致性哈希:

服务器设计

经典负载均衡的结构:

加机器、减机器怎么办?!?!?!

一致性哈希结构:

不再取模了!

二分:工程上很快的

加、减机器:数据迁移的代价比较小

问题:

机器数量比较少时,不均匀

加机器后,又变成不均匀

解决:虚拟节点技术:1000个节点(统计学,以比例化解)

分布式常用一致性哈希

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值