计算算法的复杂度(Big-O)

时间:2019-04-14 17:11:25

标签: python time-complexity big-o

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

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

功能:

torch.Tensor

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

没有参数可以弹出其O(1)

带有一个弹出参数:

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

Time Complexity - Python Wiki

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

例如:

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

Reference

由于您要将index传递给self.items.pop(index),因此它的NOT O(1)。