O-Upper的python渐近复杂度

问题描述

我正在研究 python 中函数的复杂性,我有这两个我不确定,一个是因为我认为它是无限循环,第二个是 Python 中内置的 not in 方法

1- 函数 f1 接收一个正整数 n 和一个列表 v。v 大于 n。

def f1(n,v): 
   b=n*n
   s=0
   while b > 1: 
      s += v[n]
      s += b
      b -= 2 
   return s

2- 函数 f2 接收字典 d 和列表 l。

def f2(d,l): 
   r = []
   for x in l:
      if x not in d:
         r.append(x)
return r

我正在“O-Upper”上研究它们,O. ex O (n ^ 2) 是二次的。 这两个函数的复杂度是多少?

解决方法

f1 包含一个执行 O(n2) 次的循环,并且它只执行恒定时间的操作。就像 EnderShadow8 解释的那样,这使您的函数 O(n2)

f2 包含一个执行 O(n) 次的循环,其中 nl 的长度。 由于 d 是 Python 字典,检查 x 是否在 d 中运行在 amortized O(1) time 中。这是因为字典实际上不会遍历其所有元素来查找 x,而是使用底层哈希映射数据结构。 附加到列表实际上也是 Python 中的恒定时间操作。 因此,f2 实际上是一个 O(n) 时间函数。