ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: Zamyi

[分享] 哈希表原理和实现

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-4-10 07:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2018-4-10 07:43 编辑

真正的哈希表比这个要复杂得多,至少要解决碰撞问题才能谈到实用性
https://kb.cnblogs.com/page/189480/

从头到尾彻底解析Hash表算法

TA的精华主题

TA的得分主题

发表于 2018-4-10 07:25 | 显示全部楼层
本帖最后由 liucqa 于 2018-4-10 07:32 编辑

https://blog.csdn.net/vking_wang/article/details/14166593
HashMap实现原理分析

这里HashMap里面用到链式数据结构的一个概念。上面我们提到过Entry类里面有一个next属性,作用是指向下一个Entry。打个比方, 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?HashMap会这样做:B.next = A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起。所以疑问不用担心。也就是说数组中存储的是最后插入的元素。到这里为止,HashMap的大致实现,我们应该已经清楚了。

TA的精华主题

TA的得分主题

发表于 2018-4-10 07:26 | 显示全部楼层
本帖最后由 liucqa 于 2018-4-10 07:35 编辑

https://blog.csdn.net/vking_wang/article/details/14166593

哈希表的数组是定长的,如果太大,则浪费,如果太小,体现不出效率。合适的数组大小是哈希表的性能的关键。哈希表的尺寸最好是一个质数。当然,根据不同的数据量,会有不同的哈希表的大小。对于数据量时多时少的应用,最好的设计是使用动态可变尺寸的哈希表,那么如果你发现哈希表尺寸太小了,比如其中的元素是哈希表尺寸的2倍时,我们就需要扩大哈希表尺寸,一般是扩大一倍。
下面是哈希表尺寸大小的可能取值:
17,            37,          79,        163,          331,
673,           1361,        2729,       5471,         10949,
21911,          43853,      87719,      175447,      350899,
701819,         1403641,    2807303,     5614657,     11229331,
22458671,       44917381,    89834777,    179669557,   359339171,
718678369,      1437356741,  2147483647

TA的精华主题

TA的得分主题

发表于 2018-4-10 08:14 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-4-10 13:27 | 显示全部楼层
就是给Key找个合适的索引号,这应该是数学问题,其他的很简单吧。
我测试声明很大很大的哈希表数组也没对运行效率有什么影响反而比楼主的*1.33还要快些,可能是少了几次Do吧。估计现在机器内存都不是问题,大点也没关系毕竟又不在其中循环。

TA的精华主题

TA的得分主题

发表于 2018-4-10 15:07 | 显示全部楼层
liucqa 发表于 2018-4-10 07:24
真正的哈希表比这个要复杂得多,至少要解决碰撞问题才能谈到实用性
https://kb.cnblogs.com/page/189480/
...

不知老大所指的“真正的哈希表”是啥样的,我觉得楼主的这个哈希表已经解决了碰撞问题,如果理解了其运行机制,在针对大数据处理时,还是相当之实用的。

TA的精华主题

TA的得分主题

发表于 2018-4-10 15:20 | 显示全部楼层
liucqa 发表于 2018-4-10 07:26
https://blog.csdn.net/vking_wang/article/details/14166593

哈希表的数组是定长的,如果太大,则浪费 ...

笼统的说哈希表的尺寸最好是一个质数,是没有根据的。当使用链表法解决冲突时,哈希表尺寸是否质数根本无关紧要,而用线性探测法解决冲突,用质数作为哈希表尺寸,其目的就是防止无限循环的探测,如果你设计的探测函数本身就能避免无限循环探测,就将没必要一定使用质数做哈希表的尺寸了。

TA的精华主题

TA的得分主题

发表于 2018-4-10 17:51 | 显示全部楼层
三坛老窖 发表于 2018-4-10 15:20
笼统的说哈希表的尺寸最好是一个质数,是没有根据的。当使用链表法解决冲突时,哈希表尺寸是否质数根本无 ...

哈希表已经是成熟技术了,所以没必要重复造轮子。

顺便说一下,在我看来,楼主的代码更像是数组而不是哈希表。

其它的问题,建议你看看我给的三个链接里面的算法和代码,如果能翻译成完整的vba代码,也算是好事了。

TA的精华主题

TA的得分主题

发表于 2018-4-10 19:51 | 显示全部楼层
liucqa 发表于 2018-4-10 17:51
哈希表已经是成熟技术了,所以没必要重复造轮子。

顺便说一下,在我看来,楼主的代码更像是数组而不是 ...

呵呵,老大你是挣钱挣糊涂了吧。

哈希技术是成熟技术,这个没错,就像从多算法技术一样,在许多项目中早已得到成熟的应用。至于有没有必要重复造轮子,不知轮子是啥意思?我映象中轮子是泛指李洪志的“法轮功”。我猜你说的是指用不着在此介绍哈希原理。如果我猜的没错,则我不认同你的观点,理由如下:
1、虽然对专业人员来说,这算不得什么高难的技术,但对我等非专业人员来说,要理解并掌握这项技术也非易事。当年法师的贴和你给出的连接中的内容(以前看过),我看过几遍后,都是似懂非懂的,直到某一天才突然想通的。
2、掌握该项技术后,可轻松搞掂对大数据量处理的问题,而大数据量处理的问题,在VBA板块中的求助帖,占有相当的比例。

我倒是认为,介绍此类原理的技术贴,却是老大你的职责所在(学导的字面理解)。

“楼主的代码更像是数组而不是哈希表”?哈希表本身就是数组呀,我没见过不是数组的哈希表。

TA的精华主题

TA的得分主题

发表于 2018-4-10 20:21 | 显示全部楼层
“字典内部就由哈希表构建的”,说的不够严密,大家常用VBScript字典,据我测试推断,其内部肯定不是由哈希表构建的,估计是B+之类的平衡树。

我看了你的介绍,也是一头雾水,觉得不好理解,希望楼主的叙述更加严密些,最好多配一些图片来说明。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-3 04:12 , Processed in 0.030377 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表