for循环内部递归的时间复杂度

时间:2018-04-09 18:35:18

标签: java time-complexity big-o complexity-theory

你能帮我解决这段代码的时间复杂性吗?我认为这是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。

2 个答案:

答案 0 :(得分:1)

这是我对此的看法

编辑:当基本条件不引发异常时适用

  1. control方法有一个运行vertices次的循环 - 所以它是O(vertices)

  2. find是递归函数,在n到达vertices时停止。 (假设n从1开始)它为n = 1,2,3 ...顶点调用control

  3. 从循环中调用

    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)