f(n) = n O(n) 时间还是 O(1)?
Is f(n) = n O(n) time or O(1)?
我知道通常你会在试图弄清楚给定算法的复杂程度时忽略系数,但是假设我在 for 循环中有一个变量 n:
[(n, n) for n in range(1,11)]
,其中 returns
[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)]
这个赋值不就是一个复杂度O(1)的操作吗?我们不对 n 做任何操作。还是我误解了它的意思 - 也许 O(n) 时间描述了循环并完成所有这些分配需要多长时间?
上下文是下面的代码,是我为一个学校项目写的。
#Michael Frake, CMSC 350, UMGC, 5/22/2021
print("{:<7} {:<8} {:<8}".format('i','f(i)','g(i)'))
for i in range(21):
print("-", end="")
print()
for i in range(1, 25, 1):
f = (i / 2) + 10
g = i
print("{:<7} {:<8} {:<8}".format(i,f,g))
if g > f:
print("g overtook f when i was ", i)
break
哪个returns
i f(i) g(i)
---------------------
1 10.5 1
2 11.0 2
3 11.5 3
4 12.0 4
5 12.5 5
6 13.0 6
7 13.5 7
8 14.0 8
9 14.5 9
10 15.0 10
11 15.5 11
12 16.0 12
13 16.5 13
14 17.0 14
15 17.5 15
16 18.0 16
17 18.5 17
18 19.0 18
19 19.5 19
20 20.0 20
21 20.5 21
g overtook f when i was 21
我试图查看这两个函数的时间复杂度是否存在差异。
我觉得你有点混淆了符号。 O 表示法中的 n
指的是输入元素的数量(或迭代次数 取决于 输入)。它与您如何命名变量没有任何关系。
所以应该是:
[(value, value) for value in range(1, n)] # O(n)
其中 n
可以任意选择,因此 O(n)
中的这个简单的 for 循环 运行s。如果它是恒定的,例如因为你总是 运行 正是你的情况下的 21 个元素,所以它只是 O(21) = O(1)
.
[(value, value) for value in range(1, 21)]. # O(21) = O(1)
如果我们这样做,情况就会改变:
elements = list()
for i in range(n): # O(n) -> Depending on "n" (number of inputs)
for j in range(21): # O(21) -> Constant
elements.append((i, j))
这将表示为 O(n) * O(21)
,这将简化为 O(n)
,因为最坏时间复杂度取决于 n
,输入元素的数量。
为了完整起见,以下将是 O(n²)
:
elements = list()
for i in range(n): # O(n)
for j in range(n): # O(n)
elements.append((i, j))
我知道通常你会在试图弄清楚给定算法的复杂程度时忽略系数,但是假设我在 for 循环中有一个变量 n:
[(n, n) for n in range(1,11)]
,其中 returns
[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)]
这个赋值不就是一个复杂度O(1)的操作吗?我们不对 n 做任何操作。还是我误解了它的意思 - 也许 O(n) 时间描述了循环并完成所有这些分配需要多长时间?
上下文是下面的代码,是我为一个学校项目写的。
#Michael Frake, CMSC 350, UMGC, 5/22/2021
print("{:<7} {:<8} {:<8}".format('i','f(i)','g(i)'))
for i in range(21):
print("-", end="")
print()
for i in range(1, 25, 1):
f = (i / 2) + 10
g = i
print("{:<7} {:<8} {:<8}".format(i,f,g))
if g > f:
print("g overtook f when i was ", i)
break
哪个returns
i f(i) g(i)
---------------------
1 10.5 1
2 11.0 2
3 11.5 3
4 12.0 4
5 12.5 5
6 13.0 6
7 13.5 7
8 14.0 8
9 14.5 9
10 15.0 10
11 15.5 11
12 16.0 12
13 16.5 13
14 17.0 14
15 17.5 15
16 18.0 16
17 18.5 17
18 19.0 18
19 19.5 19
20 20.0 20
21 20.5 21
g overtook f when i was 21
我试图查看这两个函数的时间复杂度是否存在差异。
我觉得你有点混淆了符号。 O 表示法中的 n
指的是输入元素的数量(或迭代次数 取决于 输入)。它与您如何命名变量没有任何关系。
所以应该是:
[(value, value) for value in range(1, n)] # O(n)
其中 n
可以任意选择,因此 O(n)
中的这个简单的 for 循环 运行s。如果它是恒定的,例如因为你总是 运行 正是你的情况下的 21 个元素,所以它只是 O(21) = O(1)
.
[(value, value) for value in range(1, 21)]. # O(21) = O(1)
如果我们这样做,情况就会改变:
elements = list()
for i in range(n): # O(n) -> Depending on "n" (number of inputs)
for j in range(21): # O(21) -> Constant
elements.append((i, j))
这将表示为 O(n) * O(21)
,这将简化为 O(n)
,因为最坏时间复杂度取决于 n
,输入元素的数量。
为了完整起见,以下将是 O(n²)
:
elements = list()
for i in range(n): # O(n)
for j in range(n): # O(n)
elements.append((i, j))