关于循环的大O澄清与分裂

时间:2017-12-07 05:40:11

标签: algorithm big-o

我以为我完全理解了Big-O,我认为我仍然有理解,但我想确保我理解正确。

如果我的代码与此相似:

while(number > 0)
{
    sum += number;
    number /= 2;
}

我相信我的Big-O运行时将是O(N),因为通过我的计算,循环将运行O(N / 2),然后循环中的每个语句将运行O(1)所以我们最终得到O(N ^ 1/2)+ O(1)+ O(1)所以O(N ^ 1/2 + 1 + 1)我们放下常数,留下我们O(N ^ 1 / 2)或O(sqrt N)的复杂性......我相信这将是log(n)Big-O运行时但只是想要一些澄清和验证以确保我理解这个概念。我已经阅读了很多关于这个主题的内容并观看了视频 - 我无法在任何地方找到类似的足够的例子而且'数字/ = 2'是什么让我失望。

为了记录,这是一个家庭作业问题让我想到了这一点。

1 个答案:

答案 0 :(得分:1)

从数学上讲,假设number可以承载小数部分,您的算法甚至不会终止。这是因为无论你将正数除以多少次,你总会留下一些大于零的数字。实际上,由于舍入误差,计算机浮点数最终会达到零。

我想稍微改变一下回答你的问题:

while (number > 1) {
    sum += number;
    number /= 2;
}

此算法的运行时间实际上是log_2(N)(即N的日志基数2)。要查看原因,请考虑输入数为16.然后将进行以下迭代,并使用相应的值number

iteration # | number
1           | 16 = 2^4
2           | 8  = 2^3
3           | 4  = 2^2
4           | 2  = 2^1
5           | 1  = 2^0

您可以说服自己基础2上的指数确定迭代次数。我们通过获取日志库2来访问该值,因此运行时间为O(log_2(N))