[英]How to get the time complexity of this recurrence: T(n) = sqrt(n) * T(sqrt(n)) + n
重復發生:
T(n) = sqrt(n) * T(sqrt(n)) + n
用Master定理似乎無法解決。 它似乎也無法用Akra-Bazzi解決。 即使我將n = 2 ^ k設置為T(2^k) = 2^(k/2) * T(2^(k/2)) + 2^k
,然后讓S(k) = T(2^k)
變為S(n) = 2^(n/2) * S(n/2) + 2^n
但是乘數不是常數,因此更改變量也不起作用。
如果是在采訪中給我的話,我不確定如何得出這種重復的封閉形式或時間復雜性。 你會怎么做?
我在這里沒有使用任何常用技術。
請注意,沒有基本情況。 讓我們考慮T(a) = b
,其中a
和b
為常數。
除以'n',我們得到: T(n) / n = T(sqrt(n)) / sqrt(n) + 1
使用g(k) = T(k) / k
所以g(n) = g(sqrt(n)) + 1
這基本上意味着g(n)
是我們可以得到sqrt(n)
在此之前我們達到恆定的基本情況a
。
這意味着有一個k
使得n^(1/2^k) >= a
和n^(1/2^(k+1)) < a
。
令n^(1/2^k) = a
=> n = a^(2^k)
=> lg(n) = 2^k
=> lg(lg(n)) = k
。 然后g(n) = k + b = O(log(log(n)))
。
這意味着T(n) = n * O(log(log(n))) = O(n * log(log(n)))
。 將其代入原始方程式似乎很有意義。
驗證:如果將O()
表示法中的常數設置為1
並讓T(n) = n * lg(lg(n))
,其中lg(n)
以log
2
為底,我們得到
RHS = sqrt(n) * (sqrt(n) * lg(lg(sqrt(n)))) + n
= n * lg(1/2 * (lg(n))) + n
= n * (lg(lg(n)) - 1) + n
= n * lg(lg(n)) - n + n
= T(n)
= LHS
這些類型的遞歸可以通過展開遞歸,找出元素之間的相似性來解決。
現在,遞歸將耗盡。 如果T(...) = T(a) = b
會發生這種情況。 任何合理的a
都會起作用,因此我選擇2。通過取雙方的對log
來求解方程n^(1/2^k) = 2
,您將得出: k = log(log(n))
。 現在,將其替換為遞歸:
如果n -> infinity
,則2^(-loglogn)
極限等於0
,因此求和的第一個元素等於b。 復雜度為O(n * log log (n))
看看其他一些sqrt重復發生:
也沒有人會在面試中給你這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.