[英]Calculating the Recurrence Relation T(n) = sqrt(n * T(sqrt(n)) + n)
我認為這個遞歸的復雜性是 O(n^2/3)` 通過改變變量和歸納。 但我不確定。 這個解決方案正確嗎?
這是一個引人入勝的遞歸,它不能解決Θ(n)。 相反,它似乎解決了Θ(n 2/3 ) 。
為了直觀說明為什么這不可能是 Θ(n),讓我們假設我們正在處理一個非常非常大的 n 值。 那么自從
T(n) = (nT(√n) + n) 1/2
在 T(√n) ≈ √n 的假設下,我們會得到
T(n) = (n√n + n) 1/2
= (n 3/2 + n) 1/2
≈ n 3/4 。
換句話說,假設 T(n) = Θ(n) 會給我們一個不同的 T(n) 值,因為 n 變大了。
另一方面,讓我們假設 T(n) = Θ(n 2/3 )。 然后同樣的計算給了我們
T(n) = (nT(n) + n) 1/2
= (n · n 2/3 + n) 1/2
≈ (n 4/3 ) 1/2
= n 2/3 ,
這與它本身是一致的。
為了驗證這一點,我編寫了一個簡短的程序,在給定不同輸入的情況下打印出不同的 T(n) 值並繪制結果。 這是我寫的 T(n) 的版本:
double T(double n) {
if (n <= 2) return n;
return sqrt(n * T(sqrt(n)) + n);
}
我決定使用 2 作為基本情況,因為反復取平方根永遠不會讓 n 下降到 1。 我還決定使用實值 arguments 而不是離散的 integer 值,只是為了使數學更容易。
如果你 plot T(n) 的值,你會得到這條曲線:
這看起來不像我對線性 plot 的期望。 為了弄清楚這是什么,我將它繪制在對數/對數 plot 上,它具有一個很好的特性,即所有多項式函數都轉換為斜率等於指數的直線。 結果如下:
我咨詢了我的 Handy Neighborhood Regression Software 並要求它確定這條線的斜率。 這是它回饋的內容:
坡度:0.653170918815869
R 2 :0.999942627574643
這是一個非常好的擬合,0.653 的斜率非常接近 2/3。 所以這是更多的經驗證據支持遞歸求解到 Θ(n 2/3 )。
現在剩下要做的就是計算數學。 我們將使用一系列替換來解決這種重復。
首先,我通常不太習慣以這種遞歸方式使用指數的方式使用它們,所以讓我們記錄雙方的日志。 (在整個說明中,我將使用 lg n 來表示 log 2 n)。
lg T(n) = lg (nT(√n) + n) 1/2
= (1/2) lg (nT(√n) + n)
= (1/2) lg(T(√n) + 1) + (1/2)lg n
≈ (1/2) lg T(√n) + (1/2) lg n
現在,讓我們定義 S(n) = lg T(n)。 然后我們有
S(n) = lg T(n)
≈ (1/2) lg T(√ n) + (1/2) lg n
= (1/2) S(√ n) + (1/2) lg n
這更容易處理,盡管我們仍然存在每次冪次遞減的問題。 為了解決這個問題,讓我們再做一次替換,這是在處理這類表達式時相當常見的替換。 讓我們定義 R(n) = S(2 n )。 然后我們有
R(n) = S(2 n )
≈ (1/2)S(√2 n ) + (1/2) lg 2 n
= (1/2)S(2 n/2 ) + (1/2) n
= (1/2) R(n / 2) + (1/2) n
偉大的。 現在剩下要做的就是求解 R(n)。
現在,這里有一個小問題。 我們可以立即使用主定理得出 R(n) = Θ(n) 的結論。 這樣做的問題是,僅僅知道 R(n) = Θ(n) 不會讓我們確定 T(n) 是什么。 具體來說,假設我們只知道 R(n) = Θ(n)。 那么我們可以這么說
S(n) = S(2 lg n ) = R(lg n) = Θ(log n)
得到 S(n) = Θ(log n)。 然而,當我們試圖根據 S(n) 求解 T(n) 時,我們會遇到困難。 具體來說,我們知道
T(n) = 2 S(n) = 2 Θ(log n) ,
但我們不能go 從這里說 T(n) = Θ(n)。 原因是 Θ(log n) 中的隱藏系數在這里很重要。 具體來說,如果 S(n) = k lg n,那么我們有
2 k lg n = 2 lg n k = n k ,
所以對數的前導系數最終將確定多項式的指數。 因此,在求解 R 時,我們需要確定線性項的准確系數,即轉化為 S 的對數項的准確系數。
所以讓我們跳回到 R(n),我們知道是
R(n) ≈ (1/2) R(n/2) + (1/2)n。
如果我們重復幾次,我們會看到這種模式:
R(n) ≈ (1/2) R(n/2) + (1/2)n
≈ (1/2)((1/2) R(n/4) + (1/4)n) + (1/2)n
≈ (1/4)R(n/4) + (1/8)n + (1/2)n
≈ (1/4)((1/2)R(n/8) + n/8) + (1/8)n + (1/2)n
≈ (1/8)R(n/8) + (1/32)n + (1/8)n + (1/2)n。
模式似乎是,經過 k 次迭代,我們得到了
R(n) ≈ (1/2 k )R(n/2 k ) + n(1/2 + 1/8 + 1/32 + 1/128 +... + 1/2 2k+1 )。
這意味着我們應該查看總和
(1/2) + (1/8) + (1/32) + (1/128) +...
這是
(1/2)(1 + 1/4 + 1/16 + 1/64 +...)
作為幾何級數的總和,求解為
(1/2)(4/3)
= 2/3 。
你看。 這是我們之前所說的2/3。 這意味着對於某些常數 c,R(n) 的結果約為 (2/3)n + c,這取決於遞歸的基本情況,因此,我們看到
T(n) = 2 S(n)
= 2 S(2 lg n )
= 2 R(lg n)
≈ 2 (2/3)lg n + c
= 2 lg n 2/3 + c
= 2 c 2 lg n 2/3
= 2 c n 2/3
= Θ(n 2/3 )
這與之前的理論預測值和經驗觀察值相匹配。
這是一個非常有趣的問題,我承認我對答案感到驚訝,不過我有點緊張,我可能錯過了一些東西
lg T(n) = (1/2) lg (T(√n) + 1) + (1/2) lg n
至
lg T(n) ≈ (1/2) lg T(√ n) + (1/2) lg n。
有可能這個 +1 術語實際上在我不認識的重復中引入了一些其他術語。 例如,是否會出現 O(log log n) 項? 這不會讓我感到驚訝,因為我們有一個以平方根縮小的遞歸。 但是,我已經進行了一些簡單的數據探索,但我沒有看到任何看起來像涉及雙對數的術語。
希望這可以幫助!
我們知道:
T(n) = sqrt(n) * sqrt(T(sqrt(n)) + 1)
因此:
T(n) < sqrt(n) * sqrt(T(sqrt(n)) + T(sqrt(n)))
1
被替換為T(sqrt(n))
。 所以,
T(n) < sqrt(2) * sqrt(n) * sqrt(T(sqrt(n))
現在,要找到一個上限,我們需要解決以下循環關系:
G(n) = sqrt(2n) * sqrt(G(sqrt(n))
為了解決這個問題,我們需要擴展它(假設n = 2^{2^k}
和T(1) = 1
):
G(n) = (2n)^{1/2} * (2n)^{1/8} * (2n)^{1/32} * ... * (2n)^(1/2^k) =>
G(n) = (2n)^{1/2 + 1/8 + 1/32 + ... + 1/2^k} =
如果我們從1/2 + 1/8 + 1/32 +... + 1/2^k
中取因子1/2
,我們將得到1/2 * (1 + 1/4 + 1/8 +... + 1/2^{k-1})
. 我們知道1 + 1/4 + 1/8 +... + 1/2^{k-1}
是比率為1/4
的幾何級數,在無窮遠處等於4/3
。 因此G(n) = Theta(n^{2/3})
和T(n) = O(n^{2/3})
。
請注意,由於sqrt(n) * sqrt(T(sqrt(n)) < T(n)
,我們可以證明與前面的情況類似,即T(n) = Omega(n^{2/3})
。這意味着T(n) = Theta(n^{2/3})
。
T(n) = sqrt(n*T(sqrt(n)) + n)
我們將兩邊都提高到 2 的冪:
[T(n)]^2 = n*T(sqrt(n)) + n
從兩邊除n
:
{[T(n)]^2 / n} = T(sqrt(n) + 1
讓m
等於log(n)
因此, n
將等於2^m
{[T(2^m)]^2 / 2^m} = T(sqrt(2^m) + 1
我們將定義一個新的 function S(m) = {[T(2^m)]^2 / 2^m}
S(m) = T(m/2) + 1
根據 Mater 定理,它等於θ(log(m))
= θ(log(log(n)))
所以我們知道:
{[T(n)]^2 / n} = θ(log(log(n)))
兩邊同時乘以n
得到:
[T(n)]^2] = θ(n*log(log(n)))
因此,
T(n) = θ(sqrt(n*log(log(n))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.