如何使用big-O表示法确定每个程序的最坏情况运行时间?

时间:2017-09-11 09:14:55

标签: algorithm runtime discrete-mathematics

我无法理解这个问题以及如何找到答案。你如何计算最差的运行时间?

以下程序的输入是包含n个整数A [1]···A [n]的数组A.使用big-O表示法限制每个程序的最坏情况运行时间。

问题1:

i = 1, total = 0 
while i < n/2:
    total = total + A[i] 
    i=i*2

问题2:

total = 0
S = the set {1,2,3,4...n} 
for each subset T of S
    for each element x in T
          total = total + A[x]

问题3:

int i = 1, j = 1; 
    for i = 1 to n:
          while (j < n && A[i] < A[j])
             j++

数字A [1],...的数组的前缀和。 。 。 ,A [n]是第二个数组B [1] ,. 。 。 ,B [n]其中

B [i] = 从j = 1到i的总和 A [j]

以下问题计算前缀总和:

问题4:

for i = 1 to n: 
    B[i] = 0;
    for j = 1 to i:
          B[i] += A[j]

问题5:

B[1] = A[1]; 
for i = 2 to n:
      B[i] = B[i-1] + A[i]

1 个答案:

答案 0 :(得分:1)

问题1:
该算法在每次访问时执行恒定时间操作(添加),并且在i<n/2时进行访问。由于每次i加倍,因此log(n/4)步后条件将不再成立,因此最坏情况下的时间复杂度为 O(log(n))(对数)。< / p>

问题2:
该算法访问数组中的每个元素(伪代码中的x),与S的子集一样多次,并在访问点执行恒定时间操作。每个元素都在包含自身的 2 ^(n-1)子集中,并且有 n 这样的元素,因此最坏的情况时间复杂度为 O( n * 2 ^(n))(指数)

问题3:
请注意,每次检查while循环中的条件时,i+j的值都会增加1,并且i+j的值永远不会减少。由于i+j2开始且永远不会超过2n+1,因此算法的整体复杂性为 O(n)(线性)

问题4:
对于给定的i值,内循环运行i次。此外,i的范围从1到n,因此我们执行1 + 2 + 3 + ... + n = n(n + 1)/ 2个恒定时间计算(添加),因此总体复杂度为算法 O(n ^ 2)(二次)

问题5:
该算法访问数组的 n-1 元素,并在每次访问(加法)时执行恒定时间操作,因此最坏情况时间复杂度为 O(n)(线性) )