本帖最后由 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、不能设置字典容量,因为使用字典之前基本可以估计字典的容量,扩容对速度会降低。
|