vector <vector>作为快速遍历的2d数据结构

时间:2015-09-17 16:42:28

标签: vector data-structures time-complexity

我正在考虑实施2D数据结构,以允许我以正确的Z顺序存储和绘制对象(GDI +,实体以调用顺序绘制)。要求很宽松:

  • 能够将新对象添加到任何深度索引的顶部
  • 删除任意对象的能力
  • (能够将对象移动到新深度指数的顶部,由2点以上完成)
  • 快速按顺序和反向顺序遍历

由于主要要求是遍历整个数据的速度,首先想到的是数组结构,例如。向量。它还可以轻松地推送新对象(移除不太好的对象......)。这对我们的要求非常有效,因为大多数可绘制实体都不会改变,而且那些实体位于订单的最高端。

然而,它让我想到了对更具动态要求的影响:

  • 矢量将根据需要调整自身大小 - &gt;由于“深度”向量需要在内存中连续维护(顶层向量强制执行),这可能会导致一些相当昂贵的向量调整大小。最糟糕的情况是,所有向量都需要移动到新的内存位置,平均情况需要移动链上的所有向量。
  • 向量通常会在末尾保留缓冲区以添加新对象 - &gt;在“深度”向量之间跳转时,遍历仍然可以轻易地强制缓存未命中,从而使顶级向量的连续内存不那么有益

有人可以确认这些观察确实是正确的,使得向量成为存储更大动态数据集的非常昂贵的结构吗?

从我上面的想法中,我最终推断出在遍历整个数据集时,特别是在顶层向量中的不同向量之间跳转,您可能还可以使用具有较差遍历复杂性或类似随机访问复杂度的任何其他数据结构(linked_list; map)。 Traversal实际上是相同的,因为我们可能会假设缓存未命中也会发生,并且我们通过不将深度向量连续保存在内存中来节省很多麻烦。

这确实是一个很好的解决方案吗?如果我没有弄错,在一维问题空间上,这将归结为更重要的遍历或添加/删除,向量或链表。在2D空间我不太确定它是如此黑白。

我想知道什么样的应用程序需要在2D空间中进行良好的遍历,而不会影响数据添加/删除,以及在那里使用什么类型的数据结构。

P.S。我只是注意到我完全忽略了空间复杂性,所以不妨忽略它(除非你想增加更多洞察力:D)

2 个答案:

答案 0 :(得分:1)

你的第一个假设有点不正确 不要将向量视为内存本身的blob,而应将其视为指针,以自动管理内存blob和一些元数据来跟踪它。向量本身是固定的大小,它跟踪的内存不是。 (请参阅此示例,请注意矢量对象的大小是常量:https://ideone.com/3mwjRz

矢量矢量可以被认为是指针数组。调整指针指向的大小并不意味着您需要调整包含它们的数组的大小。物品连续的承诺仍然存在:父数组具有彼此相邻的所有指针,并且每个指针指向连续的一块内存。但是,我们无法保证arr[0][N-1]的结尾与arr[1][0]的开头相邻。 (为此,你的第二点是正确的。)

答案 1 :(得分:0)

我想链接列表会更合适,因为您将始终遍历整个列表(向量适用于随机访问)。链接列表插入和删除非常便宜,遍历与矢量遍历没有什么不同。也许你应该考虑一个双向链接列表,因为你想以两种方式遍历它。