簡體   English   中英

如何獲得此重復的時間復雜度:T(n)= sqrt(n)* T(sqrt(n))+ n

[英]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 ,其中ab為常數。

除以'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) >= an^(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.

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