关于python:计算算法的复杂度(Big-O)

Calculating complexity of an algorithm (Big-O)

我目前正在围绕Big-O复杂度进行一些工作,并计算算法的复杂度。

我似乎正在努力制定出计算复杂度的步骤,并正在寻找解决方法。

功能:

1
2
3
4
5
6
index = 0
    while index < len(self.items):
        if self.items[index] == item:
            self.items.pop(index)
        else:
            index += 1

实际的挑战是重写此函数,以使其具有O(n)最坏情况的复杂性。

我的问题是,据我所知,赋值语句和if语句的复杂度为O(1),而while循环的复杂度为(n),在最坏的情况下,while循环中的任何语句都可以执行n 次。 所以我将其作为1 + n + 1 = 2 + n = O(n)

我认为我一定无法正确解决此问题,因为否则没有必要重写该函数。

任何帮助,我们将不胜感激。


如果self.items是一个列表,则pop操作的复杂度为" k",其中k是索引,
所以这不是O(N)的唯一方法是因为弹出操作。
为了使您可以使用其他一些迭代方法并将其从列表中删除,练习可能已完成。

要使其为O(N),您可以执行以下操作:

1
self.items = [x for x in self.items if x == item]


没有参数弹出其O(1)

弹出一个参数:

  • 平均时间复杂度O(k)(k表示作为pop参数传入的数字
  • 摊销最坏情况时间复杂度O(k)
  • 最坏情况下的时间复杂度O(n)

时间复杂度-Python Wiki

因此,为使您的代码有效,请允许用户从列表末尾弹出:

例如:

1
2
def pop():
    list.pop(-1)

参考

由于您要将index传递给self.items.pop(index),因此其不是O(1)。


如果使用Python的内置列表数据结构,则pop()操作在最坏的情况下不是恒定的,而是O(N)。因此,您的总体复杂度为O(N^2)。如果您不能使用辅助空间,则将需要使用其他数据结构,例如链表。