Algorithm 寻找度小于其邻域的图中的所有顶点
我正在尝试写一个算法,可以找到一个图中所有顶点的集合,这些顶点的度数小于它们的邻域。我最初的方法是找到每个顶点的度数,然后遍历列表,将每个顶点的度数与其相邻顶点的度数进行比较。不幸的是,这看起来可能非常耗时。有没有更有效的方法来找到这个集合?一条评论-如果你正在处理无向图(谢谢,),一旦你确定一个顶点的度数小于其所有邻域的度数,你就不需要检查邻域,因为它们都没有这个属性。考虑使用这些知识来帮助你加快速度。 < P>我想一个无向图的贪婪方法如下:Algorithm 寻找度小于其邻域的图中的所有顶点,algorithm,graph-theory,Algorithm,Graph Theory,我正在尝试写一个算法,可以找到一个图中所有顶点的集合,这些顶点的度数小于它们的邻域。我最初的方法是找到每个顶点的度数,然后遍历列表,将每个顶点的度数与其相邻顶点的度数进行比较。不幸的是,这看起来可能非常耗时。有没有更有效的方法来找到这个集合?一条评论-如果你正在处理无向图(谢谢,),一旦你确定一个顶点的度数小于其所有邻域的度数,你就不需要检查邻域,因为它们都没有这个属性。考虑使用这些知识来帮助你加快速度。 < P>我想一个无向图的贪婪方法如下: let Q = all nodes which h
let Q = all nodes which haven't been checked (initialize all V)
let Q* = all nodes which satisfy the required condition (initialize to empty)
start with an arbitrary node, v in Q
while Q is not empty
let minDeg be the minimum degree of all v's neighbors
if degree(v) < minDeg
add v to Q*
remove all neighbors of v from Q
remove v from Q
set v = new arbitrary node, v in Q
else
remove v from Q
set v = v's neighbor in Q of minimum degree
让Q=所有未检查的节点(初始化所有V)
设Q*=满足所需条件的所有节点(初始化为空)
从任意节点开始,v在Q中
而Q不是空的
设minDeg为v的所有邻域的最小度
如果度(v)
该算法可能稍微更有效,因为在每次迭代中,它要么找到一个满意的节点,要么检查一个程度较低的新节点,并从图中删除一个节点
在最坏的情况下,它将等同于您的暴力算法。不过,平均而言,我认为它应该表现得更好。也许“这看起来可能非常耗时”,但有一种更好的方法可以发现:-)
假设您已将图形存储为邻接列表。要找到你正在寻找的集合,你必须查看所有的边,因此我们有一个Ω(| E |)的下限。找到每个顶点的阶数需要时间O(| E |)(因为你只看一次每个边;另一个证明是使用以下事实∑d(v)=2 | E |)。将每个顶点的阶数与其所有相邻顶点的阶数进行比较也只需O(| E |)次(同样,对于每条边,您只需进行一次比较)。这意味着您的算法在O(| E |)时间内运行(大约2 | E |“步数”,但CPU指令的精确数量取决于您的实现),这符合下限。因此,在最坏的情况下,您的“暴力”算法基本上是(达到一个小常数)尽可能快的,因此不值得进一步优化
如果您是为真实世界的应用程序这样做的,并且确实发现您的算法花费了太多的时间,那么请使用探查器查找要优化的部分。优化算法的第二阶段是至关重要的,这一点一点也不明显。如果是有向图,则这一点不成立。这是一个极好的观点!哦,离开学术界的时间使我的头脑迟钝了!