查找度数小于其邻居的图形中的所有顶点

时间:2008-11-13 16:20:21

标签: algorithm graph-theory

我正在尝试编写一种算法,该算法将在图形中找到程度小于其邻居的所有顶点的集合。我最初的方法是找到每个顶点的度数,然后通过列表,比较每个顶点的程度与其邻居的程度。不幸的是,这看起来可能非常耗时。有没有更有效的方法来找到这个集合?

3 个答案:

答案 0 :(得分:3)

一条评论 - 如果你正在使用无向图(谢谢,Brian R. Bondy),一旦你确定一个顶点的度数小于其所有邻居的程度,你不需要检查邻居,因为他们都不会拥有该属性。考虑使用这些知识来帮助你加快速度。

答案 1 :(得分:2)

也许“看起来这可能非常耗时”,但有更好的方法可以找到: - )

假设您已将图表存储为邻接列表。要找到您正在寻找的集合,您必须查看所有边缘,因此我们对该算法有一个下界Ω(| E |)。找到每个顶点的度数需要时间O(| E |)(因为你只看一次每个边缘;另一个证明是使用Σd(v)= 2 | E |的事实)。比较每个顶点与其所有邻居的程度也只需要O(| E |)时间(同样,对于每个边,只进行一次比较)。这意味着您的算法在O(| E |)时间内运行(大约2 | E |“步”,但CPU指令的精确数量取决于您的实现),它符合下限。因此,在最坏的情况下,你的“蛮力”算法基本上(最多小到一个常数)尽可能快,因此不值得进一步优化。

如果您正在为实际应用程序执行此操作,并且确实发现您的算法花费了太多时间,那么请使用分析器查找要优化的部分。优化算法的第二阶段至关重要,这一点并不明显。

答案 2 :(得分:1)

我会想象一个对于无向图的贪婪方法如下:

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

这个算法可能稍微有点效率,因为在每次迭代时,它要么找到满意的节点,要么检查较低程度的新节点并从图中删除节点。

在最坏的情况下,它将等同于您的强力算法。不过,平均而言,我认为应该表现得更好。