【问题标题】:Array-like datastructure performance类似数组的数据结构性能
【发布时间】:2011-01-09 18:32:42
【问题描述】:

我正在尝试优化一个被大量使用的数据结构。现在这个数据结构被实现为复合节点的动态数组。一个典型的用法是从第一个元素到最后一个元素的顺序访问,读取和修改组成值(整数和双精度值)。典型的数组大小为 10 到 200 个元素。另一种类型的操作是插入/删除该数组的元素。经过一些分析后,我发现插入在整体算法性能方面非常昂贵,因此我决定将此数组更改为两种数据结构之一:

  1. 指向元素的指针数组
  2. 另一个包含实际元素的数组的索引数组

这样我只会在索引/指针数组中进行插入和删除,这要便宜得多。

第二个数据结构比第一个复杂得多,它需要额外的操作来避免元素数组中的重新分配,但它会将所有元素保持在同一个内存区域中,我认为这对于处理器缓存会更好。 我的问题是哪种方式更好?实现 2 个变体以将所有数组元素保留在同一内存区域中的最佳方法是什么?

【问题讨论】:

  • 我建议删除以“...50 bytes”结尾的句子。这会分散您问题的本质。
  • 还在一个我后来删除的答案上发布了这个:“我忘了说,我想对元素进行 O(1) 随机访问。还喜欢的列表会将元素保存在不同的内存区域中。” (引用至关重要)
  • @David 我在想这对于估计整体数组大小并将其与处理器缓存大小进行比较可能很重要。现已删除。
  • 目前插入有多贵?
  • @David 进行取消插入的部分需要 30% 的时间,而进行顺序处理的部分需要 70% 的时间。

标签: arrays performance data-structures


【解决方案1】:

有一种非常优雅的数据结构,称为分层向量,它支持 O(1) 最坏情况查找、O(1) 摊销附加和 O(sqrt n) 摊销插入结构中的任何点。此外,它非常节省内存,在任何时候都只浪费 O(sqrt n) 开销(与动态数组的 O(n) 开销相比)。我不知道这在您的特定情况下会有多大用处,但可以在此处找到描述:

http://www.cs.brown.edu/cgc/jdsl/papers/tiered-vector.pdf

【讨论】:

  • 这很有趣。我会调查一下。谢谢。
【解决方案2】:

您是否考虑过使用skip list,特别是“可索引的跳过列表”?可索引的跳过列表为您提供 O(logn) 插入、删除和查找操作。此外,它类似于当前基于数组的实现,因此不会从根本上改变对数据结构的思考方式。

【讨论】:

    【解决方案3】:

    插入/删除是如何完成的还不清楚,但根据您当前的描述,您应该使用简单的链表。

    具体来说,你说的使用是遍历列表,插入和删除。如果插入是在开头、结尾或迭代器中完成的,那么链表可以在恒定时间内完成所有这些操作。您的要求似乎不包括随机访问或排序。

    如果您真的担心处理器缓存(此时,您可能不应该担心),您可以从基于数组的池中分配列表节点。

    【讨论】:

    • 插入/删除可以在任意位置进行:开头、结尾和中间。这是不可预测的。迭代是另一种使用模式,它在另一个时间完成。但是迭代总是从第一个元素到最后一个元素。有时还会出现第三种使用模式,它需要随机访问数组元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多