加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi中的TStringList,动态数组或链表?

发布时间:2020-12-15 04:30:54 所属栏目:大数据 来源:网络整理
导读:我有一个选择 我有一些已经订购的字符串,我需要存储和访问.看起来我可以选择使用: 一个TStringList 一个动态数组的字符串,和 链接的列表(单链接) 艾伦在他的评论中建议我也加上选择: TList string 每个人在哪些情况下比别人更好? 哪个最适合小名单(10项以
我有一个选择

我有一些已经订购的字符串,我需要存储和访问.看起来我可以选择使用:

>一个TStringList
>一个动态数组的字符串,和
>链接的列表(单链接)

艾伦在他的评论中建议我也加上选择:
> TList< string>

每个人在哪些情况下比别人更好?

哪个最适合小名单(10项以下)?

哪个最适合大名单(超过1000项)?

哪个是最好的巨大名单(超过1,000,000项)?

哪个是最好的最小化内存使用?

哪个最小化加载时间来添加额外的项目?

哪个最佳访问时间最少可以从头到尾访问整个列表?

在这个基础上(或任何其他的),哪个数据结构会更好?

作为参考,我使用的是Delphi 2009.

Dimitry在评论中说:

Describe your task and data access pattern,then it will be possible to give you an exact answer

好的.我有一个有很多数据的谱系程序.

对于每个人,我有一些事件和属性.我将它们存储为短文本字符串,但是对于每个人来说,它们有很多,范围从0到几百.我有数千人.我不需要随机访问它们.我只需要按照附加到每个人的已知顺序将它们作为一些字符串关联.这是我的数千个“小列表”的情况.他们需要时间来加载和使用内存,如果我需要它们(例如导出整个生成的报告),需要时间访问.

然后我有几个较大的列表,例如我的“虚拟”树视图的所有部分的名称,可以有成千上万的名字.再次,我只需要一个列表,我可以通过索引访问.这些与树视图分开存储以获得效率,treeview仅在需要时检索它们.这需要一段时间才能加载,对于我的程序而言非常昂贵的记忆.但是我不必担心访问时间,因为一次访问只有几个.

希望这能给你一个我想要完成的想法.

附:我在StackOverflow上发布了很多关于优化Delphi的问题.我的程序读取25 MB文件与100,000人,并创建数据结构和报告和树视图为他们在8秒钟,但使用175 MB的RAM这样做.我正在努力减少,因为我打算在32位Windows中加载数百万人的文件.

我刚刚在StackOverflow问题中找到了一些优化TList的优秀建议:
Is there a faster TList implementation?

解决方法

除非您有特殊需求,否则TStringList很难击败,因为它提供了许多组件可以直接使用的TStrings接口.使用TStringList.Sorted:= True,将使用二进制搜索,这意味着搜索将非常快.您还可以免费获取对象映射,每个项目也可以与指针相关联,并且您可以获取所有现有的编组方法,流接口,逗号文本,分隔文本等.

另一方面,为了特殊需要,如果需要做许多插入和删除,那么接近链表的东西会更好一些.但是搜索变得越来越慢,这是一个罕见的字符集,确实不需要搜索.在这种情况下,通常使用某种类型的哈希,其中创建哈希,例如,字符串的前2个字节(预分配长度为65536的数组,并且字符串的前2个字节直接转换为哈希)索引在该范围内),然后在该哈希位置,存储链表,每个项目键由字符串中的剩余字节组成(以节省空间—散列索引已经包含前两个字节).然后,初始哈希查找是O(1),后续的插入和删除是快速链接的.这是可以操纵的权衡,杠杆应该是明确的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读