【发布时间】: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 n 和 n! 这样的时间复杂度类型也不正确,因为它只是意味着用绝对值修改 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