我有一个优先级队列,它包含一个排序矩阵A以及矩阵中的(row,col)位置。所以我有一个数据结构“queue_element”,它有三个字段,queue_element.value,queue_element.row和queue_element.col
我需要处理优先级队列,对于我弹出的每个元素,我需要返回到位置A(row,col)并消除位于同一行#和col#的所有元素。
因此,例如,如果优先级队列的顶部包含element.value = 0.99,element.row = 4和element.col = 20,那么我需要将A(4,:)和A(:, 20),其中':'符号代表“全部”或整个范围从0到结束。这是MATLAB / Python表示法,但我正在使用C ++。
我目前正在使用单独的布尔矩阵P(x,y)进行消除。对于从优先级队列中弹出的每个(x,y)位置,我只是循环遍历所有行/ col,并为位于同一行/列上的所有内容设置false值。然后,当我从队列中弹出一个元素时,我只是检查它是否在P(x,y)中被设置为false。
然而,这是非常低效的。我的算法的基本情况只需要消除整个行/列。
编辑:很抱歉错过了我的问题的最后一部分......此算法的更高级版本需要消除同一行/列上的所有内容,但最近的4个邻居除外。当X-Y网格放置在(行,列)位置时,另一个版本需要消除矩阵的右上角和左下象限中的所有内容。
我的问题基本上是,是否有一个我可以使用的明显数据结构。它必须a)允许我有效地“消除”或将我需要的元素清零,并且b)使我能够非常快速地检查集合成员资格。
关于我应该怎么做的任何想法?
答案 0 :(得分:1)
两个象限消除的东西给了我一个想法。你听说过quadtree吗?
四叉树是一种树数据结构,其中每个内部节点恰好有四个子节点。四叉树最常用于通过递归地将其细分为四个象限或区域来划分二维空间。区域可以是正方形或矩形,也可以是任意形状。
我不确定您的元素的放置顺序,但是如果您能找到为每个象限设置优先级范围的方法(例如,右下象限是优先级1到N,左下角是N +1到M等),并编写一个树重新平衡方法,它根据优先级在那种数据结构中放置所有内容。然后检查集合成员资格确实会很快(你为每次搜索消除了3/4的搜索空间)迭代),你应该能够很好地修剪树中的象限。但是,单个行或列将在四叉树中修剪,其中元素跨越两个主要象限和少数几个象限。
你可以做的是使用我所谈到的树重新平衡方法构建一个临时四叉树,然后修剪两个象限并将剩余的元素填充到一个新的矩阵中。然后,只需使用矩阵结构就可以在行/列消除时将元素清零。在这两种情况下,修剪本身都变得微不足道,但是四叉树构造可能是一个很大的开销,这是效率低下的。
消除矩阵象限的另一种方法是只有嵌套循环从[row,col]到[row,0],然后是[row-1,col]到[row-1,0],这样的每一个元素都归零了吗?
编辑:好的,所以,要构建一个四叉树,你将不得不将每个元素放在其中,所以你需要调用一个(递归)函数来连接各种元素之间的一堆指针。要在此处将值清零,我们有一个NULL
指针,因此没有子项。我没有亲自使用四叉树,所以我应该提供links到other implementations。
我有自己的想法来实现它,但它们是半成形的,并且由于你需要可扩展性,我不会尝试在这篇文章中设计一个空间最优的四叉树。
答案 1 :(得分:0)
对于你的“另一个版本”,我会采取不同的方法。由于每行最多只能有一个元素,因此在每一行中找到“最佳”元素 - 不会被删除的元素是这些元素的子集。现在只需检查所有对,并找出哪些幸存下来。如果在行数超过列时使用列而不是行,那么这与首先创建矩阵的速度一样快。
编辑:我觉得我没有得到整个故事,因为其他案例的当前算法运行速度与创建矩阵一样快。是否有增量更新或其他什么?