ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 使用跳表实现VBA自定义集合类

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-7-16 14:41 | 显示全部楼层 |阅读模式
集合是VBA/VB内置的一个类,类数据结构用的是平衡二叉树和双向链表,关键字用二叉树实现快速插入/删除和查询,二叉树的查找本质是二分查找,查找,插入和'删除的效率都是O(logn),集合的索引位置用的双向链表,时间复杂度是 O(n). 所以,集合操作当涉及索引位置的时候,时间都是比较感人的. 另外,集合还有不能查询关键字是否存在,关键字和位置索引不能互查,Item属性是只读等缺点.

跳表,是一个增加了向前指针的链表,全称叫做跳跃表,简称跳表.跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找.跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。跳表的查询,插入和删除的时间复杂度都是O(logn).

本类CollectionEx使用跳表数据结构模拟VBA的集合Collection,关键字用一个单向跳表,位置索引用一个双向跳表, 实现快速插入/删除以及查询.相对VBA的集合,增加了查询关键字,关键字和位置索引互查,Item属性可读写,以及增加For...Each和Do...Loop两种枚举迭代功能.

两个集合进行比较,所有涉及位置索引的操作,增加,删除还有查询,CollectionEx都比Collection快出好多倍,数据越多,快得越明显. 如果是涉及关键字的操作,还是VBA/VB的集合快,快的倍数恒定,因为二叉树和跳表的时间复杂度都是O(logn),VB的集合用的C语言编写,这是语言本身的速度差异造成的. 如果对速度有高要求,可以考虑用哈希表来处理关键字, 那么关键字的操作应该会比集合快,等有时间再重新编写一个吧.
image.png

Test_CollectionEx.zip

67.86 KB, 下载次数: 50

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-7-16 15:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
挺好的,谢谢分享,学习了

TA的精华主题

TA的得分主题

发表于 2022-7-17 15:06 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-7-17 15:40 | 显示全部楼层
类本身没有使用到任何API, 没有64位的问题. 只有为支持For Each的枚举类中有API, 其实完全可以不支持For Each来枚举, 就可以不用mEnumerator模块, 用Do Loop枚举速度还更快. 如果实在要支持For Each, 自己重新声明API也可以解决, 当然前提是要熟悉COM虚拟表, 回调函数等. 手头没有64位的EXCEL, 我就费事去搞了.

TA的精华主题

TA的得分主题

发表于 2024-3-4 15:29 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-3-4 15:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大型专业项目应该能用上,但论坛上的问题一般用不上,因为替代方法很多。
我是64位系统,目前用不上。

TA的精华主题

TA的得分主题

发表于 2024-3-4 16:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
學習了,不過暫時還用不到
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 11:23 , Processed in 0.038092 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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