[英]Calculating the Recurrence Relation T(n)=T(n / [(log n)^2]) + Θ(1)
[英]Calculating the Recurrence Relation T(n)=T(n / log n) + Θ(1)
問題來自Introduction to Algorithms 3rd Edition, P63, Problem 3-6,在那里它被引入為Iterated functions 。 我改寫如下:
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
到1.072435
( n = 1*10^3281039
)。
願此信息有所幫助。
看起來下界很不錯,所以我試圖證明上界是O(log n / log log n)
。 但讓我首先解釋其他界限(只是為了更好地理解)。
T(n)
在Θ(log n / log log n)
。
O(log n)
這可以通過將n := n/log₂n
修改為n := n/2
n := n/log₂n
出。
它需要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
for 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 的回答)
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) 的行中,我對總和進行了重新排序。
因此,最后我們“僅”必須為t = log log n - 1
計算Σ k=1,...,t 2 k / k
。 此時 Maple 解決了這個問題
Σk=1,...,t 2k / k = -I⋅π - 2t⋅LerchPhi(2, 1, t) +2t/t
其中I
是虛數單位, LerchPhi
是Lerch 超越數。 由於上述總和的結果對於所有相關情況都是實數,我們可以忽略所有虛部。 Lerch 超越LerchPhi(2,1,t)
似乎在O(-1/t)
,但我不是 100% 確定。 也許有人會證明這一點。
最后這導致
T₂(n) = -2t⋅O(-1/t) + 2t/t = O(2t/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)
成立。 您的示例數據也支持此結果。
我希望這是可以理解的,它會有所幫助。
驗證推測估計的問題的本質是獲得一個很好的塞值估計
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)
那么您的問題所需的所有代數計算都可以直接遵循。
感謝@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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.