Java 大O表示特定的双for循环 公共无效f7(int N){ 对于(int i=N/2;i>0;i--){ 如果(i%2==0){ 对于(int j=0;j
所以我试图找到这个特定代码块的渐进复杂性(大O) 我的想法是:第一个for循环是O(N),因为一半时间数字是奇数,另一半时间是偶数,if语句中的for循环仍然是O(N),else语句中的for循环仍然是O(logn),因为j*=2。所以对于我的最终答案,我得到了O(N^2(logn)),但显然答案只是O(N^2)。我想知道是否有人能解释我的想法哪里错了?谢谢 是O(N2)。原因是当i为偶数时,j循环为O(N),并且发生O(N)次;N*N是N2 j增加2并不重要;O(N/2)=O(N) 当i为奇数时,j循环为O(logn)-这在较慢的循环中只是成为噪声,这一点也不重要。内部循环的Java 大O表示特定的双for循环 公共无效f7(int N){ 对于(int i=N/2;i>0;i--){ 如果(i%2==0){ 对于(int j=0;j,java,nested,big-o,Java,Nested,Big O,所以我试图找到这个特定代码块的渐进复杂性(大O) 我的想法是:第一个for循环是O(N),因为一半时间数字是奇数,另一半时间是偶数,if语句中的for循环仍然是O(N),else语句中的for循环仍然是O(logn),因为j*=2。所以对于我的最终答案,我得到了O(N^2(logn)),但显然答案只是O(N^2)。我想知道是否有人能解释我的想法哪里错了?谢谢 是O(N2)。原因是当i为偶数时,j循环为O(N),并且发生O(N)次;N*N是N2 j增加2并不重要;O(N/2)=O(N) 当i为奇数
O(logn)
运行时间仅对i
的奇数值正确(这是i
可能值的一半)。对于偶数值i
,内部循环的运行时间将为O(N)
,因为j
在每次迭代中递增2
所以你所拥有的是
public void f7(int N) {
for (int i = N / 2; i > 0; i--) {
if (i % 2 == 0) {
for (int j = 0; j < N; j += 2) {
System.out.println("Hey");
}
} else {
for (int j = 1; j < N; j *= 2) {
System.out.println("You");
}
}
}
}
也就是O(N2),因为第一项(渐进地是增长较快的项)是N2/8,渐进地是O(N2)。True。但需要澄清一下。考虑到复杂性,我们只考虑增长最快的函数。在本例中,它是N^2,而不是N*Log(N)。因此,复杂性是N^2!请帮助!
(N/4 * N/2) + (N/4 * log(N))
even i odd i