【问题标题】:Finding the minimum cut in graph with Kruskal's algorithm?使用 Kruskal 算法找到图中的最小切割?
【发布时间】:2012-07-06 19:35:48
【问题描述】:

我们已经看到生成树和切割是密切相关的。这是另一个连接。让我们删除 Kruskal 算法添加到生成树的最后一条边;这将树分成两个组件,从而在图中定义了一个切割 (S,S)。我们能说什么?假设我们正在处理的图是未加权的,并且它的边是随机均匀排序的,以便 Kruskal 算法处理它们。这是一个值得注意的事实:至少有 1/n^2 的概率,(S,S) 是图中的最小割,其中割的大小 (S, S) 是 S 和 S 之间交叉的边数. 这意味着重复该过程 O(n^2) 次并输出找到的最小割以高概率产生 G 中的最小割:用于未加权最小割的 O(mn^2 log n) 算法。一些进一步的调整给出了由 David Karger 发明的 O(n^2 log n) 最小割算法,这是解决这个重要问题的已知最快的算法。

  • 这难道不取决于通过 Kruskal 算法处理图形的 n^2 种独特方法这一事实吗?我的意思是,如果 Kruskal 算法只有 3 种独特的方式来处理具有 10 个节点的图,那么重复该过程 n^2 次将不会产生 n^2 独特的“最后一条边”。在唯一的最终切割少于 n^2 个(即少于 n^2 个唯一的“最后边”)的情况下,它将如何工作?

  • 如果总共有少于 n^2 条边怎么办?例如,您可以有一个只有 9 条边的 10 个节点的连通图,这意味着无论您重复该算法多少次,您都不会有 n^2 个唯一的“最后一条边”。在这种情况下它会如何工作?

  • 循环遍历每条边并检查边是否是最小切割不是更容易吗?在 n 个节点的图中,唯一边的最大数量为 n + n-1 + n-2... + 1 条边,小于 n^2。考虑到 n^2 小于 n^2 log n,为什么不直接遍历所有边,因为这样更快?

【问题讨论】:

  • 这段文字是从哪里来的?

标签: algorithm math minimum-spanning-tree minimum-cut kruskals-algorithm


【解决方案1】:

我认为您可能误解了算法的工作原理。该算法的工作原理是运行 Kruskal 算法,直到添加最后一条边,然后在此之前停止。该算法不会尝试建立这些“最后一条边”的集合;相反,重复运行 Kruskal 算法的 O(n2) 次随机迭代,以建立 O(n2) 次可能的削减。在所有这些候选切割中取最低切割,然后以高概率给出最小切割。换句话说,如果少于 O(n2) 条边并不重要。重要的是最后保留的切口,而不是考虑的最后一个边缘。

希望这会有所帮助!

【讨论】:

  • 谢谢!我的最后一个问题呢?如果保证最小切割是一条边,为什么不遍历所有边并检查每一条?这只需要 O(n^2) 时间,不是吗?
  • @Riddler- 我认为你误解了什么是剪辑。切割不是图中的一条边。相反,它是一组边,当它们被移除时,将断开图形并留下两个未连接的区域。因此,用一种简单的方法找到最小切割将是“检查所有可能的边集以查看它们是否是切割,然后返回其中最少的。”这将花费指数级的时间。这有意义吗?
  • 是的。最后一件事:用幼稚的方法完成它需要多长时间?(找到所有削减并返回最小的削减)。我知道你说的是指数,但究竟是什么?
  • 有 2^m 组边要检查,每个生成和测试需要 O(m) 时间,所以至少 O(m2^m)。
  • @Riddler- 这是边的数量。按照惯例,m是边数,n是节点数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2011-05-27
  • 2015-06-07
相关资源
最近更新 更多