左神算法课总结(hash函数及应用)

1. hash函数

Hash(哈希),又称“散列”。

散列(hash)英文原意是“混杂”、“拼凑”、“重新表述”的意思。

在某种程度上,散列是与排序相反的一种操作,排序是将集合中的元素按照某种方式比如字典顺序排列在一起,而散列通过计算哈希值,打破元素之间原有的关系,使集合中的元素按照散列函数的分类进行排列。

在介绍一些集合时,我们总强调需要重写某个类的 equlas() 方法和 hashCode() 方法,确保唯一性。这里的 hashCode() 表示的是对当前对象的唯一标示。计算 hashCode 的过程就称作 哈希。

hash函数性质:

  1. 输入为任意长字符串,输出为固定长字符串。
  2. 输入确定,输出随之确定。特定输入对应唯一输出。(有可能两个输入对应一个输出 ——hash碰撞)
  3. 随着输入域增大,输出域均匀增大,(这种均匀性越好,hash函数越好)
    参考:https://blog.csdn.net/boke14122621/article/details/71773131

2. 设计RandomPool结构

【题目】 设计一种结构,在该结构中有如下三个功能:
insert(key):将某个key加入到该结构,做到不重复加入。
delete(key):将原本在结构中的某个key移除。 getRandom():
等概率随机返回结构中的任何一个key。
【要求】 Insert、delete和getRandom方法的时间复杂度都是O(1)

做法:
insert和getRandom:
构造map<key ,integer> map1 ,map<integer, key> map2 。当第一个插入o1,就在map1.add(o1,1),map2.add(1,o1)。 当希望进行get时,通过数字进行random,得到的就是等概率的。(保证0 - inreger 是连续的就可以保证等概率

delete:
删掉后存在空缺,这些洞影响了 0 - inreger 是连续的。 做法:拿最后一条记录和空缺进行交换,size – 。

3. 布隆过滤器

参考:https://www.jianshu.com/p/2104d11ee0a2

例:建立100亿大小的黑名单

做法:
设置k个哈希函数,对于每个黑名单上的url,分别对k个哈希函数进行计算,得到的hashcode % m (m就是布隆过滤器的大小),对这个位置置1,这样一个url会对k个位置进行置1。

后面对全部 url 重复上述操作,使之加入布隆过滤器

当需要检验一个url在不在黑名单上时,分别对k个哈希函数进行计算,得到的每个位置假设全部为1,那么就认为它在黑名单上,否则若存在某个哈希函数结果不为1,认为不在。(有误杀率p,宁可错杀三千不可放过一个

布隆过滤器只与数据量大小有关,与每个数据项大小无关

知道数据量大小n,和误杀率p 就能确定一个布隆过滤器

有关公式:
m = n * lnP / (ln2)^2; m是布隆过滤器的大小(开的bit数组),p是预期失误率
k = ln2 * m/n ; 哈希函数的个数。
真实误杀率为 (1 - e ^ (- nk / m ) ) ^ k

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值