Java 大O表示特定的双for循环 公共无效f7(int N){ 对于(int i=N/2;i>0;i--){ 如果(i%2==0){ 对于(int j=0;j

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)

我的想法是:第一个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)-这在较慢的循环中只是成为噪声,这一点也不重要。

内部循环的
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