这个算法的大O成本函数是什么?

时间:2010-05-05 14:39:37

标签: algorithm big-o

你如何用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]

7 个答案:

答案 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次循环执行某些操作。