我无法理解这个问题以及如何找到答案。你如何计算最差的运行时间?
以下程序的输入是包含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]
答案 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+j
从2
开始且永远不会超过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)(线性) )强>