当前位置:首页 > 科技  > 软件

哈希表哪家强?几大编程语言吵起来了!

来源: 责编: 时间:2024-05-09 09:23:20 256观看
导读哈希表华山论剑话说这一日,编程语言联合国准备举办一次大会,主题为哈希表,给各大编程语言帝国都发去了邀请函。很快就到了大会这一天。联合国秘书长开场发言:“诸位,为促进技术交流与发展,增强各帝国友谊,联合委员会特设此盛

哈希表华山论剑

话说这一日,编程语言联合国准备举办一次大会,主题为哈希表,给各大编程语言帝国都发去了邀请函。9Aa28资讯网——每日最新资讯28at.com

很快就到了大会这一天。9Aa28资讯网——每日最新资讯28at.com

联合国秘书长开场发言:“诸位,为促进技术交流与发展,增强各帝国友谊,联合委员会特设此盛会,感谢诸位的捧场”9Aa28资讯网——每日最新资讯28at.com

会场传来一阵鼓掌声······9Aa28资讯网——每日最新资讯28at.com

秘书长继续发言:“本次大会的主题是哈希表,程序员们使用最多的数据容器之一,各大编程语言帝国相信都有实现。今天的大会就围绕哈希表分为几个议题讨论,首先是第一个议题:存储结构与冲突解决”9Aa28资讯网——每日最新资讯28at.com

存储结构与冲突解决

来自GoLang帝国的map率先发言:“哈希表,哈希表,首先得是个表嘛,所以最基本的要用一个数组来存储,数组中的每一个元素叫做bucket。至于hash冲突嘛,就用链表来解决嘛”9Aa28资讯网——每日最新资讯28at.com

图片图片9Aa28资讯网——每日最新资讯28at.com

GoLang帝国的map说完,有人站了起来:“英雄所见略同!在下C++帝国的unordered_map,我们基本上也是选择的这种方法”9Aa28资讯网——每日最新资讯28at.com

此时,Python帝国的代表提出了质疑:“链表确实可以解决冲突,不过嘛,这要是冲突太多,链表太长,搜寻起来岂不费时?”9Aa28资讯网——每日最新资讯28at.com

GoLang帝国的map和C++帝国的unordered_map面面相觑,不知如何应对。9Aa28资讯网——每日最新资讯28at.com

“链表太长的话,那就转成树结构!”,就在这时,又有人站了起来。9Aa28资讯网——每日最新资讯28at.com

见有人起身,Python帝国代表转身问道:“在下乃Python帝国的字典dict,敢问阁下怎么称呼”9Aa28资讯网——每日最新资讯28at.com

“我是Java帝国的HashMap,和前面两位兄台的策略大体相同,只是在冲突过多,具体来说链表长度超过8的时候就转换成红黑树的结构,以此加快查找”9Aa28资讯网——每日最新资讯28at.com

图片图片9Aa28资讯网——每日最新资讯28at.com

说完,map、unordered_map松了一口气,和HashMap一起坐下了。9Aa28资讯网——每日最新资讯28at.com

dict继续发问:“在座的都是这个思路,用链表解决冲突?”9Aa28资讯网——每日最新资讯28at.com

说完,另外一位代表站了起来,“等等,我们C#帝国的HashTable就没用链表!”9Aa28资讯网——每日最新资讯28at.com

dict露出了满意的表情,“那你们是怎么解决冲突的呢?”9Aa28资讯网——每日最新资讯28at.com

“咱HashTable内部使用的是双重散列法,咱内部不止一种哈希计算方式,一次Hash冲突,咱就换一个再算,直到找到有空位的地方存储”,HashTable回答到。9Aa28资讯网——每日最新资讯28at.com

dict看起来有些失望,估计这也不是他所用的方式。9Aa28资讯网——每日最新资讯28at.com

“你问了半天,还没说你们Python是怎么处理冲突的呢?”,Java帝国的HashMap开口了。9Aa28资讯网——每日最新资讯28at.com

“是啊,是啊”,其他代表也跟着起哄。9Aa28资讯网——每日最新资讯28at.com

见众人起哄,dict只好应答:“链表法固然不错,不过需要在插入数据过程中动态分配内存构建链表节点,开销不小,我们没有采用。”9Aa28资讯网——每日最新资讯28at.com

“那到底用了啥,你倒是说啊,快急死我了”,C++的unordered_map有些急了。9Aa28资讯网——每日最新资讯28at.com

“我们用的是一种叫开放寻址法的策略,如果发现了冲突,就按照制定的策略从这个位置往后找,直到找到有空的位置存储”,dict{}继续说到。9Aa28资讯网——每日最新资讯28at.com

图片图片9Aa28资讯网——每日最新资讯28at.com

“哪有那么简单的事,你把别人的位置占了,那对应那个位置的数据来了怎么办?还有查找怎么找?删除怎么处理?这不全乱套了吗”,unordered_map追问不舍。9Aa28资讯网——每日最新资讯28at.com

“是这样的,按照我们既定的规则,在查找的时候就需要额外做一些工作,另外删除的时候也不能直接删除,否则会破坏规则链条·····”,接下来一段时间,dict给大家仔细介绍了他们的处理思路。9Aa28资讯网——每日最新资讯28at.com

“你这个也太麻烦了,不如我们链表法来的清晰明了”9Aa28资讯网——每日最新资讯28at.com

“这怎么就麻烦了?这好处不显而易见嘛?”,dict也不甘示弱。9Aa28资讯网——每日最新资讯28at.com

这时,秘书长打断了大家的争辩:“诸位,诸位,静一静,静一静,咱们这个议题到此为止,进入下一个议题:哈希到位置映射”9Aa28资讯网——每日最新资讯28at.com

哈希到位置映射

急性子的C++帝国代表unordered_map第一个说话:“这有什么好讨论的,不就是用hash值对哈希表数组长度进行一个求模运算吗?”9Aa28资讯网——每日最新资讯28at.com

图片图片9Aa28资讯网——每日最新资讯28at.com

“就是,这有什么好讨论的”,C#帝国的HashTable也附和到。9Aa28资讯网——每日最新资讯28at.com

“哎,此言差矣,我就没用取模运算”,众人望去,这Python帝国的dict又要闹什么新鲜玩意。9Aa28资讯网——每日最新资讯28at.com

GoLang帝国的map问道:“老哥用的什么办法,别卖关子了,快说来听听”9Aa28资讯网——每日最新资讯28at.com

dict扫了众人一眼说到,“我的办法就是:”9Aa28资讯网——每日最新资讯28at.com

图片图片9Aa28资讯网——每日最新资讯28at.com

这是怎么个映射法?众代表皆摸不着头脑,议论纷纷,唯有Java帝国的HashMap听闻微微一笑。9Aa28资讯网——每日最新资讯28at.com

dict见状问道:“HashMap兄台,莫非知晓其中玄机?”9Aa28资讯网——每日最新资讯28at.com

只见HashMap不紧不慢的站了起来说到:“哈希表长度是2的幂次,减1之后的二进制均变成了1,比如长度16,减1变成15,也就是二进制1111。再进行与运算,相当于取了哈希值的低位,直接映射到对应的数组位置,与运算比取模运算要快不少。不瞒诸位,我HashMap中也是使用的这种方式,此乃雕虫小技,不值得炫耀”9Aa28资讯网——每日最新资讯28at.com

图片图片9Aa28资讯网——每日最新资讯28at.com

众代表听完纷纷点头称赞,dict不知何时却已坐下。9Aa28资讯网——每日最新资讯28at.com

C#的HashTable问道:“这样直接取低几位,会不会造成Hash值到数组的映射不均匀,拿你举的例子来说,18的二进制是0001 0010,34的二进制是0010 0010,他们的低4位都一样,和1111与上以后都是0010,也就是都该存到数组的2号位,这岂不是一定程度上的增加了冲突的概率吗?”9Aa28资讯网——每日最新资讯28at.com

突如其来的质疑并没有让HashMap慌乱,反而是从容不迫的解释到:“C#代表的这个问题提的非常好,不知dict兄台是如何处理的。我们的方案是在进行与运算映射之前,对hash值进行一个处理,具体来说就是将其高16位与低16位进行一个异或运算,如此一来,最终参与与运算的部分就融合了原始hash的全部信息,而不仅仅是低位。”9Aa28资讯网——每日最新资讯28at.com

图片图片9Aa28资讯网——每日最新资讯28at.com

众代表听完再次点头称赞。9Aa28资讯网——每日最新资讯28at.com

秘书长打破了平静,“看来大家收获都颇丰,咱们接着下一个话题吧:初始容量与扩容”9Aa28资讯网——每日最新资讯28at.com

初始容量与扩容

众代表这一次皆不争先,互相观望。9Aa28资讯网——每日最新资讯28at.com

秘书长见状说到:“没人主动,那我可就要点名了······”9Aa28资讯网——每日最新资讯28at.com

“那就我先吧”,Java帝国的HashMap站了起来,“我的默认初始容量是16,有一个叫负载因子的参数,默认是0.75。我的策略是,如果内部数组的空间使用了超过75%,那就要准备扩容了,否则后续Hash冲突的概率就会很大。哦对了,扩容时容量得是2的指数次方,原因前面已经交代了”9Aa28资讯网——每日最新资讯28at.com

图片图片9Aa28资讯网——每日最新资讯28at.com

dict第二个起身:“嗯,差不多,我的默认初始容量是8,扩容的时候也是要求是2的指数次方,另外我的负载因子是2/3,扩容时机比这位HashMap老哥更早一些”9Aa28资讯网——每日最新资讯28at.com

C#帝国代表HashTable听闻也起身发言:“我的初始容量是3,至于负载因子嘛,我经过大量实验测试,得出的数据在两位之间,是0.72。容量大小方面我就没有2的指数次方的要求了,而是要求一个素数。之所以要求素数的原因,是因为我使用的求模运算进行的映射,使用素数的话,冲突会少一些。”9Aa28资讯网——每日最新资讯28at.com

这时,C++帝国代表unordered_map也说话了,“巧了!我也是素数哎,你看,我提前把容量都算好存起来了,到时候扩容就挨个取就行了。”9Aa28资讯网——每日最新资讯28at.com

图片图片9Aa28资讯网——每日最新资讯28at.com

尾声

时间过的很快,在大家热情的讨论中,一上午时间很快就结束了。9Aa28资讯网——每日最新资讯28at.com

大会临近尾声,秘书长致辞宣布:“感谢各位代表积极探讨,大会取得圆满成功,本次大会到此结束,咱们下次再会!”9Aa28资讯网——每日最新资讯28at.com

会场再次传来一阵热烈的鼓掌声······9Aa28资讯网——每日最新资讯28at.com

然而就在此时,会场外突然传来一个声音:“举办如此盛会,怎能少了我”9Aa28资讯网——每日最新资讯28at.com

众人望去,皆叹:“他果然还是来了”9Aa28资讯网——每日最新资讯28at.com

9Aa28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-87483-0.html哈希表哪家强?几大编程语言吵起来了!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 事务钩子函数,打造高效支付系统

下一篇: Java 中的 HTTP 客户端库OkHttp、Apache HttpClient和HttpUrlConnection

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
Top