找出递归算法的运行时间(Master-Therorem)

时间:2016-05-04 10:04:57

标签: java algorithm performance recursion master-theorem

以下是我想要计算其运行时间的算法:

T(n) = {
        c0 * n, if n <= 20
        T(roundUp(n/4)) + T(roundUp(5/12 * n + 3/2)) + c1*n, if n > 20
       }

n是正自然数的一部分,c0和c1是常数。

以下是java-code中的算法:

    public static void main(String[] args) {
        for (int i = 20; i < 100; i++) {
            System.out.println("i: " + i + " :    " + rec(i, 1, 1));
        }
    }

    public static int rec(int n, int c0, int c1) {
        int res = 0;
        if (n <= 20) {
            res += c0 * n;
        } else {
            double temp = n / 4d;
            double temp2 = n * (5 / 12d) + (3 / 2d);
            res += rec((int) Math.ceil(temp), c0, c1) + rec((int) Math.ceil(temp2), c0, c1) + c1 * n;
        }
        return res;
    }

我正在寻找方法或解释示例。

1 个答案:

答案 0 :(得分:1)

嗯,很长时间没有这样做,但是由于没有人给出答案,让我试试吧。你基本上在这里创建树,有两个重要的孩子。左边一个基于temp = n / 4d,右边一个基于temp2 = n * (5 / 12d) + (3 / 2d)。所以问题是,这棵树有多深?由于n / 4d最终会在20之后加快n * (5 / 12d) + (3 / 2d),因此我们只关心正确的孩子。所以问题是,根据n,有多少儿童在那里? 在我们迭代时,我们有这个:

n * (5 / 12d) + (3 / 2d) 
ceil(n * (5 / 12d) + (3 / 2d) ) * (5 / 12d) + (3 / 2d)
ceil(ceil(n * (5 / 12d) + (3 / 2d)) * (5 / 12d) + (3 / 2d) ) * (5 / 12d) + (3 / 2d)
...

在这里,我们也可以忽略3/2d部分以及与之相关的所有内容,因此我们得到了这个:

n * (5 / 12) ^ k < 20

k是到达最右边孩子的步数,所以我们有:

n * (5 / 12) ^ k < 20
k = log_(5 / 12) (20 / n)
k = log_2(20 / n) / log_2 (5 / 12)   
k = (log_2 (20) - log_2(n) ) / log_2 (5 / 12)  

从那以后:

k = log_2 (20) / log_2 (5 / 12) 

是一个具体的数字,我们可以忽略它......

k = - log_2(n) / log_2 (5 / 12) 

自:

log_2 (5 / 12)  < 0

我们留下:

k = log_2(n) = lgn

正如所料,由于我们只使用树,因此您得到O(n) = lg(n)