如何获得此重现的时间复杂度:T(n)= sqrt(n)* T(sqrt(n))+ n

时间:2016-01-18 02:50:49

标签: algorithm time-complexity big-o asymptotic-complexity recurrence

这种复发:

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,但乘数不是常数,因此更改变量也不起作用。< / p>

我不知道如果在一次采访中给我这个复发的封闭形式或时间复杂性。你会做什么?

2 个答案:

答案 0 :(得分:2)

我没有使用任何常用技术。

请注意,没有基本情况。让我们考虑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 =&gt; n = a^(2^k) =&gt; lg(n) = 2^k =&gt; 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 基础$json_encoded_str = '["ab","cd"]'; // Will return an array of elements in your string var_dump(json_decode($json_encoded_str)); ,我们得到

array(2) {
    [0]=> string(2) "ab"
    [1]=> string(2) "cd"
}

答案 1 :(得分:2)

这些类型的递归可以通过展开递归来解决,发现元素之间的相似性。

enter image description here

现在在某些时候递归会耗尽自己。如果T(...) = T(a) = b,就会发生这种情况。任何合理的a都可以使用,因此我选择了2.通过获取双方的n^(1/2^k) = 2来求解等式log,得到:k = log(log(n))。现在在你的递归中替换它:

enter image description here

如果2^(-loglogn)0的限制等于n -> infinity,因此求和中的第一个元素等于b。复杂性为O(n * log log (n))

看看其他一些sqrt重现:

在面试中也没有人会这样给你。