【问题标题】:Finding largest connected tree in a matrix在矩阵中找到最大的连接树
【发布时间】:2010-08-30 22:30:16
【问题描述】:

假设我有一个矩阵 MxN,填充了 0 到 5 之间的值。我现在想确定该矩阵中最大的连接树,其中矩阵的值被视为节点。如果一对节点水平或垂直相邻,并且两个节点的值相同,则称这对节点是连接的。树的大小等于树中的节点。

一个例子:

1 0 3 0 0              2 2 0 0 0 0 0
1 1 2 2 2              0 2 0 0 0 0 0
0 1 0 3 0              0 2 0 0 0 0 2
3 1 0 3 0              0 2 0 2 2 2 2
                       0 0 0 0 0 0 0
                       3 0 0 3 3 0 0
                       3 3 3 3 0 0 0

在左侧,左侧的 1 节点形成最大的树。在右侧,3 节点构成最大的树,而另外两棵由 2 节点组成的树。

我知道我可能会做一个简单的深度优先搜索,但我想知道我是否缺少一些众所周知的东西,也许是在图论领域(比如 Kruskal 的最小生成树算法,但是对于这个例子)。

【问题讨论】:

  • 将项目组称为“孤岛”不是更好吗 - 假设您在给定的第一个矩阵的 LHS 下全是 1 - 1 仍然算作“树”吗?跨度>
  • 肯定右边最大的树是由0节点组成的?
  • @Stephen - 是的,它看起来是那样的 - 除非这不被视为一棵树。

标签: algorithm graph


【解决方案1】:

您正在寻找不相交集,因此我建议使用不相交集数据结构和查找/联合算法:

http://en.wikipedia.org/wiki/Disjoint-set_data_structure#Disjoint-set_forests

联合运算是对称的,因此您实际上只需要将矩阵的每个元素与其右侧的邻居和下面的邻居进行比较,当比较的元素具有相同的值时,应用联合运算。

使用查找操作再次扫描每个元素以计算每个集合的大小,并跟踪最大的集合。您将需要存储空间来进行计数。

计算复杂度为 O(MN A-1(MN,MN)) 其中 A-1 是逆阿克曼函数,可以认为是一个小的对于 MN 的任何有用值,常数 (

【讨论】:

  • Disjoint sets 比 BFS/DFS 复杂一点,想知道是否有任何理由使用 Disjoint sets over BFS/DFS 来解决问题?
  • 教育学。最初的问题已经提供了 DFS 作为解决方案,并询问了提问者可能知道的其他解决方案。提问者提到了 Kruskal 的算法,它比 Disjoint Sets 的超线性度要高得多,而且出于所有实际目的,Disjoint Sets 的 big-O 复杂度相当于 DFS。但是,我怀疑我最好的 DFS 会胜过我最好的所有 N 的不相交集解决方案。
【解决方案2】:

实际上,您正在寻找的是 Connected 组件。 连接组件是一组节点,您可以在其中从任何节点移动到该组件内的任何其他节点

连通分量通常适用于图。可以使用BFS/DFS 找到连接的组件,并且从算法复杂性的角度来看,给定邻接矩阵输入,没有更好的方法可以做到这一点。该算法的运行时间为O(N^2),其中N是图中的节点数。

在您的情况下,图表具有更多约束,例如每个节点最多可以与 4 个其他节点相邻。使用BFS/DFS,这将为您提供O(4N) = O(N) 的运行时间,其中N 是节点数。不可能有更复杂的算法,因为在最坏的情况下您需要至少考虑每个节点一次。

【讨论】:

  • 我很想对这个答案投反对票,因为其中的一些陈述是完全错误的——显然是这样。但是,对这些陈述进行一些明智的编辑可以在一定程度上恢复答案。如果我有魔力,我会自己进行这些编辑。
  • 我已经修改了答案,感谢您引起我的注意。我从第一次阅读就误解了这个问题。请随时提出更多改进建议!
  • 既然您提到了 Connected Components,您可以包含指向 en.wikipedia.org/wiki/… 的链接您可以将错误陈述“运行时间 ... 为 O(N^2)..”替换为真实陈述就像“运行时间和额外存储都是 O(N) ......”你可以删除关于“约束”的废话。清理干净后,我很乐意删除我的 cmets。事实上,如果我有能力编辑你的答案,我就会把它清理干净。
  • P.S.最好从原始问题中重述 M 和 N 的复杂性,而不是组成一个新的 N。如果你想引用节点和边,我建议用 | 为顶点和边设置 V 和 E 的表示法。 V|和 |E|分别为基数。
  • @bbadour:答案中明确提到了N的含义。您可以在 asnwers 中使用您习惯使用的任何符号,但这没有任何意义来强制 N 或 M 成为您喜欢的东西。 O(N^2) 复杂度仍然适用于 a graph,其中 N 是节点数,并且在图中将节点数表示为 N 是很常见的。所以你对“虚假陈述”的评论显然不成立。不太确定“约束”或约束是什么意思?也许您没有座右铭,因为您的 cmets 不够精确并出现拼写错误?
猜你喜欢
  • 2016-10-01
  • 2021-11-27
  • 2015-05-09
  • 1970-01-01
  • 2021-11-25
  • 2021-11-26
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多