看起来下限还不错,所以我试着证明上限是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)<sup>x</sup> < 2 for x 引导我们到
日志 n - x 日志日志 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 成立。
n
2-x-x⋅log n
所以我们需要将公式扩展为log log n 次。
现在变得有点难了。 (也可以看看Mike_Dog's answer)
T2(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 2
k - log log n / k
= log(n) ⋅ Σ
k=1,...,log log n - 1 2
k ⋅ 2
- log log n / ķ
= log(n) ⋅ Σ
k=1,...,log log n - 1 2
k / (k ⋅ log n)
= Σ
k=1,...,log log n - 1 2
k / k
在标有 (1) 的行中,我重新排序了总和。
所以,最后我们“只”必须为t = log log n - 1 计算Σ<sub>k=1,...,t</sub> 2<sup>k</sup> / k。此时 Maple 解决了这个问题
Σ
k=1,...,t 2
k / k = -I⋅π - 2
t⋅LerchPhi(2, 1, t) +2
t/t
其中I 是虚数单位,LerchPhi 是Lerch transcendent。由于上述总和的结果对于所有相关情况都是实数,因此我们可以忽略所有虚部。 Lerch 超越者LerchPhi(2,1,t) 似乎在O(-1/t) 中,但我对此不是100% 确定的。也许有人会证明这一点。
最终结果是
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) 成立。您的示例数据也支持此结果。
我希望这是可以理解的,它会有所帮助。