行将开播:4月29日,民生银行郭庆谈商业银行金融科技赋能的探求与实际
哈希表华山论剑
比特宇宙编程言语结合委员会预备举行一次大会,主题为哈希表,给各大编程言语帝国都发去了约请函,很快就到了大会这一天。
结合委员会秘书长收场发言:“诸位,为促进技术交流与开展,增强各帝国友谊,结合委员会特设此盛会,感谢诸位的捧场”
会场传来一阵鼓掌声······
秘书长继续发言:“本次大会的主题是哈希表,人类顺序员运用最多的数据容器之一,各大编程言语帝国置信都有完成。明天的大会就围绕哈希表分为几个议题讨论,首先是第一个议题:存储结构与抵触处置”
存储结构与抵触处置
来自GoLang帝国的map率先发言:“哈希表,哈希表,首先得是个表嘛,所以最基本的要用一个数组来存储,数组中的每一个元素叫做bucket。至于hash抵触嘛,就用链表来处置嘛”
GoLang帝国的map说完,有人站了起来:“英雄所见略同!在下C++帝国的unordered_map,我们基本上也是选择的这种办法”
此时,Python帝国的代表提出了质疑:“链表确实可以处置抵触,不过嘛,这要是抵触太多,链表太长,搜索起来岂不费时?”
GoLang帝国的map和C++帝国的unordered_map面面相觑,不知如何应对。
“链表太长的话,那就转成树结构!”,就在这时,又有人站了起来。
见有人起身,Python帝国代表转身问道:“在下乃Python帝国的字典dict{},敢问阁下怎样称呼”
“我是Java帝国的HashMap,和前面两位兄台的策略大体相反,只是在抵触过多,详细来说链表长度超过8的时分就转换成红黑树的结构,以此加快查找”
说完,map、unordered_map松了一口吻,和HashMap一同坐下了。
dict{}继续提问:“在座的都是这个思绪,用链表处置抵触?”
说完,另外一位代表站了起来,“等等,我们C#帝国的HashTable就没用链表!”
dict{}显露了称心的表情,“那你们是怎样处置抵触的呢?”
“咱HashTable外部运用的是双重散列法,咱外部不止一种哈希计算方式,一次Hash抵触,咱就换一个再算,直到找到有空位的中央存储”,HashTable回答到。
dict{}看起来有些绝望,估量这也不是他所用的方式。
“你问了半天,还没说你们Python是怎样处置抵触的呢?”,Java帝国的HashMap启齿了。
“是啊,是啊”,其他代表也跟着起哄。
见众人起哄,dict{}只好应对:“链表法固然不错,不过需求在插入数据进程中静态分配内存构建链表节点,开支不小,我们没有采用。”
“那究竟用了啥,你倒是说啊,快急死我了”,C++的unordered_map有些急了。
“我们用的是一种叫开放寻址法的策略,假设发现了抵触,就按照制定的策略从这个位置往后找,直到找到有空的位置存储”,dict{}继续说到。
“哪有那么复杂的事,你把别人的位置占了,那对应那个位置的数据来了怎样办?还有查找怎样找?删除怎样处置?这不全乱套了吗”,unordered_map追问不舍。
“是这样的,按照我们既定的规则,在查找的时分就需求额外做一些任务,另外删除的时分也不能直接删除,否则会破坏规则链条·····”,接上去一段时间,dict{}给大家细心引见了他们的处置思绪。
“你这个也太费事了,不如我们链表法来的明晰明了”
“这怎样就费事了?这益处不不言而喻嘛?”,dict{}也不甘示弱。
这时,秘书长打断了大家的争辩:“诸位,诸位,静一静,静一静,我们这个议题到此为止,进入下一个议题:哈希到位置映射”
哈希到位置映射
急性子的C++帝国代表unordered_map第一个说话:“这有什么好讨论的,不就是用hash值对哈希表数组长度停止一个求模运算吗?”
“就是,这有什么好讨论的”,C#帝国的HashTable也附和到。
“哎,此言差矣,我就没用取模运算”,众人望去,这Python帝国的dict{}又要闹什么新颖玩意。
GoLang帝国的map问道:“老哥用的什么办法,别卖关子了,快说来听听”
dict{}扫了众人一眼说到,“我的办法就是:”
这是怎样个映射法?众代表皆摸不着头脑,议论纷繁,唯有Java帝国的HashMap听闻悄然一笑。
dict{}见状问道:“HashMap兄台,莫非知晓其中玄机?”
(责任编辑:admin)