什么是这个setitem方法的Big-O?

时间:2016-11-25 22:50:42

标签: python dictionary time-complexity big-o

这个空字典__setitem__方法的时间复杂度是多少?我认为,字典的.key和.value python方法是O(n)(我在某处读过)而for循环也是O(n)。我的猜测是O(n)* O(n)* O(n)+ O(1)=对于循环+ if + if body + append。但我不确定那个"如果在for循环体"情况,.item和.value为O(n)。

请帮忙。这是我的学校考试。代码在python中。

def __setitem__(self,k,v):
  for item in self._table:
    if k == item._key:
      item._value = v
      return
  self._table.append(self._Item(k,v))

2 个答案:

答案 0 :(得分:2)

它是O(len(self._table))(假设构建self._ItemO(1)),因为在最坏的情况下,您需要检查self._table对象中的每个元素。

if语句及其正文在输入方面都是O(1),因为它们是原子操作。因此,for循环的复杂度为O(n) * O(1) * O(1) == O(n),其中n的大小为self._table

append是列表的原子操作,因此它已经摊销O(1),但是如果你完成了这个操作,那么你已经完成了O(n)工作,所以它使方法成为O(n) 1}}。

答案 1 :(得分:1)

复杂性为O(n)。如果你看一下复杂性,你总会想象要将非常大的数据放入算法中。对于大数字,O(n)O(2n)相同,它不是大O的有效表示法,因为它不会产生“大”差异,而O(n)则反对O(n^2)对计算复杂性产生巨大影响。由于您只在O(n)列出了一次列表,因为您循环了n次,并且没有嵌套循环或任何昂贵的计算列表,因此整体复杂性保持O(n)