Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 类数组数据结构性能_Arrays_Performance_Data Structures - Fatal编程技术网

Arrays 类数组数据结构性能

Arrays 类数组数据结构性能,arrays,performance,data-structures,Arrays,Performance,Data Structures,我正在尝试优化一个被大量使用的数据结构。现在,这个数据结构被实现为一个复合节点的动态数组。典型的用法是从第一个元素到最后一个元素的顺序访问,读取和修改组成值(整数和双精度)。典型的数组大小为10到200个元素。另一种类型的操作是插入/删除此数组的元素。经过一些分析后,我发现插入在整体算法性能方面非常昂贵,因此我决定将此数组更改为以下两种数据结构之一: 指向元素的指针数组 指向另一个包含实际元素的数组的索引数组 这样,我将只在索引/指针数组中执行插入和删除操作,这要便宜得多 第二个数据结构比第一个

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

  • 指向元素的指针数组
  • 指向另一个包含实际元素的数组的索引数组
  • 这样,我将只在索引/指针数组中执行插入和删除操作,这要便宜得多

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

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

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

    具体地说,您说的用法是遍历列表、插入和删除。如果插入是在开始、结束或迭代器处完成的,那么链表可以在固定时间内完成所有插入。您的需求似乎不包括随机访问或订购


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

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


    我建议删除以“…50字节”结尾的句子。这会分散你问题的注意力。我也在后来删除的答案中发布了这一点:“我忘了提到,我想对元素进行O(1)随机访问。同样,喜欢的列表会将元素保留在不同的内存区域。”(引用至关重要)@David I认为这对于估计总体阵列大小并将其与处理器缓存大小进行比较可能很重要。现在删除了。插入是多么昂贵,目前?”戴维说,使unService的部分需要30%的时间,而进行顺序处理的部分需要70%的时间。插入/删除可以在随机的地方进行:在开始、结束和中间。这是不可预测的。迭代是另一种在另一时间完成的使用模式。但是迭代总是从第一个元素到最后一个元素。有时还有第三种使用模式需要随机访问数组元素。这很有趣。我会调查的。谢谢