这种贪婪算法的复杂性可以找到图的最大独立集

时间:2015-06-17 15:19:09

标签: algorithm graph time-complexity complexity-theory greedy

找到图的最大独立集的此方法的复杂性是什么?

我认为它是O(| E |),是吗?

Greedy(G):
S = {}
While G is not empty:    Let v be a node with minimum degree in G
    S = union(S, {v})
    remove v and its neighbors from G
return S

1 个答案:

答案 0 :(得分:0)

对于初学者来说,请注意,这并不一定能找到最大的独立集,尽管它总是找到一个最大的独立集。

至于时间复杂度 - 这取决于您如何表示图表以及如何实现每个步骤。这是在时间O(m + n)中实现该算法的一种方法。

假设您将图表表示为邻接列表。创建一个布尔数组,每个节点一个,用于跟踪是否可以将节点添加到独立集中。最初,所有这些布尔都是真的。接下来,创建一个n个桶的数组,最初为空。然后,遍历邻接列表。对于每个节点,计算其相邻的边数(其度),然后将该节点放入该索引处的存储桶中。此设置需要时间O(m + n),因为每个边缘只扫描一次,我们只需要O(n)时间来初始化辅助结构。

现在,从左到右工作,扫描桶。对于存储桶中的每个节点,请执行以下操作。如果该节点的辅助布尔值标记为false,则跳过该节点。否则,将节点添加到集合中,将其布尔值标记为false,然后遍历节点的邻接列表条目并标记所有相邻节点'布尔是假的。这模拟了从图中删除节点及其相邻节点。

总的来说,第二步需要时间O(m + n)。要看到这一点,请注意迭代桶数组需要花费时间O(n),并且在所有迭代中,我们只访问每个节点和每个边缘一次。因此,这可以在总时间O(m + n)中实现。

正如你所看到的那样,这个时间很难实现。我不确定你最初的直觉是什么,为什么这需要线性时间,但我要小心确保你没有直接从伪代码跳到线性时间而不考虑它通过

希望这有帮助!