Data structures 针对特定问题的高效数据结构

Data structures 针对特定问题的高效数据结构,data-structures,matrix,set,Data Structures,Matrix,Set,我有一个优先级队列,它包含一个排序矩阵a及其(行、列)在矩阵中的位置。所以我有一个数据结构“queue\u element”,它有三个字段,queue\u element.value、queue\u element.row和queue\u element.col 我需要处理优先级队列,对于我弹出的每个元素,我需要返回到位置A(行,列),并消除位于同一行和列上的所有元素 例如,如果优先级队列的顶部包含element.value=0.99、element.row=4和element.col=20,那

我有一个优先级队列,它包含一个排序矩阵a及其(行、列)在矩阵中的位置。所以我有一个数据结构“queue\u element”,它有三个字段,queue\u element.value、queue\u element.row和queue\u element.col

我需要处理优先级队列,对于我弹出的每个元素,我需要返回到位置A(行,列),并消除位于同一行和列上的所有元素

例如,如果优先级队列的顶部包含element.value=0.99、element.row=4和element.col=20,那么我需要将A(4,:)和A(:,20)归零,其中“:”符号表示“all”或从0到end的整个范围。这是Matlab/Python符号,但我用C++来做这个。 我目前正在使用一个单独的布尔矩阵p(x,y)进行消去。对于从优先级队列中弹出的每个(x,y)位置,我只需循环所有行/列,并为位于同一行/列上的所有内容设置一个假值。然后,当我从队列中弹出一个元素时,我只需检查它在P(x,y)中是否已设置为假

然而,这是相当低效的。我的算法的基本情况只需要消除整个行/列

编辑:很抱歉遗漏了我问题的最后一部分

此算法的更高级版本要求消除同一行/列上的所有内容,但最近的4个邻居除外。另一个版本要求在(行、列)位置放置X-Y栅格时,消除矩阵右上象限和左下象限中的所有内容

我的问题基本上是,是否有一个明显的数据结构,我可以使用。它必须a)允许我有效地“消除”或将我需要的元素归零,b)允许我快速检查集合成员资格


我该怎么做呢?

两象限消去法给了我一个想法。你听说过一家公司吗

四叉树是一种树数据结构,其中每个内部节点正好有四个子节点。象限树最常用于通过递归地将二维空间细分为四个象限或区域来划分二维空间。区域可以是正方形或矩形,或者可以具有任意形状

我不确定元素的排列顺序,但如果您能找到一种方法来设置每个象限的优先级范围(例如,右下象限是优先级1到N,左下象限是优先级N+1到m,等等),并编写一个树重新平衡方法,根据优先级在该类数据结构中列出所有内容。。然后检查集合成员资格确实会很快(在每次搜索迭代中消除3/4的搜索空间),并且应该能够很好地从树中修剪象限。然而,在一个四元树中,一行或一列是很难修剪的,因为元素跨越了两个主要象限和无数个次要象限

你能做的就是使用我提到的树再平衡方法构建一个临时的四叉树,然后修剪两个四叉树,并将剩余的元素填充到一个新的矩阵中。然后,在行/列消去时,只需使用矩阵结构将元素归零。在这两种情况下,修剪本身变得微不足道,但是四叉树的构造可能会造成很大的开销,因此效率低下

消除矩阵象限的另一种方法是只让嵌套循环从[row,col]运行到[row,0],然后从[row-1,col]运行到[row-1,0],这样每个元素都归零

编辑:好的,要构造一个四叉树,你必须将每个元素都放在其中,所以你需要调用一个(递归)函数来连接不同元素之间的一组指针。要在这里将值归零,我们有一个
NULL
指针,因此没有子指针。我个人还没有使用过四叉树,所以我应该提供的是


我有自己的想法来实现它,但它们是半结构化的,由于您对可伸缩性的需要,我不打算在这篇文章中尝试设计一个空间最优四叉树。

两象限消除法给了我一个想法。你听说过一家公司吗

四叉树是一种树数据结构,其中每个内部节点正好有四个子节点。象限树最常用于通过递归地将二维空间细分为四个象限或区域来划分二维空间。区域可以是正方形或矩形,或者可以具有任意形状

我不确定元素的排列顺序,但如果您能找到一种方法来设置每个象限的优先级范围(例如,右下象限是优先级1到N,左下象限是优先级N+1到m,等等),并编写一个树重新平衡方法,根据优先级在该类数据结构中列出所有内容。。然后检查集合成员资格确实会很快(在每次搜索迭代中消除3/4的搜索空间),并且应该能够很好地从树中修剪象限。然而,在一个四元树中,一行或一列是很难修剪的,因为元素跨越了两个主要象限和无数个次要象限

你能做的就是使用我提到的树再平衡方法构建一个临时的四叉树,然后修剪两个四叉树,并将剩余的元素填充到一个新的矩阵中。然后,在行/列消去时,只需使用矩阵结构将元素归零。在这两种情况下,修剪本身变得微不足道,但是四叉树的构造可能会造成很大的开销,因此效率低下

消除矩阵象限的另一种方法是只让嵌套循环从[row,col]运行到[row,0],然后从[row-1,col]运行到[row-1,0],这样每个元素都归零

编辑:好的,要构造一个四叉树,你必须把每个元素都放在其中,所以你需要调用一个(递归)函数来调用c