Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Vector 向量<;向量>;作为一种快速遍历的二维数据结构_Vector_Data Structures_Time Complexity - Fatal编程技术网

Vector 向量<;向量>;作为一种快速遍历的二维数据结构

Vector 向量<;向量>;作为一种快速遍历的二维数据结构,vector,data-structures,time-complexity,Vector,Data Structures,Time Complexity,我目前正在考虑实现一个2D数据结构,以允许我以正确的Z顺序存储和绘制对象(GDI+,实体以调用顺序绘制)。这些要求大致如下: 能够将新对象添加到任何深度索引的顶部 删除任意对象的能力 (能够将对象移动到新深度索引的顶部,通过以上两点完成) 快速顺序和反向顺序遍历 由于主要要求是遍历整个数据的速度,所以首先想到的是类似数组的结构,例如vector。它还可以轻松地推送新对象(删除不太好的对象…)。这非常适合我们的需求,因为碰巧大部分可绘制实体没有改变,而那些确实位于订单的顶端 然而,这让我想到了

我目前正在考虑实现一个2D数据结构,以允许我以正确的Z顺序存储和绘制对象(GDI+,实体以调用顺序绘制)。这些要求大致如下:

  • 能够将新对象添加到任何深度索引的顶部
  • 删除任意对象的能力
  • (能够将对象移动到新深度索引的顶部,通过以上两点完成)
  • 快速顺序和反向顺序遍历
由于主要要求是遍历整个数据的速度,所以首先想到的是类似数组的结构,例如vector。它还可以轻松地推送新对象(删除不太好的对象…)。这非常适合我们的需求,因为碰巧大部分可绘制实体没有改变,而那些确实位于订单的顶端

然而,这让我想到了更多动态需求的含义:

  • 向量将根据需要调整自身大小->因为“深度”向量需要在内存中连续维护(顶级向量强制执行),这可能会导致一些非常昂贵的向量大小调整。最坏情况下,所有向量都需要移动到新的内存位置,而平均情况下,链上的所有向量都需要移动
  • 向量通常会在末尾保留一个缓冲区,用于添加新对象->遍历仍然可以在“深度”向量之间跳跃时轻松强制缓存未命中,从而降低顶级向量的连续内存的利用率
有人能证实这些观察结果确实是正确的吗?这使得向量成为存储更大动态数据集的最昂贵的结构

根据我上面的想法,我最终推断,当遍历整个数据集时,特别是在顶级向量中的不同向量之间跳跃时,您还可以使用具有较低遍历复杂度或类似随机访问复杂度(linked_list;map)的任何其他数据结构。遍历实际上是相同的,因为我们也可以假设缓存未命中无论如何都会发生,并且我们不在内存中连续保留深度向量,从而省去了很多麻烦

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

我想知道什么样的应用程序需要在不影响数据添加/删除的情况下跨2D空间进行良好的遍历,以及在那里使用了什么样的数据结构


另外,我刚刚注意到我完全忽略了空间复杂性,所以不妨继续忽略它(除非您想添加更多细节:D)

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

你的第一个假设有点不正确。 与其把向量看作内存本身的blob,不如把它看作指向自动管理的内存blob的指针,以及跟踪它的一些元数据。向量本身是固定大小的,它跟踪的内存不是。(请参见此示例,注意向量对象的大小是恒定的:)


向量向量可以看作是指针数组。调整指针指向的大小并不意味着需要调整包含指针的数组的大小。项连续的承诺仍然成立:父数组的所有指针彼此相邻,每个指针指向一个连续的内存块。但是,不能保证
arr[0][N-1]
的结尾与
arr[1][0]
的开头相邻。(为此,您的第二点是正确的。)

Aaaaah,因此向量实际上只是内存块的句柄,保证是连续的。实际上,这意味着唯一真正连续的内存多维结构将是一个数组,这使得对保持向量的随机访问(如果我们想要动态添加/删除向量,则可能是插入)成为唯一有意义的度量。