【发布时间】:2015-09-17 16:42:27
【问题描述】:
我目前正在考虑实现 2D 数据结构,以允许我以正确的 Z 顺序存储和绘制对象(GDI+,实体按调用顺序绘制)。要求很宽松:
- 能够将新对象添加到任何深度索引的顶部
- 能够删除任意对象
- (能够将对象移动到新深度索引的顶部,由以上 2 点完成)
- 快速的中序和逆序遍历
由于主要要求是遍历完整数据的速度,所以首先想到的是一个类似数组的结构,例如。向量。它还很容易允许推送新对象(删除不太好的对象..)。这完全符合我们的要求,因为碰巧大部分可绘制实体没有改变,而那些确实位于顺序的顶端。
但它让我想到了更多动态需求的含义:
- 向量将根据需要调整自身大小 -> 因为“深度”向量需要在内存中连续维护(顶级向量强制执行),这可能会导致一些非常昂贵的向量调整大小。最坏的情况下,所有向量都需要移动到新的内存位置,平均情况需要移动链上的所有向量。
- 向量通常会在末尾保留一个缓冲区以添加新对象 -> 在“深度”向量之间跳转时,遍历仍然很容易导致缓存未命中,从而降低顶级向量的连续内存的益处
有人可以确认这些观察确实是正确的,使向量成为存储更大动态数据集的最昂贵的结构吗?
根据我上面的想法,我最终推断出,在遍历整个数据集时,特别是在顶级向量中的不同向量之间跳转时,您不妨使用具有较低遍历复杂度或类似随机访问复杂度的任何其他数据结构(链接列表;地图)。遍历实际上是相同的,因为我们不妨假设缓存未命中无论如何都会发生,并且通过不在内存中连续保存深度向量,我们可以省去很多麻烦。
这确实是一个好的解决方案吗?如果我没记错的话,在一维问题空间中,这将归结为更重要的遍历或添加/删除、向量或链表。在 2D 空间中,我不太确定它是否如此黑白。
我想知道什么样的应用程序需要在 2D 空间中进行良好的遍历,而不影响数据添加/删除,以及那里使用什么样的数据结构。
附:我刚刚注意到我完全忽略了空间复杂性,所以不妨继续忽略它(除非你想增加更多洞察力:D)
【问题讨论】:
标签: vector data-structures time-complexity