问题来自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^3281039
,T(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};
}
)。
愿这些信息有用。
答案 0 :(得分:3)
看起来下限非常好,所以我试图证明上限是O(log n / log log n)
。
但是,让我先解释其他界限(只是为了更好地理解)。
T(n)
位于Θ(log n / log log n)
。
O(log n)
通过将n := n/log₂n
修改为n := n/2
可以看出这一点
在O(log₂ n)
成立之前,它需要n ≤ 2
步。
Ω(log n / log log n)
通过将n := n/log₂(n)
修改为n := n/m
可以看出这一点,其中m
是log 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
是虚数单位,I
是Lerch 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的回答
我是这个问题的拥有者,利用我昨天学到的“掌握方法”的知识,可以按照以下方式完成“有点难”的部分证明。
我将从这里开始:
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)