【问题标题】:Time complexity of n-vertex subgraph enumerationn-顶点子图枚举的时间复杂度
【发布时间】:2011-05-29 11:29:44
【问题描述】:

我有一个算法,用于通过给定顶点创建 P 顶点上所有可能的子图的列表。这并不完美 但我认为它应该可以正常工作。问题是当我尝试计算它的时间复杂度时我迷路了。

我想出了类似T(p) = 2^d + 2^d * (n * T(p-1) ) 的东西,其中d=Δ(G), p=#vertices required, n=|V|。这真的只是一个猜测。 谁能帮我解决这个问题?

使用的powerSet()算法应该是O(2^d)或者O(d*2^d)

private void connectedGraphsOnNVertices(int n, Set<Node> connectedSoFar, Set<Node> neighbours, List<Set<Node>> graphList) {
    if (n==1) return;

    for (Set<Node> combination : powerSet(neighbours)) {
        if (connectedSoFar.size() + combination.size() > n || combination.size() == 0) {
            continue;
        } else if (connectedSoFar.size() + combination.size() == n) {
            Set<Node> newGraph = new HashSet<Node>();
            newGraph.addAll(connectedSoFar);
            newGraph.addAll(combination);
            graphList.add(newGraph);
            continue;
        }

        connectedSoFar.addAll(combination);
        for (Node node: combination) {
            Set<Node> k = new HashSet<Node>(node.getNeighbours());
            connectedGraphsOnNVertices(n, connectedSoFar, k, graphList);
        }
        connectedSoFar.removeAll(combination);
    }
}

【问题讨论】:

    标签: java algorithm graph time-complexity subgraph


    【解决方案1】:

    看起来算法有bug,因为递归调用后,有可能组合出现的节点也出现在connectedSoFar中,所以检查connectedSoFar.size()+combination.size()等于n好像不正确,因为它可能会计算一个节点两次。

    无论如何,要不然分析算法,powerset 中有 2d 个元素; “elase”分支中的每个操作都需要 O(n) 时间,因为 connectedSoFar 和组合在一起不能包含超过 n 个节点。然后将元素添加到 connectedSoFar 需要 O(n log n) 时间,因为 |combination| &leq; n.组合节点上的迭代发生 O(n) 次;其中有 O(d) 操作来构造散列集 k 然后递归调用。

    然后用 X(n) 表示过程的复杂性,其中 n 是参数。你有

    X(n) ~ 2d (n + n log n + n (d + X(n - 1)))

    因为在递归调用中,您已向图中添加了至少一个顶点,因此实际上递归调用中的参数 n 至少减少了一个。

    简化为

    X(n) ~ 2d (n (1 + d + log n + X(n - 1)))

    因为d是常数,标记D = 2d,消除常数1,得到

    X(n) ~ D n (d + log n + X(n - 1))

    你可以分析为

    X(n) ~ (2d)n n! (d + log n)

    表明你的算法真的很耗时:)

    【讨论】:

    • 非常感谢您的深入分析!看起来它真的很浪费时间,幸运的是我不需要它非常高效 - 但也许这里有人可以指出我这样做的更好方法。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2014-07-03
    • 2015-05-25
    • 1970-01-01
    • 2020-02-02
    • 2020-03-09
    • 2023-04-04
    相关资源
    最近更新 更多