给出了多图G= (V,E)的邻接表,并给出了求等价无向图邻接表的O(V + E)算法。
到目前为止,我已经想过要有一个大小为x的数组,以便标记在adju中至少遇到过一次的顶点,从而防止重复。数组在遍历每个adju之前被重置。但是,我想知道是否有一个更好的算法不需要额外的空间。请建议一下。
发布于 2013-08-12 13:50:37
如果您想要实现O(V+E)时间复杂度,就没有更好的算法,因为这基本上是元素区分问题的一个变化,可以通过在O(nlogn)中排序或在O(n)中使用O(n)额外空间来解决。
因此,为了达到O(V+E)时间,您的算法是最优的(就大O符号而言)。
发布于 2017-03-24 20:58:05
作为参考,应该注意的是,在技术上,每次重新设置数组时都使用O(V)时间。数组创建在技术上并不是免费的,因为它是用随机指针创建的,不能保证这些值是be.Thus的,它需要一次传递才能实际初始化它们0或null。因此,运行时成为O(V^2)为您提出的算法。
我知道这个问题现在已经解决了,但这个事实是值得注意的。
发布于 2013-08-13 12:00:26
您可以使用无序集数据结构从O(n)额外空间改进为O(最大邻居数),只需检查邻接列表中没有添加两次邻居。
https://stackoverflow.com/questions/18187984
复制相似问题