【问题标题】:Why is n^2 considered a type of time complexity but n/2 isn't? [duplicate]为什么 n^2 被认为是一种时间复杂度,而 n/2 不是? [复制]
【发布时间】:2022-02-15 22:34:38
【问题描述】:

我已经搜索了整个堆栈溢出,但找不到一个简洁的答案。 考虑这段代码:

n = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ] # O(1)
for i in n: # O(n)
    for j in i: # O(n)
        print(j)

如果我对O()的理解是正确的,这个算法的时间复杂度是1+n*n,如果我们把无关紧要的1+丢掉,就变成n^2,也就是二次时间。 现在考虑这段代码:

n = input() # O(1)
for i in range(0, len(n), 2): # O(n/2)?
    print(n[i])

这次我们使用除法而不是指数:1+n/2 -> n/2

但是在我搜索的所有地方,人们都说O(n/2) == O(n),因为O()测量相对时间等。但是如果O(n/2)是绝对的,我们应该在使用大O时将它折叠成O(n),不是吗使 log nn! 这样的时间复杂度类型也不正确,因为它只是意味着用绝对值修改 n...?

n^2 == n 因为它与n/2 相同,但我们使用^ 而不是/n! 不正确,因为阶乘只是一系列乘法,所以 n!n*(n-1)*... 相同,我相信在丢弃所有 -1 后会崩溃成完全不同的东西。 我哪里错了?

附:我对对数和大 O 表示法的理解非常不完整,如果我遗漏了一些明显的东西,请不要恨我。

【问题讨论】:

  • 因为O(n/2) == O(n/1)O(n^2) != O(n^1)
  • O(f(n)) = O(c * f(n)) 如果 c 是常数。而1/2 是一个常数,n 不是。
  • O(n) 时间复杂度的算法是这样的,如果 n 加倍,那么算法花费的时间是原来的两倍。 O(n^2) 时间复杂度的算法是这样的,如果 n 加倍,则该算法需要 倍的时间。所以“n^2 == n”是非常错误的。
  • 把它想象成正比,所以你可以忽略这个常数。 O(4n) 与 n 成正比,常数为 1/2 的 O(n/2) 也是如此。
  • O(n)和O(n/2)的增长都是直线。 O(n^2)的增长是一条曲线。

标签: python algorithm time-complexity big-o


【解决方案1】:

看看 big O 上的Wikipedia page

在典型用法中,O 表示法是渐近的,也就是说,它指的是非常大的 x。在这种情况下,“增长最快”的术语的贡献最终会使其他术语变得无关紧要。因此,可以应用以下简化规则:

  • 如果 f(x) 是多项的和,如果有一个增长率最大,则可以保留,其他的都省略。
  • 如果 f(x) 是多个因子的乘积,则可以省略任何常数(乘积中不依赖于 x 的项)。

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2021-12-22
    相关资源
    最近更新 更多