你能帮我解决这段代码的时间复杂性吗?我认为这是3 ^ n,但我是新手,所以我可能错了。
public void find(int n) throws Exception
{
if (n == vertices){
throw new Exception("Solution found");
}
for (int r = 1; r <= 3; r++)
{
if (control(n, r))
{
color[n] = r;
find(n + 1);
color[n] = 0;
}
}
}
public boolean control(int n, int r)
{
for (int i = 0; i < vertices; i++){
if (graph[n][i] == 1 && r == color[i]){
return false;
}
}
return true;
}
感谢任何帮助!
编辑:我想我误解了一些事情,复杂性是n。
答案 0 :(得分:1)
这是我对此的看法
编辑:当基本条件不引发异常时适用
control
方法有一个运行vertices
次的循环 - 所以它是O(vertices)
。
find
是递归函数,在n
到达vertices
时停止。 (假设n
从1开始)它为n = 1,2,3 ...顶点调用control
。
find
3次。每个递归调用都涉及到这一点,因此这使得它成为指数 - O(3^vertices)
。
所以,最后,O(3^vertices)
* O(vertices)
是O(3^vertices)
修改强>
由于你有throw new Exception("Solution found");
,一旦n
到达顶点,它就会爆炸。所以它就是O(vertices^2)
。
答案 1 :(得分:0)
n
/|\
/ | \
/ | \
/ | \
(n+1) (n+1)(n+1) --> control(vertex)-> O(Vertex)
/|\
/ | \ . . . . . .
因此,似乎总共有3^1+ 3^2+...+3^vertex
个节点,并且在每个节点上,您正在对每个节点执行O(n)
操作。因此,O((3^1+ 3^2+...+3^n) * n)
= O((1-3^n)/2)*n)
的复杂性最终为O((3^vertices)*vertices)
。