簡體   English   中英

計算遞歸關系 T(n) = sqrt(n * T(sqrt(n)) + n)

[英]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) 的值,你會得到這條曲線:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM