证明时间复杂性

时间:2014-03-24 15:18:05

标签: time-complexity proof

我正在尝试确定这两个函数的复杂性,其中整数和列表中的D是整数列表:

def solve(D, list):
    for element in List:
      doFunc(element, D, list)

def doFunc(element, D, list):
  quantityx = 0 
  if(D > 0):
    for otherElement in list:
      if otherElement == element:
        quantityx += 1
    return quantityx + (doFunc ((element+1), (D-1), list))
  return 0

直观地说,我认为它有一个O(n²),其中n是列表元素的数量,但我想以正式的方式证明它。

1 个答案:

答案 0 :(得分:1)

首先观察:solve调用doFunc,但不是相反。因此,solve的复杂性将取决于doFunc的复杂性,而不是相反。{我们需要首先弄清楚doFunc的复杂性。

T(E, D, N)成为doFunc的时间复杂度,ED以及列表中的元素数量N。每次调用doFunc时,我们都会对循环执行N次迭代,然后使用doFuncE+1调用D-1,并且列表不会更改。基于此,我们知道doFunc的时间复杂度由以下递归公式给出:

T(E, D, N) = aN + b + T(E+1, D-1, N)

此处,ab是要确定的常量。

现在我们需要这个递归公式的基本案例。我们的基本情况是我们唯一没有递送的时间,就是D <= 0。假设D是非负数,这意味着D = 0是基本情况。我们得到以下额外要求:

T(E, 0, N) = c

在这里,c是一个常数待定。

综上所述,我们可以为D的不同值列出一些值,看看我们是否可以识别模式:

D    T(E, D, N)
0    c
1    c + b + aN
2    c + 2b + 2aN
3    c + 3b + 3aN
...
k    c + kb + kaN

基于此,我们可以猜测T(E, D, N) = c + Db + aDN对于某些常量a, b, c。我们可以看到这个公式满足基本情况,我们可以检查它是否也满足递归部分(试试这个)。因此,这是我们的功能。

假设EDN都是独立且自由变化的,doFunc的时间复杂度最好呈现为O(c + Db + aDN) = O(DN)

由于solve为列表中的每个元素调用doFunc一次,因此其复杂度仅为N的{​​{1}}倍,即doFunc。< / p>