Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 寻找度小于其邻域的图中的所有顶点_Algorithm_Graph Theory - Fatal编程技术网

Algorithm 寻找度小于其邻域的图中的所有顶点

Algorithm 寻找度小于其邻域的图中的所有顶点,algorithm,graph-theory,Algorithm,Graph Theory,我正在尝试写一个算法,可以找到一个图中所有顶点的集合,这些顶点的度数小于它们的邻域。我最初的方法是找到每个顶点的度数,然后遍历列表,将每个顶点的度数与其相邻顶点的度数进行比较。不幸的是,这看起来可能非常耗时。有没有更有效的方法来找到这个集合?一条评论-如果你正在处理无向图(谢谢,),一旦你确定一个顶点的度数小于其所有邻域的度数,你就不需要检查邻域,因为它们都没有这个属性。考虑使用这些知识来帮助你加快速度。 < P>我想一个无向图的贪婪方法如下: let Q = all nodes which h

我正在尝试写一个算法,可以找到一个图中所有顶点的集合,这些顶点的度数小于它们的邻域。我最初的方法是找到每个顶点的度数,然后遍历列表,将每个顶点的度数与其相邻顶点的度数进行比较。不幸的是,这看起来可能非常耗时。有没有更有效的方法来找到这个集合?

一条评论-如果你正在处理无向图(谢谢,),一旦你确定一个顶点的度数小于其所有邻域的度数,你就不需要检查邻域,因为它们都没有这个属性。考虑使用这些知识来帮助你加快速度。

< P>我想一个无向图的贪婪方法如下:

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指令的精确数量取决于您的实现),这符合下限。因此,在最坏的情况下,您的“暴力”算法基本上是(达到一个小常数)尽可能快的,因此不值得进一步优化


如果您是为真实世界的应用程序这样做的,并且确实发现您的算法花费了太多的时间,那么请使用探查器查找要优化的部分。优化算法的第二阶段是至关重要的,这一点一点也不明显。

如果是有向图,则这一点不成立。这是一个极好的观点!哦,离开学术界的时间使我的头脑迟钝了!