Python 子方法(m)的复杂度为O(m),下面代码的最坏情况复杂度是多少? def func(n): j=1 对于范围内的i(n//2,n+1): 而(j 100: 而(j>1): j=j-1 #做某事O(1)

Python 子方法(m)的复杂度为O(m),下面代码的最坏情况复杂度是多少? def func(n): j=1 对于范围内的i(n//2,n+1): 而(j 100: 而(j>1): j=j-1 #做某事O(1),python,time-complexity,Python,Time Complexity,i=1,输出=2 i=2到3,输出=2,4 i=4到7,输出=2,4,8 i=8到15,输出=2,4,8,16 i=16到31输出=2,4,8,16,32第一个循环是O(n),因为它是O(n/2),我们去掉常数和低阶项 第二个循环是O(lg-n),因为j是2^k(即2,4,8,16,32) 第三个循环是任意j并倒计时,所以O(j)。j从1开始,并注意到在最坏的情况下,它会增长2^k到n。假设n是1000。当j是500时,下一次迭代将是500*2=1000 时间复杂度为O(n+lg-n+lg-n+

i=1,输出=2
i=2到3,输出=2,4
i=4到7,输出=2,4,8
i=8到15,输出=2,4,8,16
i=16到31输出=2,4,8,16,32第一个循环是O(n),因为它是O(n/2),我们去掉常数和低阶项

第二个循环是O(lg-n),因为j是2^k(即2,4,8,16,32)

第三个循环是任意j并倒计时,所以O(j)。j从1开始,并注意到在最坏的情况下,它会增长2^k到n。假设n是1000。当j是500时,下一次迭代将是500*2=1000

时间复杂度为O(n+lg-n+lg-n+j)=O(n+2lg-n+j)->O(n+lgn+j)->O(n)

我们放弃lg-n是因为当n接近无穷大时,n的增长率总是会超过lg-n。这与我们在n^3存在时放弃n^2是一样的,因为后者随着时间的推移增长更快

我们放弃j是因为,当j的增长率依赖于n时,它能超过n吗?

第一个循环是O(n),因为它是O(n/2),我们放弃常数和低阶项

第二个循环是O(lg-n),因为j是2^k(即2,4,8,16,32)

第三个循环是任意j并倒计时,所以O(j)。j从1开始,并注意到在最坏的情况下,它会增长2^k到n。假设n是1000。当j是500时,下一次迭代将是500*2=1000

时间复杂度为O(n+lg-n+lg-n+j)=O(n+2lg-n+j)->O(n+lgn+j)->O(n)

我们放弃lg-n是因为当n接近无穷大时,n的增长率总是会超过lg-n。这与我们在n^3存在时放弃n^2是一样的,因为后者随着时间的推移增长更快

我们降低j是因为,当j的增长率依赖于n时,j的增长率会超过n吗

def func(n):
    j=1
    for i in range(n//2, n+1):
        while (j <= n):
            j = j * 2
            subMethod(i)
        if i > 100:
            while (j > 1):
            j = j - 1
            #doing something O(1)