以下计数(A,B,n)算法的大O(O(n))和Big-Omega(Ω(n))时间复杂度是多少?
我做了以下事情: 算法计数(A,B,n)
Input: Arrays A and B of size n, where n is even.
A, B store integers. # of operations:
i <- 0 1
sum <- 0 1
while i < n/2 do n/2 + 1
if A[i + n/2] < 0 then n/2 + 1
for j <- i + n/2 to n do n/2 + n/2+1 + … + n = n(n+1)/2
sum <- sum + B[j] n/2 + … + n = n(n+1)/2
i <- i + 1 n/2 + 1
return sum _ _1______
算法计数在Big-O和Big-Omega中运行O(n ^ 2)和Ω(n ^ 2)。该算法涉及嵌套的“for”循环。在最坏情况和最佳情况下,算法计数执行的基本操作的最大数量为0.5n^2+ n + 1
。
答案 0 :(得分:2)
我认为最坏的情况是O(n ^ 2),而最好的情况是Ω(1)。最好的情况是当你有一个大小为2的数组,并且A [1]> = 0时,在这种情况下算法只需要通过循环一次。如果n可以为0(即空数组),那就更好了。
为了说明最佳情况(n = 2,假设0不可接受,A [1]> = 0),我们假设赋值操作需要恒定时间,C1。
i <- 0
sum <- 0
需要恒定时间2 * C1。
while 0 < 2/2 do
持续时间为C2。
if A[0 + 2/2] < 0 then //evaluates to false when A[1] >= 0
持续时间为C3,嵌套的for循环永远不会被执行。
i <- i + 1
持续时间C4。循环检查不变量:
while 1 < 2/2 do
需要C2。然后操作返回:
return sum
采用C5。
因此,在n = 2且A [1]> = 0的最佳情况下的操作是:
2*C1 + 2*C2 + C3 + C4 + C5 = O(1)
现在,你可以说它应该是:
2*C1 + (n/2 + 1)*C2 + C3 + C4 + C5 = O(n)
但我们已经知道,n = 2,这是恒定的。
在最佳情况是n = 0的情况下:
2*C1 + C2 + C5 = O(1)