如何解决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)
表明您的算法确实是耗时的:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。