繁体   English   中英

渐近时间复杂度

[英]Asymptotic time complexity

阅读许多文章或答案后,我仍然无法解决确定函数的渐近时间复杂度的问题。 该函数例如是这样的:

def function(n):
    for i in range(n):
        if i == 0:
            for j in range(n):
                for k in range(10000):
                    print("output")

归因于n的渐近时间复杂度是多少,归因于n将被写入“输出”多少次?

谢谢。

理论

在此示例中,即使有3个嵌套循环,时间复杂度也应为O(n)

  • i循环运行n次。

  • j循环运行n次,但仅当i为0时。

  • k循环运行10000次,但这是一个常数因子。

为了更好地说明会发生什么,即使它们都等于n ,也让我们区分n_in_j 复杂度是:

O(1 * n_j * 10000 + n_i * 1) = O(10000 * n_j + n_i) = O(n_j + n_i) = O(n + n) = O(n)

输出应打印10000 * n次。

用%timeit检查

如果以计数器增量替换print调用:

def function(n):
    count = 0
    for i in range(n):
        if i == 0:
            for j in range(n):
                for k in range(10000):
                    count += 1

您可以在IPython中使用n递增值调用%timeit

%timeit function(10)
5.01 ms ± 36 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit function(100)
50.4 ms ± 334 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit function(1000)
497 ms ± 1.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit function(10000)
5.03 s ± 27.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

时间似乎完全符合O(n)

变化

if没有if复杂度为O(n**2)

def function(n):
    for i in range(n):
        for j in range(n):
            for k in range(10000):
                print("output")

如果krange(n)则复杂度为O(n**3) range(n)

def function(n):
    for i in range(n):
        for j in range(n):
            for k in range(n):
                print("output")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM