Vector 向量<;向量>;作为一种快速遍历的二维数据结构
我目前正在考虑实现一个2D数据结构,以允许我以正确的Z顺序存储和绘制对象(GDI+,实体以调用顺序绘制)。这些要求大致如下:Vector 向量<;向量>;作为一种快速遍历的二维数据结构,vector,data-structures,time-complexity,Vector,Data Structures,Time Complexity,我目前正在考虑实现一个2D数据结构,以允许我以正确的Z顺序存储和绘制对象(GDI+,实体以调用顺序绘制)。这些要求大致如下: 能够将新对象添加到任何深度索引的顶部 删除任意对象的能力 (能够将对象移动到新深度索引的顶部,通过以上两点完成) 快速顺序和反向顺序遍历 由于主要要求是遍历整个数据的速度,所以首先想到的是类似数组的结构,例如vector。它还可以轻松地推送新对象(删除不太好的对象…)。这非常适合我们的需求,因为碰巧大部分可绘制实体没有改变,而那些确实位于订单的顶端 然而,这让我想到了
- 能够将新对象添加到任何深度索引的顶部
- 删除任意对象的能力
- (能够将对象移动到新深度索引的顶部,通过以上两点完成)
- 快速顺序和反向顺序遍历
- 向量将根据需要调整自身大小->因为“深度”向量需要在内存中连续维护(顶级向量强制执行),这可能会导致一些非常昂贵的向量大小调整。最坏情况下,所有向量都需要移动到新的内存位置,而平均情况下,链上的所有向量都需要移动
- 向量通常会在末尾保留一个缓冲区,用于添加新对象->遍历仍然可以在“深度”向量之间跳跃时轻松强制缓存未命中,从而降低顶级向量的连续内存的利用率
另外,我刚刚注意到我完全忽略了空间复杂性,所以不妨继续忽略它(除非您想添加更多细节:D)我想链表更合适,因为您将始终遍历整个列表(向量适合随机访问)。链表的插入和删除非常便宜,遍历与向量遍历没有什么不同。也许你应该考虑一个双链表,因为你想用两种方法来遍历它。 你的第一个假设有点不正确。 与其把向量看作内存本身的blob,不如把它看作指向自动管理的内存blob的指针,以及跟踪它的一些元数据。向量本身是固定大小的,它跟踪的内存不是。(请参见此示例,注意向量对象的大小是恒定的:)
向量向量可以看作是指针数组。调整指针指向的大小并不意味着需要调整包含指针的数组的大小。项连续的承诺仍然成立:父数组的所有指针彼此相邻,每个指针指向一个连续的内存块。但是,不能保证
arr[0][N-1]
的结尾与arr[1][0]
的开头相邻。(为此,您的第二点是正确的。)Aaaaah,因此向量实际上只是内存块的句柄,保证是连续的。实际上,这意味着唯一真正连续的内存多维结构将是一个数组,这使得对保持向量的随机访问(如果我们想要动态添加/删除向量,则可能是插入)成为唯一有意义的度量。