Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71051
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 87
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-06 22:00
文章分类

全部博文(7)

文章存档

2019年(4)

2018年(1)

2014年(2)

我的朋友

分类: C/C++

2019-03-18 13:08:47

开发工具:BCB 6.0
TStringGrid是BCB 6.0的一个控件,开发中经常用于显示数据查询结果,但是其本身不支持插入、删除操作,需要开发者自己实现。
最简单的实现思路:
1.插入时,把插入行后边的行都往下移一行,总行数+1
2.删除时,把删除行后边的行都往上移一行,总行数-1
明显,最坏情况下,每一次插入或删除操作的时间复杂度都是o(n)的,对于只有几百行数据的情况,没什么问题,但是对于有几十万行数据的情况,软件很可能会卡。

有什么改进方法吗?google了好几次之后,我找到了一个Stack Overflow的帖子:

里边的这段话给了我提示:
The fastest way to use a TStringGrid is using OnGetValue/OnSetValue.
This way only the t e x t of visible cells are requested dynamically.
Adding and removing rows is then lighting fast, otherwise
TStringGrid is very slooow when you have more than 5000 records.
This way I can fill and clear a grid with 700.000 records within a second!
实现思路是:自己实现一个数据结构来管理数据,然后在TStringGrid的OnDrawCell事件中动态获取对应单元格的文本,再画到对应位置。
数据结构提供3个接口:
1.在第i行插入数据的接口
2.删除第i行数据的接口
3.查第i行数据的接口
使用修改后的AVL树这3个接口都可以做到o(log(n)),于是完美解决问题。

封装了一个控件,仅供参考:


关键词:数据结构在软件开发中的应用、OnDrawCell事件的妙用

阅读(3343) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~