哈希函数和哈希表

这篇具有很好参考价值的文章主要介绍了哈希函数和哈希表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 哈希函数和运用

哈希函数指将哈希表中元素的关键键值映射为元素存储位置的函数。

哈希函数有有一些性质,是可以运用的,元素经过哈希函数映射到一个有限的集合中,这些数在集合中的分布是均匀的,就像沙子均匀散落在盘中一样。

常见的哈希函数有MD5和Shal两种。MD5它哈希值的范围是0~264-1,Shal它的哈希值的范围是
0~2128-1。

现在我们来看下面这样一个实际的问题:假如给你一个40亿数据,给你1GB的内存,让你找到出现次数最多的数据。

大家的第一思路可能是我们用一个哈希表,存储这个数据和它出现的次数,然后求出最多出现的次数。但是我们用最坏的情况取估计,假设这40亿的数据都是不一样的,现在我们看看要花费多大的空间。
哈希函数和哈希表,哈希算法,算法,数据结构那么内存一定是不够的,我们注意到哈希函数的性质,我们可以通过哈希函数来进行分组。
哈希函数和哈希表,哈希算法,算法,数据结构然后我们用这1GB内存依次从每个组中进行哈希,把这些组的出现最多的数据和次数保存下来,最后取Max,求出出现最多的数据。

2.哈希表的时间复杂度

我们知道哈希表解决哈希冲突的一种常用的方法是拉链法,假如和我们现在有N个字符串,我们对它们进行哈希处理,对哈希值%17,得到了这样一个哈希表。
哈希函数和哈希表,哈希算法,算法,数据结构我们发现,这样得到的哈希表实际上是不行的,我们如何去得到一个时间复杂度更优的哈希表呢?

我们在链表长度大于一个特定的数的时候进行扩容,现在对上面的哈希过程优化。
哈希函数和哈希表,哈希算法,算法,数据结构这只是一种优化,JVM还有忧化,用户用哈希表当链过长时,后台会给你生成一个新的更大的哈希表,生成好后让你使用,这个扩容过程不占用用户的资源的。

3.布隆过滤器

现在我们给出一个场景题,现在有个黑名单有100亿个url,我们不希望用户去访问这些url,假设这每个url是64字节,也就是判断这个url是否属于这个集合,我们可能想用hash表来实现,但是这样哈希表要用6400亿万字节,也就是596G的内存。这样内存太多了。

现在布隆过滤器就是来优化这个问题,如果这个集合只有插入数据,判断这个数据是否在这个集合中这两种操作,没有删除这种操作的话,就可以使用。但是布隆过滤器是有失误率的,会出现误判的行为。但是这个误判只是将不在黑名单的数据,误判它在黑名单中,其实这个情况是可以接受的,因为并没有出现,在黑名单的数据误判不在黑名单内,这个误判不影响我们黑名单的本来的功能,而且这个失误率是我们是可以把它降到很低的。
下面看看原理:

现在我们看看位图,位图可以认为就是每个格子为1bit的连续数组,假如我们有个int,一个int等于32bit。
哈希函数和哈希表,哈希算法,算法,数据结构

我们可以通过这样的方式我们就可以把一个int类型的数组变成一个位图,如何操作呢?

哈希函数和哈希表,哈希算法,算法,数据结构现在我们就有位图的所有操作了,那么我们来看看布隆过滤器的原理吧。假如我们现在有一个m比特的一个位图。

插入操作:
哈希函数和哈希表,哈希算法,算法,数据结构判断操作:
我们通过这k个哈希函数得到所对应的k个key,检查这k个key在位图的位置,如果这k个key所在的位置都被标记上了1,那么这个url就在这个黑名单中。

那么为啥可以这样判断呢,为啥判断会有失误率呢?

(1)我们是通过这个方式来把数据加入黑名单的,再用这个操作来判断它是否在黑名单中,肯定是没有问题的。
(2)加入我们的数据量很大,位图很小呢,最极端的情况下会出现,位图的所有格子全被标记为1,无论是否为黑名单的数据,都会被判断为出现在黑名单中,这样就会出现误判。

我们发现错误率p,与k和m都是有关系的,首先如果哈希函数数量k增大的话,p是会减小的;但是k不断增大,那么m会被k消耗的很快,那么m会很快被全覆盖为1,p会趋近100%。那么如何确定k和m呢,是有公式的。
哈希函数和哈希表,哈希算法,算法,数据结构
n表示数据量,m表示内存,k表示哈希函数的数量,p表示期望的错误率。

知道了n和p,就可以把最合适的k和m算出来(k和m上取整),最后可以把实际错误率p的算出来
哈希函数和哈希表,哈希算法,算法,数据结构
有了这些我们就可把上述题进行求解了,下面是网上看到的题目和题解:

哈希函数和哈希表,哈希算法,算法,数据结构

4.一致性哈希和负载均衡

接下来看看一致性哈希和负载均衡,这就涉及到逻辑端如何分配服务器了,假如我们有3个服务器,现在我们看看经典的方式。
哈希函数和哈希表,哈希算法,算法,数据结构但是我们回收服务器呢?这个时候如何去回收一台机器或者加入一台机器4呢,我们就要把所有的机器数据全部再重新进行哈希,再去分配,这样很费时间,数据迁移的代价太高了。

如何解决呢,我们就不用%的方式来哈希分配。假如我们用MD5算法来进行哈希,我们得到的key就会在0~264-1的范围之内,看下面的图
哈希函数和哈希表,哈希算法,算法,数据结构这样就可以3个服务器负载均衡了,如何找到key对应顺时针最近的服务机器呢,我们在逻辑端可以用一个数值保存每个服务器对应的区间值,然后对这个值进行排序,求出大于key且最左边的数,这个我们可以用二分解决。比如现在数组就是[t2,t1,t3],我们的key最左边大于它的数如果是t1,那么就把它分到服务器1上。

那么加入服务器和下线服务器呢?

加入服务器:
哈希函数和哈希表,哈希算法,算法,数据结构下线服务器:

哈希函数和哈希表,哈希算法,算法,数据结构
可是我们发现加入机器和删除机械,还是会有负载不均衡的情况
哈希函数和哈希表,哈希算法,算法,数据结构

下面就用到了虚拟节点进行优化

哈希函数和哈希表,哈希算法,算法,数据结构
其实也就是我们不再以单一的节点表示一个机械了,而是把机械分成了很多个节点,它们去进行上序的操作。就像是一个机械由很多的小弟,小弟们在环中分别占领的不同的区域,但是最后这些区域都归属与大哥一样。

这样我们也可以控制机器的负载,如果一个机器的负载能力较差,我们就可以少给它一些虚拟节点,这样它的负载也就可以变小。文章来源地址https://www.toymoban.com/news/detail-818522.html

到了这里,关于哈希函数和哈希表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法——TypeScript】哈希表

    哈希表介绍和特性 哈希表是一种非常重要的数据结构,但是很多学习编程的人一直搞不懂哈希表到底是如何实现的。 在这一章节中,我门就一点点来实现一个自己的哈希表。 通过实现来理解哈希表背后的原理和它的优势。 几乎所有的编程语言都有直接或者间接的应用这种数

    2024年02月13日
    浏览(42)
  • C++数据结构与算法——哈希表

    C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注! 给定两个字符串 s 和 t ,编写一个函数来判断

    2024年02月19日
    浏览(58)
  • 数据结构算法设计——哈希表(散列表)

            哈希表 又叫 散列表 ,他们两个是同一个东西,本文全文采用“散列表”的叫法。散列表的本质其实就是一个 数组 ,他的作用就像使用数组时一样,输入下标可以得到对应元素,散列表可以实现 输入一个的时候得到这个的地址信息 。 下面是百科给出

    2024年02月03日
    浏览(60)
  • 数据结构与算法 | 哈希表(Hash Table)

    在二分搜索中提到了在有序集合中查询某个特定元素的时候,通过折半的方式进行搜索是一种很高效的算法。那能否根据特征直接定位元素,而非折半去查找?哈希表(Hash Table),也称为散列表,就是一种数据结构,用于实现键-值对的映射关系。它通过将键映射到特定的值

    2024年02月06日
    浏览(53)
  • 算法数据结构基础——哈希表(Hash Table)

    哈希表(Hash Table) :也叫做散列表。是根据关键码值(Key Value)直接进行访问的数据结构。 哈希表通过「键 key 」和「映射函数 Hash(key) 」计算出对应的「值 value 」,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做「哈希函数(散列函数

    2024年02月13日
    浏览(44)
  • Python篇——数据结构与算法(第六部分:哈希表)

      目录 1、直接寻址表 2、直接寻址表缺点 3、哈希 4、哈希表 5、解决哈希冲突 6、拉链法 7、常见哈希函数 8、哈希表的实现 8.1迭代器iter()和__iter__ 8.2str()和repr() 8.3代码实现哈希表 8.4哈希表的应用   直接寻址表:key为k的元素放到k的位置上 改进直接寻址表:哈希(

    2024年02月10日
    浏览(45)
  • Java学数据结构(4)——散列表Hash table & 散列函数 & 哈希冲突

    1.散列表,key,散列函数; 2.哈希冲突的解决; 3.string中的hashCode; 查找树ADT,它允许对元素的集合进行各种操作。本章讨论散列表(hash table)ADT,不过它只支持二叉查找树所允许的一部分操作。散列表的实现常常叫作散列(hashing)。散列是一种用于以常数平均时间执行插入、删除和

    2024年02月10日
    浏览(55)
  • 数据结构(五):哈希表及面试常考的算法

    哈希表,也叫散列表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。例如,下列键(key)为人名,value为性别。 数组 map(映射) 映射 底层实现 是否有序 数值是否可以重复 能否更改数

    2024年02月05日
    浏览(49)
  • 【数据结构与算法】哈希表设计(C\C++)

    针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查找程序。 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造。用伪随机探测再散列法处理冲突。 取读者周围

    2024年02月04日
    浏览(54)
  • 【Java程序员面试专栏 数据结构】四 高频面试算法题:哈希表

    一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,一个O(1)查找的利器哈希表,所以放到一篇Blog中集中练习 题目 解题思路 时间 空间 两数之和 辅助哈希 使用map存储出现过的值,key为值大小,v

    2024年02月22日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包