可以使用二项式堆在图形中查找连接的组件吗?



二项式堆如何用于查找图的连接组件,它不能使用,那为什么呢?

我从未见过以这种方式使用的二项式堆,因为图连接的组件通常使用深度优先搜索或广度优先搜索来找到,并且这两种算法都不要求您使用任何类型的优先级队列。当然,您可以通过将DFS或BFS的堆栈或队列替换为优先级队列来执行一种"优先级优先搜索"来查找连接的组件,但是没有理由这样做。这将降低查找连接组件的成本降低到O(m + n log n(,而不是从普通BFS或DFS获得的O(m + n(。

有一种方法可以说二项式堆可能有用,那就是在查找连接组件的不同策略中。或者,您可以使用脱节集林来标识连接的组件。首先,每个节点在其自己的分区中,然后为每个边调用联合操作以将节点链接在一起。完成后,最终将得到一个树集合,每个树代表一个连接的组件。

有许多策略可以确定如何在不相交集林中链接树。其中之一是按大小联合,其中每当您需要选择要更改的代表时,您都会选择较小大小的树并将其指向较大大小的树。你可以证明可以用这种方式形成的最小的高度为 k 的树是秩 k 的二项式树。这是通过配对所有节点,然后取出代表并将它们配对等形成的(自己尝试一下 - 这不是很酷吗?

但对我来说,这更像是一种巧合,而不是其他任何事情。这与其说是关于二项式,不如说是关于二项式树,这种特殊的形状只有在你正在寻找病理案例时才会出现,而不是在算法的执行中理所当然地出现。

所以我最好的答案是"从技术上讲,你可以这样做,但你不应该这样做,从技术上讲,二项式树出现在与连接组件相关的其他上下文中,但这与使用二项式堆不同。

希望这有帮助!

最新更新