你如何用big-O表示法来描述下面的内容?
rotors = [1,2,3,4,5 ...]
widgets = ['a', 'b', 'c', 'd', 'e' ...]
assert len(rotors) == len(widgets)
for r in rotors:
for w in widgets:
...
del widgets[0]
答案 0 :(得分:7)
是O(n ^ 2)。您可以看到内循环执行的次数是:
n + (n - 1) + (n - 2) + ... + 1
因为每个外部循环迭代都会删除一个窗口小部件。即(n ^ 2 + n)/ 2,即O(n ^ 2)。
答案 1 :(得分:5)
因为你经历了两个循环,所以它是O(n ^ 2)。
答案 2 :(得分:4)
由于断言:
assert len(rotors) == len(widgets)
O(n 2 )的答案是正确的,但是在列表不一定长度相同的一般情况下,你称之为O(m * n)。< / p>
答案 3 :(得分:3)
该算法的最差情况是O(n ^ 2)。
答案 4 :(得分:2)
这是O(n ^ 2),但我认为人们错过了这个问题的删除部分。
The first loop you have n widgets.
The second loop you have n-1 widgets.
...
The n-1 loop you have 2 widgets.
The n loop you have 1 widgets.
您可能认为降低了Big-O,但所有删除操作都将系数乘以1/2。
这是因为n +(n-1)+ ... + 2 + 1 = n(n + 1)/ 2。当N变为无穷大时,它变成n ^ 2/2,这只是O(n ^ 2)
答案 5 :(得分:2)
冒着既相反又迂腐的风险,你实际上还没有提供足够的信息来回答这个问题。当然,性能并不比O(n ^ 2)好,但由于你没有详细说明你在内循环中做了什么,所以通常情况会更糟。但是,假设内循环中发生的事情是O(1),则整体性能为O(n ^ 2)。
答案 6 :(得分:0)
是的,这就是为什么这些大问题总是难以弄明白的原因。 但是,如果我不得不猜测我会说O(n ^ 2),因为你每次都要进行2次循环执行某些操作。