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

Java n-顶点子图枚举的时间复杂度,java,algorithm,graph,time-complexity,subgraph,Java,Algorithm,Graph,Time Complexity,Subgraph,我有一个通过给定顶点在p顶点上创建所有可能子图列表的算法。这并不完美 但我认为它应该可以正常工作。问题是,当我试图计算它的时间复杂度时,我迷失了方向 我想出了一些类似于T(p)=2^d+2^d*(n*T(p-1)),其中d=Δ(G),p=#所需顶点,n=| V |。这真的只是猜测。 有人能帮我吗 使用的powerSet()算法应该是O(2^d)或O(d*2^d) private void connectedgraphsonn证书(int n,Set connectedSoFar,Set neig

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

我想出了一些类似于
T(p)=2^d+2^d*(n*T(p-1))
,其中
d=Δ(G),p=#所需顶点,n=| V |
。这真的只是猜测。 有人能帮我吗

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

private void connectedgraphsonn证书(int n,Set connectedSoFar,Set neights,List graphList){
如果(n==1)返回;
用于(组组合:功率组(相邻)){
if(已连接到某个.size()+组合.size()>n | |组合.size()==0){
继续;
}else if(已连接到某个.size()+组合.size()==n){
Set newGraph=newhashset();
newGraph.addAll(connectedSoFar);
newGraph.addAll(组合);
graphList.add(newGraph);
继续;
}
已连接的全部添加(组合);
用于(节点:组合){
Set k=newhashset(node.getneights());
ConnectedGraphsOnInverties(n,connectedSoFar,k,graphList);
}
连接到远端。移除所有(组合);
}
}

该算法似乎存在错误,因为在递归调用之后,组合出现的节点可能也出现在connectedSoFar中,因此检查connectedSoFar.size()+组合.size()是否等于n似乎不正确,因为它可能会对节点计数两次

无论如何,否则要分析算法,在powerset中有2d元素;“elase”分支中的每个操作都需要O(n)个时间,因为连接的SOFAR和组合不能包含超过n个节点。向connectedSoFar添加元素则需要O(n logn)时间,因为| combination |≤N组合节点上的迭代次数为O(n)次;其中有O(d)操作来构造散列集k,然后递归调用

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

X(n)~2d(n+n对数n+n(d+X(n-1)))

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

将此简化为

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

因为d是常数,标记d=2d,去掉常数1,得到

X(n)~dn(D+logn+X(n-1))

你可以这样分析

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


显示您的算法真的很耗时:)

非常感谢您的深入分析!看起来这真的是一种浪费时间的行为,幸运的是我不需要它变得非常高效——但也许这里有人能给我指出一种更好的方法来做到这一点。再次感谢。
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);
    }
}