我需要解决一些问题。我刚刚开始阅读有关O表示法的文章,但是在分析代码时我还是很陌生。
所以这是问题所在:
给出以下伪代码,其中A是一个数字字段,可以访问索引1到length(A)上的元素。我由整数组成,因此除法结果四舍五入。函数SkipPrint的复杂性是什么?
1: procedure SkipPrint(A)
2: i <- length(A)
3: do
4: print(A[i])
5: i <- i/2
6: while i>0
所以我认为复杂度为O(n),因为该函数需要通过数组,但只能通过一次,对吗? (第2行)每隔一行的幅度较小,因此保持为O(n)?
先谢谢了。感谢您的帮助。
致敬
答案 0 :(得分:0)
这将是O(n),是的。你是对的。这是因为只有一个循环在一个方向上迭代。 (i
在这种情况下总是变小)
答案 1 :(得分:0)
让我们假设n = length(A)
,首先假设对于一个整数length(A) = 2^m
,我们处于m
的简单情况下。
然后i
(每一步减半)将具有以下值:
2^m, 2^{m-1}, 2^{m-2}, ..., 2, 1, 0
这表明循环将运行m
次,直到i
到达0
。由于n = 2^m
,这意味着m = lg n
,因此复杂度为O(lg n)
。
通常情况下,定义m := floor(lg n)
。上面的分析表明,循环将迭代m
次,直到i
变为0
。因此,复杂度将为O(floor(lg n))
,与O(lg n)
相同。