【问题标题】:Discrepancy in calculating graph coloring code complexity计算图形着色代码复杂度的差异
【发布时间】:2020-12-15 02:53:45
【问题描述】:

考虑下面的代码。假设所讨论的图有 N 个节点,每个节点最多有 D 个邻居,并且 D+1 种颜色可用于为节点着色,这样与一条边相连的两个节点都不会分配给它们相同的颜色。我认为下面代码的复杂性是 O(N*D),因为对于 N 个节点中的每一个,我们循环遍历该节点的最多 D 个邻居以填充集合非法颜色,然后遍历包含 D+1 的颜色列表颜色。但是给出的复杂度是 O(N+M),其中 M 是边数。我在这里做错了什么?

def color_graph(graph, colors):
    for node in graph:
        if node in node.neighbors:
            raise Exception('Legal coloring impossible for node with loop: %s' %
                            node.label)

        # Get the node's neighbors' colors, as a set so we
        # can check if a color is illegal in constant time
        illegal_colors = set([
            neighbor.color
            for neighbor in node.neighbors
            if neighbor.color
        ])

        # Assign the first legal color
        for color in colors:
            if color not in illegal_colors:
                node.color = color
                break

【问题讨论】:

    标签: python graph graph-coloring


    【解决方案1】:

    边数M、最大度数D和节点数N满足不等式: M <= N * D / 2.

    因此O(N+M) 包含在O(N*(D+1)) 中。

    在您的算法中,您循环遍历每个节点的每个邻居。确切的复杂度不是N*D,而是d1 + d2 + d3 + ... + dN,其中di 是节点i 的度数。这个总和等于2*M,最多等于N*D,但可能会更少。

    因此,您的算法的复杂度为O(N+M)。因此它也是O(N*(D+1))。请注意,O(N*(D+1)) = O(N*D) 在假设 D >= 1 下。

    说你的算法在O(N+M) 中运行比说它在O(N*D) 中运行要精确一些。如果大多数节点的邻居比D 少很多,那么M+N 可能比N*D 小很多。

    还要注意O(M+N) = O(M) 假设每个节点至少有一个邻居。

    【讨论】:

    • 谢谢。为什么复杂度是 O(M+N)?
    • 我编辑了帖子来回答。复杂度为O(N+M),因为d1 + d2 + d3 + ... + dN = 2*M,最多为N*D,但可能更少。请注意O(N+M) = O(M),如果您排除某些节点没有邻居的图。
    • 假设 K
    • 是的。如果 K
    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 2022-01-19
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多