algorithm - 渐近时间复杂度

标签 algorithm python-3.x big-o asymptotic-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_in_j,即使它们都等于 n。复杂度为:

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 中调用 %timeit,并增加 n 的值:

%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,复杂度将为 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):

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

关于algorithm - 渐近时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47430695/

相关文章:

python - 如何设置输入超时

c++ - 大O计算

c++ - 2 个对数嵌套 for 循环的 Theta 运行时间

java - 通过删除字符从现有字符串创建回文

PHP:在数据库中查找一组总和为特定数字的数字

algorithm - 如何降低以下算法中绘制图形的复杂性?

string - 给定一个字符串 X 和该字符串的反转 Y。 X 和 Y 的最长公共(public)序列是否总是回文?

python - 为什么 else 在这种情况下不起作用

python - 计算一个角色在电影剧本中说的话

algorithm - 实现一个队列,其中push_rear()、pop_front()和get_min()都是常量时间操作