ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 打造自己的字典

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2017-12-18 15:33 | 显示全部楼层 |阅读模式
本帖最后由 Zamyi 于 2017-12-27 16:59 编辑

回想当初学习字典Scripting.Dictionary(以下简称原字典)时候,觉得非常神奇,而且也提高效率,但渐渐地,发觉原字典非常蛋疼,数据多的时候实际是效率非常的低,连二分法查找都不如!今天,让我自己打造自己的字典。
字典的原理
字典对象中的数据结构,有一个Keys数组,一个Items数组和一个贮存索引的数组Hash_Index数组,Keys、Items大于字典数目就行,Hash_Index数组一般要大于2倍速字典数目。每一个Key,也就是每一个字符串,在计算机中都有一个序列号,例如字符“A”可以取其ASC码65。每个序列号k对Hash_Index数组数目整除后,其值贮存为Key在Keys中的序号。于是,知道了k就可直接得到对应的Item。如果k值重复,或者说Hash_Index(k)不为0,那么可以通过某种加密运算得到下一个k值,直到Hash_Index(k)为0,过程中也能够判断Key是否存在于Keys中。
工具
利用ntdll.dll中的Hash把一个字符串转化为一个整数。利用Rnd(-V)得到一个有一定次序的均匀分布的序列。所以整个字典实现也很简单,具体附件。
应用
字典内部贮存pKeys、pItems的数组必需大于或等于字典数目,Hash_Index数组为前者2倍。初始化数量不足时候需要扩容,扩容要破坏Hash_Index,所以定义初始容量能更好的减少运行时间,本字典用SetBudgetCount初始化字典数目。
原字典的Add和Exists内中有做一部分相同的计算,Add中必需包含Exists判断,用if not Exists thenadd真的有点重复,增加一个AddN方法,它不做Key是否存在检查,专门配合if not Existsthen addN使用,当然,用Add也行。原字典Dict(Key)=Item,这种表达方法在VBA真的不知道怎么写,本字典的zDict.Key(Key)=Item,如果Key不存在,就增加条目,否则改写Item。
最后测试,速度真的够爽,原来的Scripting.Dictionary丢到垃圾桶去!亲们,自己试试吧。


更新内容:修改Windows版本问题、Items属性、Keys、Items属性等。
使用方法:解压后导入zDict.cls
Scripting.Dictionary字典的缺点:
1、整型数据太大速度不如转化为字符串格式,象是13位起就开始下降;
2、关键字数目10万以上效率急速下降;
3、Add方法如果关键字存在就出错,加Exists造成重复;
4、不能设置字典容量,因为使用字典之前基本可以估计字典的容量,扩容对速度会降低。

MyDict.rar

1.47 KB, 下载次数: 598

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-12-18 16:06 | 显示全部楼层
set  y = sheets(3).Columns(1).Find(.List(i)),, xlvalues, ,, 2)
出错原因是什么?

TA的精华主题

TA的得分主题

发表于 2017-12-18 16:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-12-18 16:38 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-12-18 16:44 | 显示全部楼层
一脸蒙蔽的看了之后,表示我的水平太low,没看懂。但也支持一下吧。

TA的精华主题

TA的得分主题

发表于 2017-12-18 20:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-12-18 20:42 | 显示全部楼层
这也说明VBA落后了,跟不上时代的发展,都没人维护。

TA的精华主题

TA的得分主题

发表于 2017-12-18 21:28 | 显示全部楼层
这句声明显示红色:
Private Declare PtrSafe Function hash Lib "ntdll.dll" Alias "RtlComputeCrc32" ( _
  ByVal start As Long, ByVal data As LongPtr, ByVal size As Long) As Long
提示缺少Sub或Function

TA的精华主题

TA的得分主题

发表于 2017-12-18 22:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-12-18 23:15 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-12-24 04:15 , Processed in 0.040742 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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