在每次迭代时变量乘以/除以常数因子的循环被认为在O(log(n))时间内运行。
例如:
for(i=1; i<=n;i*2){
--some O(1) operations ...
}
如何计算或确定此循环将运行log(n)次?
我之前解释过,变量被分割/相乘的因子将是日志的基础。
我理解运行时间及其含义,我只是不理解达到此特定解决方案所需的数学/推理。 从数学上知道循环从i = 1到i = n每次乘以2,数学上如何从数学上得出这个解决方案?
(我试图理解这是理解如何通过恒定功率增加变量导致log(log(n))的运行时间的基础。)
答案 0 :(得分:2)
这就是我自己理解的方法:尝试提出一个函数f(x)
来模拟你的for循环,这样你的for循环的x th 迭代,你的迭代器i=f(x)
。对于for(i=0;i<n;i++)
的简单情况,很容易看出,对于每1次迭代,我上升一,所以我们可以说f(x)= x,在x th 循环的迭代,i = x。在0 th 迭代中,i = 0,在第一个i = 1上,在第二个i = 2上,依此类推。
对于另一种情况,for (i=1;i<n;i*=2)
,我们需要提出一个f(x)来模拟这样一个事实:对于每个x th 迭代,我加倍。连续加倍可以表示为2的幂,所以让f(x)=2^x
。在0 th 迭代中,i = 1,并且2 ^ 0 = 1。在第一个,i = 2,并且2 ^ 1 = 2,在第二个,i = 4,并且2 ^ 2 = 4,然后i = 8,2 ^ 3 = 8,然后i = 16,并且2 ^ 4 = 16。所以我们可以说f(x)=2^x
准确地模拟了我们的循环。
要确定循环完成达到某个n
所需的步数,请求解等式f(x)=n
。使用16的示例,即for (i=1;i<16;i*=2)
,它变为f(2^x)=16
。 log 2 (2 ^ x = 16)= x = 4,这与我们的循环在4次迭代中完成的事实一致。
答案 1 :(得分:1)
根据维基百科:
算法的时间复杂度量化算法作为表示输入的字符串长度的函数运行所花费的时间量。
所以假设我们从输入长度N得到一个函数T,T(N)意味着在N的数组上运行算法需要T(N)秒。
for(i=1; i<=n;i*2)
如果我们将算法中的数组大小加倍,我们将得到一个循环公式: T(2 * N)= T(N)+ C,这意味着如果我们将数组长度加倍,则需要与T(N)相同的时间加上恒定的运算时间。
有关于如何解决此类重现的理论,但您可以使用wolfram alpha solver的简单方法,因此,对于这种特殊情况,我们有result
当您通过
进入循环时for(i=1; i<=n;i+=3)
然后T(N)= T(N-3)+ C,这导致我们执行线性时间。