n-顶点子图枚举的时间复杂度

问题描述

| 我有一种算法,可以通过给定顶点在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);
    }
}
    

解决方法

        似乎算法有错误,因为在递归调用之后,组合出现的节点也可能出现在connectedSoFar中,因此检查connectedSoFar.size()+ combining.size()等于n的检查似乎不正确,因为可能会计算节点两次。 无论如何,要分析算法,在功率集中有2d个元素。 \“ elase \”分支中的每个操作都需要O(n)的时间,因为connectedSoFar和它们的组合不能包含n个以上的节点。由于| combination |,将元素添加到connectedSoFar会花费O(n log n)时间。 &leq; 。组合节点上的迭代发生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 +日志n) 表明您的算法确实是耗时的:)     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...