Algorithm 利用深度优先搜索计算最大独立集

Algorithm 利用深度优先搜索计算最大独立集,algorithm,graph-algorithm,depth-first-search,breadth-first-search,Algorithm,Graph Algorithm,Depth First Search,Breadth First Search,无向图G=(V,E)的一个独立集是V的子集I,使得 I中没有两个顶点是相邻的。也就是说,如果u和v在I中,那么(u,v)不在E中。 极大独立集M是一个独立集,如果我们要加 M的任何附加顶点,那么它就不再是独立的了。每一个 图有一个最大独立集。(你能看到这个吗?这个问题不是 这是练习的一部分,但值得考虑。)给出一个有效的算法 计算图G的最大独立集。这个方法的优点是什么 运行时间 我不确定对深度优先搜索的修改是否能解决上述给定的问题,但以下是我的尝试(注意:我不是在寻找代码,只是对我应该做什么的高层

无向图G=(V,E)的一个独立集是V的子集I,使得 I中没有两个顶点是相邻的。也就是说,如果u和v在I中,那么(u,v)不在E中。 极大独立集M是一个独立集,如果我们要加 M的任何附加顶点,那么它就不再是独立的了。每一个 图有一个最大独立集。(你能看到这个吗?这个问题不是 这是练习的一部分,但值得考虑。)给出一个有效的算法 计算图G的最大独立集。这个方法的优点是什么 运行时间

我不确定对深度优先搜索的修改是否能解决上述给定的问题,但以下是我的尝试(注意:我不是在寻找代码,只是对我应该做什么的高层次描述)

使用DFS,我们将从一些起始顶点S1开始遍历图的所有顶点。从S1,我们转到相邻边S2,如果不存在相邻边,我们将S1添加到最大独立集M中,因为该顶点在G中的任何其他顶点之间没有边,如果是这种情况,则我们选择另一个顶点S1'并从该点(递归地)执行DFS

假设S1和S2之间有一条边,那么我们可以将S1添加到独立集,而不是S2,然后DFS继续,我们添加S3,因为S3与S1不共享边,DFS继续,我们所做的是继续将S[k]添加到集M,只要它与M中已存在的当前元素不共享边

这将花费我们O(| V |+| E |)时间复杂性。原因:DFS是O(| V |+| E |),每次我们移动到一个新节点时,我们都必须对照M中的一些K元素进行检查,以确保它们不共享一条边。也就是O(k(| V |+| E |))=O(| V |+| E |)

最坏的情况:空图,| V |调用DFS给我们O(| V |)(| V |+| E |)

问题:

(1) 这是正确的吗,我真的找到了最大独立集还是最大独立集

(2) 如果正确,这是否有效

如果完全错了,我真的很感激能找到一个解决办法,我已经考虑这个问题一段时间了


以下是我解决问题的方法:

输入:一组顶点
V
,邻接列表
E[V]
(每个顶点一个):

  • 准备一个包含
    bool
    值的数组
    take[]
    ,大小为
    |V |
    。所有元素最初都设置为
    false
    。该数组告诉我们哪些顶点被纳入结果
  • 将[0]设置为
    true
  • 对于每个顶点
    v=1..v |-1
    :如果
    E[v]
    不包含边
    (v,u)
    ,则
    取[u]
    ,然后将
    取[v]
    设置为真
  • 返回所有顶点
    v
    ,使
    take[v]
    true

  • 总时间复杂度为O(| V |+| E |)

    你给一个“时间复杂度”O(| V |+| E |),然后给一个“最坏情况时间复杂度”O(| V |+| E |)根据我的理解,更容易理解的方法是a,基本上是深度优先搜索M,然后从每个连接的组件中选择单个节点;时间复杂度也将是
    O(|V|+|E|)
    @j_random_hacker我想我应该只提供一个时间复杂度,我提供的第一个时间复杂度是任何图G的平均值,最坏的情况是空图。我提供了这两个时间复杂度,因为我不知道它要的是哪一个。问题没有指定图G的类型。所以我必须做出假设。我们通常对图G感兴趣最坏情况的复杂度。另外,还不清楚你的第一时间复杂度是否是描述平均复杂度的准确方式——我看不到任何东西可以阻止k与| V |成比例,如果这可以发生,那么平均情况复杂度也是O(| V |)(| V |+| e |)。目前没有已知的有效算法解决您的问题。