我有一个选择。
我有许多需要存储和访问的已排序字符串。看起来我可以选择使用:
一个 TStringList
字符串的动态数组,以及
字符串的链接列表(单链接)
艾伦在他的评论中建议我也添加选择:
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 实现?