【问题标题】:Efficient data structure for my particular problem针对我的特定问题的高效数据结构
【发布时间】:2011-09-19 23:06:11
【问题描述】:

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

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

例如,如果优先级队列的顶部包含 element.value = 0.99、element.row=4 和 element.col=20,那么我需要将 A(4,:) 和 A(:, 20),其中 ':' 表示法代表“全部”或从 0 到结尾的整个范围。这是 MATLAB/Python 表示法,但我为此使用 C++。

我目前正在使用单独的布尔矩阵 P(x,y) 进行消除。对于从优先级队列中弹出的每个 (x,y) 位置,我只需遍历所有行/列,并为位于同一行/列上的所有内容设置一个错误值。然后当我从队列中弹出一个元素时,我只是检查它是否在 P(x,y) 中设置为 false。

但是,这是非常低效的。我的算法的基本情况只需要消除整个行/列。

编辑:很抱歉错过了我的问题的最后一部分......

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

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

关于我应该如何处理的任何想法?

【问题讨论】:

  • 你……错过了问题的结尾。
  • 嘿,这听起来是个有趣的问题,我们错过了什么?
  • 只有穆斯塔法知道,而且他不会说话。我说我们粗暴对待他。

标签: data-structures matrix set


【解决方案1】:

两象限消除的东西给了我一个想法。你听说过quadtree吗?

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

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

你可以做的是使用我谈到的树再平衡方法构建一个临时四叉树,然后修剪两个象限并将剩余的元素填充到一个新矩阵中。然后在行/列消除时使用矩阵结构将元素清零。在这两种情况下,剪枝本身都变得微不足道,但四叉树的构造可能会产生很大的开销,以至于效率低下。

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

编辑:好的,所以,要构建一个四叉树,您必须将每个元素放入其中,因此您需要调用一个(递归)函数来连接各种元素之间的一堆指针。为了在这里清零一个值,我们有一个NULL 指针,因此没有子指针。我没有亲自使用过四叉树,所以我应该提供的只是 linksother implementations

我有自己的想法来实现它,但它们还只是半成品,并且由于您需要可扩展性,我不会在这篇文章中尝试设计空间最优四叉树。

【讨论】:

  • 我使用了四叉树和小波分解,但我不太了解您在上面概述的过程。我将不得不再读几次:p ...我目前正在使用嵌套循环将象限归零,但我正在处理非常大的矩阵顺序,即 10k x 10k :(
【解决方案2】:

对于您的“另一个版本”,我会采取不同的策略。由于每行最多可以有一个元素,因此请在每行中找到“最佳”元素——不会被淘汰的元素是这些元素的子集。现在只需检查所有对并找出哪些幸存下来。如果在行数超过列数时使用列而不是行,那么这与首先创建矩阵一样快。

编辑:我不觉得我了解了整个故事,因为其他情况的当前算法运行速度与创建矩阵一样快。有增量更新之类的吗?

【讨论】:

  • 嗯...我已经尝试过一种变体,但问题是...假设我在第 4 行和第 5 列弹出元素 (4,5)。在第 4 行中,有已保存的 2 个元素... (4,5-1) 和 (4,5+1) 处的元素以及该行的其余部分被消除。同样,第 5 列的两个元素被保存... (4-1,5) 和 (4+1,5) 处的元素。
  • 因此,如果我保存这些...那么当我下次弹出元素 (4,25)... 在第 4 行和第 25 列...在这种情况下,在第在图 4 中,元素 (4,25-1) 和 (4, 25+1) 被保存,其余的行被删除。这意味着我在第 4 行保存的先前元素现在已被删除。每次检查这对我来说真的很麻烦......
猜你喜欢
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2012-04-27
  • 2011-08-12
  • 2012-04-20
相关资源
最近更新 更多