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 次。 所以我将其作为
我认为我一定无法正确解决此问题,因为否则没有必要重写该函数。
任何帮助,我们将不胜感激。
如果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) |
参考
由于您要将
如果使用Python的内置列表数据结构,则