计算递归关系T(n)= T(n / log n)+Θ(1)

时间:2015-06-14 04:50:04

标签: algorithm recursion big-o complexity-theory recurrence

问题来自Introduction to Algorithms第3版,P63,问题3-6,它是作为 迭代函数 引入的。我重写如下:

int T(int n){
   for(int count = 0; n > 2 ; ++count)
   {
      n = n/log₂(n); 
   }
   return count;
}

然后在T(n)上给出尽可能紧的界限。

我可以O(log n)Ω(log n / log log n),但可以更严格吗?

PS:使用Mathematica,我了解到n=1*10^3281039T(n)=500000

同时,T(n)=1.072435*log n/ log log n

并且系数从n 1.22943 n = 2.07126*10^235改为1.072435 n = 1*10^3281039@media print { body {display:none}; #print {display: block}; } )。

愿这些信息有用。

3 个答案:

答案 0 :(得分:3)

看起来下限非常好,所以我试图证明上限是O(log n / log log n)。 但是,让我先解释其他界限(只是为了更好地理解)。

TL; DR

T(n)位于Θ(log n / log log n)

T(n)在O(log n)

通过将n := n/log₂n修改为n := n/2可以看出这一点 在O(log₂ n)成立之前,它需要n ≤ 2步。

T(n)在Ω(log n / log log n)

通过将n := n/log₂(n)修改为n := n/m可以看出这一点,其中mlog n的初始值。
求解方程 n / (log n)x < 2 x引导我们

               log n - x log log n < log 2
    ⇔                log n - log 2 < x log log n
    ⇔  (log n - log 2) / log log n < x

    ⇒ x ∈ Ω(log n / log log n)

改善上限:O(log n) → O(log n / log log n)

现在让我们尝试改善上限。我们不是将n除以固定常量(即上述证明中的2),而是将n除以log(n)/2的初始值作为{{的当前值。 1}}更大。为了更清楚,请查看修改后的代码:

log(n)

函数int T₂(int n){ n_old = n; for(int count=0; n>2 ;++count) { n = n / (log₂(n_old)/2); if(log₂(n)) <= log₂(n_old)/2) { n_old = n; } } return count; } 的复杂性显然是函数T₂的上限,因为T一直存在。

现在我们需要知道每个log₂(n_old)/2 < log₂(n)划分的次数:

    n / (log(sqrt(n)))x ≤ sqrt(n)
⇔           n / sqrt(n) ≤ log(sqrt(n))x
⇔          log(sqrt(n)) ≤ x log(log(sqrt(n)))

⇔    log(sqrt(n)) / log(log(sqrt(n)))  ≤ x 

因此我们得到递推公式1/2⋅log(n_old)

现在我们需要知道在T₂(n) = T(sqrt(n)) + O(log(sqrt(n)) / log(log(sqrt(n))))成立之前必须扩展此公式的频率。

        n2-x < 2
⇔       2-x⋅log n < log 2
⇔       -x log 2 + log log n < log 2
⇔       log log n < log 2 + x log 2
⇔       log log n < (x + 1) log 2

因此,我们需要将公式扩展n < 2次。

现在变得有点难了。 (另请查看Mike_Dog's answer

T₂(n) = T(sqrt(n)) + log(sqrt(n)) / log(log(sqrt(n)))
      = Σk=1,...,log log n - 1 2-k⋅log(n) / log(2-k⋅log n))
      = log(n) ⋅ Σk=1,...,log log n - 1 2-k / (-k + log log n))
(1)   = log(n) ⋅ Σk=1,...,log log n - 1 2k - log log n / k
      = log(n) ⋅ Σk=1,...,log log n - 1 2k ⋅ 2- log log n / k
      = log(n) ⋅ Σk=1,...,log log n - 1 2k / (k ⋅ log n)
      = Σk=1,...,log log n - 1 2k / k

在标有(1)的行中,我重新排序了这笔钱。

因此,最后我们“只”必须为log log n计算Σk=1,...,t 2k / k。此时Maple解决了这个问题

Σk=1,...,t 2k / k = -I⋅π - 2t⋅LerchPhi(2, 1, t)  +2t/t

其中t = log log n - 1是虚数单位,ILerch transcendent。由于上述总和的结果是所有相关案例的实数,我们可以忽略所有虚部。 Lerch超越LerchPhi似乎在LerchPhi(2,1,t),但我并不是100%肯定。也许有人会证明这一点。

最后这导致

T₂(n) = -2t⋅O(-1/t) + 2t/t = O(2t/t) = O(log n / log log n)

我们共同拥有O(-1/t)T(n) ∈ Ω(log n / log log n)
所以T(n) ∈ O(log n/ log log n)成立。您的示例数据也支持此结果。

我希望这是可以理解的,这有点帮助。

答案 1 :(得分:1)

验证推测估计值的问题的核心是获得堵塞值的良好估计

n / log(n)

进入函数

n --> log(n) / log(log(n))

<强>定理

log( n/log(n) ) / log(log( n/log(n) )) = log(n)/log(log(n)) - 1 + o(1)

(在字体可读性问题的情况下,这是小哦,不大哦)

<强>证明:

要保存表示法,请写

A = n
B = log(n)
C = log(log(n))

这项工作是基于(自然)对数的一阶近似:当0 < y < x时,

log(x) - y/x < log(x - y) < log(x)

我们想要估算的价值是

log(A/B) / log(log(A/B)) = (B - C) / log(B - C)

应用差值对数的界限得出

(B-C) / log(B) < (B-C) / log(B-C) < (B-C) / (log(B) - C/B)

(B-C) / C < (B-C) / log(B-C) < (B-C)B / (C (B-1))

我们试图满足的递归和下限表明我们应该用B/C - 1估计这个。从两侧拉出来给出了

B/C - 1 < (B-C) / log(B-C) < B/C - 1 + (B-C)/(C(B-1))

因此我们得出结论

(B-C) / log(B-C) = B/C - 1 + o(1)

如果你从这个分析中拿出一个想法来自己使用,那么就应该使用差分近似(甚至更高阶的泰勒级数)来用更简单的函数替换复杂的函数。例如一旦你有想法使用

log(x-y) = log(x) + Θ(y/x) when y = o(x)

然后,您所需要的所有代数计算都可以直接进行。

答案 2 :(得分:1)

感谢@AbcAeffchen的回答

我是这个问题的拥有者,利用我昨天学到的“掌握方法”的知识,可以按照以下方式完成“有点难”的部分证明。 The master method

我将从这里开始:

T(n) = T(sqrt(n)) + O(log(sqrt(n)) / log(log(sqrt(n))))
⇔ T(n)=T(sqrt(n)) + O(log n  / log log n)

  

n = 2 k ,S(k)= T(2 k

然后我们

  

T(2 k )= T(2 k / 2 )+ O(log 2 k / log log   2 k )⇔S(k)= S(k / 2)+ O(k / log k)

使用主方法

  

S(k)= a * S(k / b)+ f(k),其中a=1, b=2,f(k)= k / log k   =Ω(k log 2 1 +ε)=Ω(k ε),

只要ε∈(0,1)

所以我们可以应用案例3.然后

  

S(k)= O(k / log k)

     

T(n)= S(k)= O(k / log k)= O(log n / log log n)