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