【问题标题】:Optimal storage for string/integer pairs with fast lookup of strings?快速查找字符串的字符串/整数对的最佳存储?
【发布时间】:2013-04-22 16:48:09
【问题描述】:

我需要维护字符串和整数之间的对应关系,然后查找字符串值并返回整数。满足以下要求的存储此信息的最佳结构是什么:

  • 速度和内存大小按顺序很重要。

  • 我不想重新发明轮子并编写自己的排序例程。当然,调用 Sort(CompareFunction) 就可以了。

条件:

  • 整数不保证是连续的,也不存在像 0 或 1 这样的“起始值”

  • 数据对的数量可以从 100 到 100000 不等

  • 数据都是一开始就读入的,没有后续的增删改查

  • FWIW 字符串是 Outlook (MAPI?) 用来识别条目的十六进制条目 ID。示例:00000000FE42AA0A18C71A10E8850B651C24000003000000040000000000000018000000000000001E7FDF4152B0E944BA66DFBF2C6A6416E4F52000487F22

有这么多选项(TStringList(带有对象或名称/值对)、TObjectList、TDictionary,...),我最好先征求意见...

我读过How can I search faster for name/value pairs in a Delphi TStringList? 建议字符串/字符串对使用 TDictionary,Sorting multidimensional array in Delphi 2007 建议字符串/整数使用 TStringlist 对象,但对整数进行排序。

【问题讨论】:

  • 我会说一条记录,例如type TNamedInt = record Name: String; Value: Integer; end;,然后是它的数组type TNamedInts = Array of TNamedInt,然后您可以通过各种方法(例如Lookup(Name: String): Integer;)自行查找/操作它
  • @JerryDodge 如果您实际上没有为Lookup 提供实现,那么说这样的话很容易。更重要的是,您选择用来使Lookup 高效的算法可能会很好地影响底层数据结构。字典是一个很好的例子。
  • @David 的确,这就是为什么我离开的原因是以“我会说”开头的评论,而不是好像说“就是这样”的答案。
  • *留下它(提醒我在喝完咖啡之前不要打字)

标签: delphi data-structures storage delphi-xe2


【解决方案1】:

您在问题中包含的第二个链接不适用。这是一个关于排序而不是有效查找的问题。尽管您在问题中多次讨论排序,但您不需要排序。您的要求只是一个字典,也称为关联数组。当然,您可以通过对数组进行排序并使用二进制搜索进行查找来实现这一点,但排序不是必需的。你只需要一本高效的字典。

开箱即用,最有效和最方便的数据结构是TDictionary<string, Integer>。这具有 O(1) 的查找复杂性,因此可以很好地扩展到大型集合。对于较小的集合,具有 O(log n) 查找复杂度的基于二分查找的查找可能具有竞争力,并且确实可以胜过字典。

Cosmin Prund 在 SO 上写了一篇出色的 answer 在这里他比较了字典查找与基于二分查找的查找的性能。我建议你读一读。我想说,对于小型容器,性能对你来说可能不是什么大问题。因此,即使二进制搜索可能更快,它也可能无关紧要,因为无论哪种方式你的性能都很好。但是性能可能会成为较大容器的问题,而这正是字典总是更强大的地方。对于足够大的容器,二分查找的性能可能会变得无法接受。

我确信可以产生比 Embarcadero 更高效的字典实现,但我还要说 Embarcadero 实现非常可靠。它使用了一个不错的哈希函数,并且没有任何明显的弱点。

就内存复杂性而言,字典和排序数组之间几乎没有选择余地。无法改进排序数组以供内存使用。

我建议您从TDictionary<string, Integer> 开始,如果您的性能要求未得到满足,请仅在此范围内查看。

【讨论】:

    【解决方案2】:

    您似乎要查找长的均匀分布的字符串。对于此类问题,最快的数据结构之一是Trie

    但是您的数据集大小相当小,而现成的 Delphi 解决方案,如 THashedStringList 或 TDictionary(更方便)将提供相当高的速度。

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多