首页 文章

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

提问于
浏览
2

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

3 回答

  • 3

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

    假设你正在寻找,你必须要查看所有的边缘,所以我们有一个 lower bound 的Ω(| E |)算法 . 找到每个顶点的度数需要时间O(| E |)(因为你只看一次每个边缘;另一个证明是使用Σd(v)= 2 | E |的事实) . 比较每个顶点与其所有邻居的程度也只需要O(| E |)时间(同样,对于每个边,只进行一次比较) . 这意味着您的算法在O(| E |)时间内运行(大约2 | E | "steps",但CPU指令的精确数量取决于您的实现),这符合下限 . 因此,在最坏的情况下,你的"brute-force"算法基本上(达到一个很小的常数) as fast as possible ,因此不值得进一步优化 .

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

  • 1

    一条评论 - 如果您正在使用无向图(谢谢,Brian R. Bondy),一旦您需要检查邻居,因为它们都不具备该属性 . 考虑使用这些知识来帮助你加快速度 .

  • 2

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

    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
    

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

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

相关问题