有趣而复杂的递归Big-O计算-具体示例

时间:2018-11-18 23:19:38

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

我完全是一个初学者,学习一门名为“算法和数据结构”的主题,并开始了有关Big-O表示法的部分。我读过许多关于此的不同材料,但其中大多数只是显示简单案例的计算示例。

该主题的作业有一些非常有趣的复杂示例,它们相互递归调用,并进行for循环,while循环等...我无法弄清楚,并且在计算时需要帮助。我非常感谢您提供的帮助和解释,以深入了解这一点。

也: 例3:我不明白返回“ 0xCAFE + 0xBABE + s”的含义是什么?我看不到它出现在方法中的任何地方,这对我来说真的很奇怪。

Ex No.4:起初我以为这些是不同的示例,但是我注意到方法g中有一个对方法f的调用,因此应该在一个示例中,我的假设正确吗?

1。

long c(int x) {
    if (x <= 1) {
        return 1;
    } else {
        long s = 0;
        for (int i = 1; i < x; i++) {
            s = s + c(x - 1);
        }
        return s;
    }
}

2。

long d(int x) {
    long s = -x * x;
    while (s <= x * x * x) {
        s++;
    }
    for (long i = s * x; i > 0; i--) {
        s--;
    }
    return s;
}

3。

double e(long x, long y) {
    double s = 0_0;
    for (int i = 1; i <= x; i *= 2) {
        for (double j = x; j >= 1; j /= 3) {
            for (int k = 0; k < y; k += 4) {
                s++;
            }
        }
    }
    return 0xCAFE + 0xBABE + s;
}

4。计算每个f&g

long f(int x, int y) {
    if (x <= 0) {
        return y;
    } else {
        return f(x - 1, 2 * y);
    }
}

double g(int x, int y) {
    double s = 0.0D;
    for (long i = f(x, y); i >= 0; i--) {
        s++;
    }
    return s;
}

5。

char h(int x) {
    char h = 'h';
    for (long i = h; i-- > ++i; x--) {
        h++;
    }
    return h;
}

1 个答案:

答案 0 :(得分:0)

Big-O只是一种衡量算法完成所需运行时间的方法。 在尝试理解这些示例之前,您应该先了解如何理解这些示例的基础,因为它们相当复杂。

一个小例子:O(n)

public void o(int n, int i) {
    if (i == n)
       return;

    o(n, i++);
}

这类似于for循环

for (int i = 0; i <= n; i++)

在示例3中:

return 0xCAFE + 0xBABE + s;

是任意的,看起来它什么都不表示,并且“ s”将是通过其循环的方法复杂性的大O值,

for (int i = 1; i <= x; i *= 2) { // BigO = 2 ^ i
    for (double j = x; j >= 1; j /= 3) {  // BigO = (2 ^i) / 3
        for (int k = 0; k < y; k += 4) {  //BigO = y / 4