【问题标题】:Is this algorithm O(log log n) complexity?这个算法复杂度是 O(log log n) 吗?
【发布时间】:2018-02-06 07:36:41
【问题描述】:

特别是,我对找到 Theta 复杂度很感兴趣。我可以看到该算法以 log(n) 为界,但考虑到问题大小呈指数增长,我不确定如何继续。

i = n
j = 2
while (i >= 1)
    i = i/j
    j = 2j

【问题讨论】:

  • 你可以从递归关系 $T(n) = 1 + T(n/2)$ (这个程序满足)和主定理计算一个显式公式。 Theta 复杂度正好是 $log(N)$,因为基本情况是 $T(1) = 0$
  • 既然 T(n) = aT(n/b) + f(n) 中的因子 'b' 不是这个算法的常数,使用主定理是不是不正确?也就是说,对于每个连续的问题,b 都会增加 2 倍。
  • 我的错,你是对的

标签: algorithm time-complexity big-o complexity-theory logarithm


【解决方案1】:

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

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++

这样我们看到log i 在每一步都减少了log j = k + 1
现在我们什么时候退出循环?
这发生在

因此最大步数是最小整数k 使得
持有。
渐近,这相当于,所以你的算法在

【讨论】:

  • 感谢您提供这种简洁的方法。读了几遍才明白,但现在说得通了。
【解决方案2】:

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

知道上面关于 i(k) 的公式,您可以计算出使 i(k)

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2011-07-09
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多