看起来下限很好,所以我试图证明上限为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,其中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的初始值,直到当前的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)
。
现在我们需要知道每次除以
1/2⋅log(n_old)
的次数:
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
因此,我们得到递归公式
T₂(n) = T(sqrt(n)) + O(log(sqrt(n)) / log(log(sqrt(n))))
。
现在我们需要知道这个公式要扩展多少次,直到
n < 2
成立。
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
因此,我们需要将公式展开约
log log n
次。
现在变得有点困难。(也可以看看
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)的行中,我重新排列了总和。
因此,最后我们“只需要”计算
Σk = 1,...,t 2k / k
,其中
t = log log n - 1
。此时Maple将其解决为
Σ
k = 1,...,t 2
k / k = -I⋅π - 2
t⋅LerchPhi(2, 1, t) + 2
t/t
其中
I
是虚数单位,
LerchPhi
是
Lerch transcendent。由于上述总和的结果对于所有相关情况都是实数,因此我们可以忽略所有虚部。Lerch transcendent
LerchPhi(2,1,t)
似乎在
O(-1/t)
内,但我不确定。也许有人会证明这一点。
最后,这导致
T₂(n) = -2
t⋅O(-1/t) + 2
t/t = O(2
t/t) = O(log n / log log n)
总之,我们有
T(n) ∈ Ω(log n / log log n)
和
T(n) ∈ O(log n/ log log n)
,
因此
T(n) ∈ Θ(log n/ log log n)
成立。这个结果也得到了你的示例数据的支持。
希望这能让您理解并有所帮助。