Algorithm 这个算法是O(logn)复杂度吗?

Algorithm 这个算法是O(logn)复杂度吗?,algorithm,time-complexity,big-o,complexity-theory,logarithm,Algorithm,Time Complexity,Big O,Complexity Theory,Logarithm,特别是,我对寻找θ复杂性感兴趣。我可以看到该算法是以log(n)为界的,但考虑到问题的规模呈指数级减小,我不确定如何继续 回答您的问题最简单的方法是从对数(在我的例子中是二进制对数)的角度来看算法: 这样我们可以看到,在每一步中,logi减少logj=k+1。 现在我们什么时候退出循环? 这种情况发生在 因此,最大步数是最小的整数k,因此 持有。 渐近地,这相当于,因此您的算法在中,让我们表示i(k)和j(k)迭代k时i和j的值(因此假设i(1)=n,j(1)=2)。我们可以很容易地通过归纳法

特别是,我对寻找θ复杂性感兴趣。我可以看到该算法是以log(n)为界的,但考虑到问题的规模呈指数级减小,我不确定如何继续


回答您的问题最简单的方法是从对数(在我的例子中是二进制对数)的角度来看算法:

这样我们可以看到,在每一步中,
logi
减少
logj=k+1

现在我们什么时候退出循环?
这种情况发生在

因此,最大步数是最小的整数
k
,因此
持有。
渐近地,这相当于,因此您的算法在

中,让我们表示i(k)和j(k)迭代k时i和j的值(因此假设i(1)=n,j(1)=2)。我们可以很容易地通过归纳法证明j(k)=2^k


知道上面关于i(k)的公式,你可以计算k值的上界,这是得到i(k)所需要的。你可以根据递归关系$T(n)=1+T(n/2)$(这个程序满足)和主定理计算一个显式公式。θ复杂度正好是$log(N)$,因为基本情况是$T(1)=0$,因为T(N)=aT(N/b)+f(N)中的因子“b”不是该算法的常数,使用主定理不是不正确吗?也就是说,对于每个连续的问题,b增加2倍。我的错误,你是正确的。谢谢你这个简洁的方法。读了几遍才明白,但现在有了意义。
i = n
j = 2
while (i >= 1)
    i = i/j
    j = 2j
log i_0 = log n
log j_0 = 1
k = 0
while (log i_k >= 0) # as log increases monotonically
    log i_{k+1} = log i_k - log j_k
    log j_{k+1} = (log j_k) + 1
    k++