使用big-O表示法的伪代码的复杂度/运行时间

时间:2019-04-10 14:09:53

标签: pseudocode

我需要解决一些问题。我刚刚开始阅读有关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)?

先谢谢了。感谢您的帮助。

致敬

2 个答案:

答案 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)相同。