Algorithm 利用深度优先搜索计算最大独立集
无向图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) 如果正确,这是否有效 如果完全错了,我真的很感激能找到一个解决办法,我已经考虑这个问题一段时间了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的最大独立集。这个方法的优点是什么 运行时间 我不确定对深度优先搜索的修改是否能解决上述给定的问题,但以下是我的尝试(注意:我不是在寻找代码,只是对我应该做什么的高层
以下是我解决问题的方法: 输入:一组顶点
V
,邻接列表E[V]
(每个顶点一个):
bool
值的数组take[]
,大小为|V |
。所有元素最初都设置为false
。该数组告诉我们哪些顶点被纳入结果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 |)。目前没有已知的有效算法解决您的问题。