这种复发:
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>
我不知道如果在一次采访中给我这个复发的封闭形式或时间复杂性。你会做什么?
答案 0 :(得分:2)
我没有使用任何常用技术。
请注意,没有基本情况。让我们考虑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
=&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)
这些类型的递归可以通过展开递归来解决,发现元素之间的相似性。
现在在某些时候递归会耗尽自己。如果T(...) = T(a) = b
,就会发生这种情况。任何合理的a
都可以使用,因此我选择了2.通过获取双方的n^(1/2^k) = 2
来求解等式log
,得到:k = log(log(n))
。现在在你的递归中替换它:
如果2^(-loglogn)
,0
的限制等于n -> infinity
,因此求和中的第一个元素等于b。复杂性为O(n * log log (n))
看看其他一些sqrt重现:
在面试中也没有人会这样给你。