ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-3-19 20:30 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
哈希表原理和实现
  论坛中几乎从未见到应用哈希表的实例,就连名字,估计很多人还陌生,但说字典,相信大家都不陌生吧!其实,字典内部就由哈希表构建的。其实,哈希表并不复杂。这里,将介绍哈希表的原理,并应用于实用。
哈希表是什么
  先看下面一个表
  
下标
  
A数组
B数组
1
山菊花
总版主
2
南宫飘雪
帅哥
3
小龙女
神仙姐姐
从数组的结构,知道了下标,就可以直接找到数组值,反过来,有没有一种数据结构,知道“山菊花”对应的下标1,“小龙女”对应的下标为3?直接的数据结构是没有的,只有靠算法构造这种结构,这个算法就是哈希表。有了这种数据结构,可以得到山菊花→总版主,南宫飘雪→帅哥……
数组的下标是有序的整型类型,当然是不重复的,而这种构造的数据结构,其“下标”(这里称为Key)为不重复的文本类型(或者可以看成是文本类型的数据结构),数组添加内容,直接在最底端下面添加即可;而这种数据结构,则需要检查Key是否在前面是否已经存在,不存在才能添加。
哈希表原理
要完成这种数据结构的查询,需要建立一个索引数组,这个数组就叫哈希表(Hash_Table),它的范围要比这种数据结构大,其大小为Count_Table,哈希表是指向这种数据结构的下标,它是一个整型的数组。
每一个Key,都可以转化为一个数字,如“A”的ASC码为65,虽VBA没有直接转换一个字符串为数字,幸好ntdll.dll提供了一个哈希函数直接转换。哈希表添加一个Key,首先把它转换为数值,然后对Count_Table取余,得到H值,检查Hasptable(H)是否为空,为空则说明Key不存在,可以添加,项目数量增加1,增加项目内容,同时把Count赋值给Hasptable(H);否则说明Key可能已经存在。判断Keys(Hasptable(H))和Key是否相同,相同说明Key已经存在,否则按一定的方式改变H,重复查找。
改变H有多种方法,常见的有三种:定长增量、随机增加、1^2,2^2,3^3…序列增加等,这里用的是最后一种。
实现方法
说了这么多,其实代码很简单。整个代码放在独立一个模块里,声明哈希函数,私有变量哈希表Hasptable&()、哈希表大小HaspCount&、哈希值H&,公有变量哈希值Count&,以及一个方法初始化哈希表Init,两个函数添加项目Add()、取得条目在Keys的位置GetX(),如果为0表示条目不存在。具体详见附件。
应用实例
根据这种数据结构的不重复性及取得某Key在Keys的位置,处理不重复都很方便。从以下三个例子,是不是和字典有着曾似相识的感觉?
实例一,分别对二组数进行去重复,再求交集。
实例二,分类汇总实例。
实例三:
http://club.excelhome.net/forum.php?mod=viewthread&tid=1401931&page=1#pid9445093
应用探讨
哈希表提供了三个方法Init、Add、GetX,哈希表大小一定要比Keys大,哈希查找实质查找哈希表的空位置,当空位置剩下25%时,速度明显下降,当然,取太大占用内存也浪费,一般是Keys的1.3倍以上。Add和GetX其实很相似,都分三步:1、求哈希值,2、判断该位置是否为空;3、按一定方式改变哈希值。最不利的极端情形为所有的Key都有相同的H值,本程序采用的是平方序列,对1000个数值测试仍然不会崩溃,只是代价太高。正常情况下,平均每个查找1.7次。
字典原理实际就是哈希表,直接用哈希表能更加快速、灵活,更加赤裸裸,特别是在处理大数据时候。

哈希表.rar

25.38 KB, 下载次数: 746

评分

13

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-3-19 21:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-3-19 22:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 Moneky 于 2018-4-20 22:18 编辑

火钳刘明,谢谢分享,学习了!
前排广告位出租,欢迎垂询。




TA的精华主题

TA的得分主题

发表于 2018-3-19 23:14 | 显示全部楼层

Sub aa()
'mscorlib.dll
Dim asa As Object
Set asa = New Hashtable
asa.Add "1", "wang"
asa.Add "2", "ddd"

End Sub

TA的精华主题

TA的得分主题

发表于 2018-3-20 00:50 | 显示全部楼层
64位中这个StrPtr数据类型不匹配怎么解决呢

TA的精华主题

TA的得分主题

发表于 2018-3-20 08:50 | 显示全部楼层
看最后一句才明白,但仅明白最后一句。先收藏。

TA的精华主题

TA的得分主题

发表于 2018-3-20 19:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-3-20 23:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-3-20 23:02 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-3-21 09:18 | 显示全部楼层
知道哈希表的人还是不少,精通原理的就很少了。

把哈希表用在VBA代码中的,我印象中之前只有灰袍法师、三坛老窟这2个人。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 11:59 , Processed in 0.039494 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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