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

lke*_*ler 10 delphi linked-list tstringlist dynamic-arrays data-structures

我有一个选择.

我有许多已经排序的字符串,我需要存储和访问.看起来我可以选择使用:

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

    艾伦在他的评论中建议我也加入选择:

  4. TList<string>

在什么情况下,这些都比其他更好?

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

哪个最适合大型列表(超过1000个项目)?

哪个最适合大型列表(超过1,000,000个项目)?

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

哪个最好最小化加载时间以在最后添加额外的项目?

哪个最好最小化从头到尾访问整个列表的访问时间?

在此基础上(或任何其他),哪种数据结构更可取?

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


Dimitry在评论中说:

描述您的任务和数据访问模式,然后就可以给您一个确切的答案

好的.我有一个包含大量数据的家谱程序.

对于每个人,我有许多事件和属性.我将它们存储为短文本字符串,但每个人都有很多,范围从0到几百.我有成千上万的人.我不需要随机访问它们.我只需要将它们作为连接到每个人的已知顺序的多个字符串相关联.这是我的数千个"小名单"的案例.它们需要时间来加载和使用内存,如果我需要它们,则需要时间来访问(例如,导出整个生成的报告).

然后我有一些较大的列表,例如我的"虚拟"树视图的所有部分的名称,它们可以有数十万个名称.我再次只需要一个可以通过索引访问的列表.它们与树视图分开存储以提高效率,树视图仅在需要时检索它们.这需要一段时间来加载,并且对于我的程序来说,内存非常昂贵.但我不必担心访问时间,因为一次只能访问少数访问时间.

希望这能让您了解我正在努力实现的目标.

ps我在StackOverflow上发布了很多关于优化Delphi的问题.我的程序读取包含100,000人的25 MB文件,并在8秒内为它们创建数据结构和报告以及树视图,但使用175 MB的RAM来执行此操作.我正在努力减少这一点,因为我的目标是在32位Windows中加载数百万人的文件.


我刚刚在StackOverflow问题上找到了一些优化TList的优秀建议: 是否有更快的TList实现?

Cal*_*ngh 10

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

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


da-*_*oft 6

  1. 一个TStringList.优点:具有扩展功能,允许动态增长,排序,保存,加载,搜索等.缺点:通过索引对项目的大量访问,字符串[索引]引入了明显的性能损失(几个百分点),比较访问数组,每个项目单元格的内存开销.

  2. 动态字符串数组.优点:将作为TStrings的动态增长功能与索引的最快访问速度相结合,最大限度地减少其他内存的使用.缺点:有限的标准"字符串列表"功能.

  3. 字符串的链接列表(单链接).优点:将项目添加到列表末尾的线性速度.缺点:索引的最慢访问和搜索,有限的标准"字符串列表"功能,"下一项"指针的内存开销,每个项目内存分配的开销开销.

  4. TList <string>.如上.

  5. TStringBuilder.我没有一个好主意,如何使用TStringBuilder作为多个字符串的存储.

实际上,有更多的方法:

  • 动态数组的链表
  • 哈希表
  • 数据库
  • 二叉树
  • 等等

最好的方法取决于任务.

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

任何人,甚至可能是具有总项数变量的静态数组.

哪个最适合大型列表(超过1000个项目)?哪个最适合大型列表(超过1,000,000个项目)?

对于大型列表,我将选择: - 动态数组,如果我需要通过索引进行大量访问或搜索特定项 - 哈希表,如果我需要按键链接列表搜索动态数组,如果我需要很多项追加并且索引无法访问

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

动态数组会占用更少的内存.但问题不在于开销,而是关于这个开销变得合理的项目数量.然后如何正确处理这些项目.

哪个最好最小化加载时间以在最后添加额外的项目?

动态数组可能会动态增长,但是在大量项目上,内存管理器可能找不到连续的内存区域.虽然链接列表将起作用,直到存在至少一个单元格的内存,但是每个项目的内存分配成本.混合方法 - 动态数组的链接列表应该有效.

哪个最好最小化从头到尾访问整个列表的访问时间?

动态数组.

在此基础上(或任何其他),哪种数据结构更可取?

为了哪个任务?