"分析下面的伪代码,并将每个函数的渐近最坏情况运行时间作为Big-Theta表达式。"
我已经包含了下面的代码,并评论了每一行的操作计数。这个问题是使用假设的架构,其中每个原始操作需要1个单位的时间。
1: procedure KSum1(n)
2: S ← 0 // 1 for assignment
3: k ← n // 1 for assignment
4: while k ≥ 1 do // THIS IS THE PROBLEM
5: for i = 1, 2, . . . , k do // n*(whatever the while loop is)
6: S ← S + k // (1 for add + 1 for assignment)*(whatever the while loop is)
7: end for
8: k ← k/2 // (1 for divide + 1 for assignment)*(whatever the while loop is)
9: end while
10: return S // 1
11: end procedure
正如您所看到的,在这种情况下,我不确定如何处理while循环。
如果n = 4,那么它循环4→2→1,所以3加上额外的检查,共计4个。
如果n = 7,则循环7→3.5→1.75,3加1,总共4。
如果n = 9,则循环为9→4.5→2.25→1.125,4加1,总共5。
等
我很难想出一种模式来表达作为n的函数的while循环重复,并且它阻止我完成这个问题。有人能指出我正确的方向吗?新的算法分析和任何帮助表示赞赏!
答案 0 :(得分:0)
时间复杂度为O(log(n))
,这意味着对于给定的n
,计算算法需要log(n)
个步骤(或者更正式地说:代表函数的顺序给定的问题是log(n)
)。
在此分析中,您自己完成了大部分工作:
如果n = 4,那么它循环4→2→1,所以3加上额外的检查,共计4个。
如果n = 7,则循环7→3.5→1.75,3加1,总共4。
如果n = 9,则循环为9→4.5→2.25→1.125,4加1,总共5。
此处的“步骤”由单个右箭头表示,因此对于4和7有2个步骤,对于9有3个步骤。我们将其与floor(log(n))
进行比较:
`n = 4, log_2(4) = 2, floor(log_2(4)) = 2, #arrows = 2`
`n = 7, log_2(7) = 2.80735492206, floor(log_2(7)) = 2, #arrows = 2`
`n = 9, log_2(9) = 3.16992500144, floor(log_2(9)) = 3, #arrows = 3`