微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有人可以解释这些代码片段的时间复杂度吗? 算法 A:算法 B:

如何解决有人可以解释这些代码片段的时间复杂度吗? 算法 A:算法 B:

我正在练习时间复杂度,其中一些对我来说有点太复杂了。 我真的很感激有人可以为我解释这些。

A) 时间复杂度为 O(n)。怎么样?

for (int i = N; i > 0; i = i/2) {
    for (int j = i+i; j > 0; j--) {
         doSomething(i,j);
    }
}

B) 时间复杂度为 O(n logn)。怎么样?

for (int i = N+N; i > 0; i--) {
    for (int j = N; j > 0; j = j/2) {
        doSomething(i,j);
    }
}

解决方法

我想我们必须假设 doSomething 的执行需要恒定的时间,与它作为参数获得的值无关。

算法 A:

在外循环的第一次迭代中,内循环迭代了 2? 次。外循环的每一次迭代,内循环的迭代次数减半。所以我们得到了这个系列:

2? + ? + ?/2 + ?/4 + ?/8 + ... + 2

鉴于这个级数是有限的,但具有1/2 + 1/4 + 1/8 + 1/16 + ...的模式,我们可以得出结论,这是小于4?,所以是O(?)。

算法 B:

这里内循环的迭代次数不依赖于?的值,所以总是一样的:每次执行log2?迭代(因为 ? 每次迭代都会减半)。随着外循环迭代 2? 次,doSomething 被称为 2?log2?,即 O(?log?)

,

问题 A

这里第一个循环将执行 log2(n)+1 次,第二个循环将执行 i+i 次。那么 i 在第二个循环中的值是多少。

对于 n,就像

n + n/2 + n/4 + n/8 + n/16 + .......

总结就是答案。

据我们所知 a + ar + ar^2 + ar^3 + ar^4 .... + ar^m = (1-a^(m+1))/(1-a)>

这里 a = n,r = 1/2 和 m = log2(n)+1

n + n/2 + n/4 + n/8 + ... n/(2^(m)) =2n−n/2^m = 2n-1;

所以复杂度是O(2n-1) = O(n)

问题 B

这里第一个循环将执行 n 次。并且对于第一次循环执行,第二次循环将被执行 log2(n)+1 次。

for (int j = n; j > 0; j = j/2)

例如 n = 10,j 的值为 10,5,2,1,0。对于 10,它将执行 4 次或 log2(10)+1 次。

因此对于每个第一个循环,它将执行 log2(n)+1 次。所以复杂性是 O(n(log2(n)+1)) = O(nlog(n))

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