类似数组的数据结构性能

时间:2011-01-09 18:32:43

标签: arrays performance data-structures

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

  1. 指向元素的指针数组
  2. 包含实际元素的另一个数组的索引数组
  3. 这样我只会在索引/指针数组中进行插入和删除,这样便宜得多。

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

3 个答案:

答案 0 :(得分:1)

有一种称为分层向量的非常优雅的数据结构,它支持O(1)最坏情况查找,O(1)摊销附加,以及O(sqrt n)在结构中任何一点的摊销插入。此外,它的内存效率非常高,在任何时候都只消耗O(sqrt n)开销(与动态数组的O(n)开销相比)。我不知道在您的特定实例中这可能有多大用处,但可以在此处找到说明:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

插入/删除的完成方式有点不清楚,但根据您当前的描述,您应该使用简单的链接列表。

具体来说,你说使用是在列表中迭代,插入和删除。如果插入在开始,结束或在迭代器处完成,则链接列表可以在恒定时间内完成所有操作。您的要求似乎不包括随机访问或订购。

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