我认为通过更改变量和归纳,此递归的复杂度为O(n ^ 2/3)`。但我不确定。这个解决方案正确吗?
答案 0 :(得分: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 。
换句话说,假设当n变大时,T(n)=Θ(n)将给我们不同的T(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。我还决定使用实值参数而不是离散整数值,只是为了简化数学运算。
如果绘制T(n)的值,则会得到以下曲线:
这看起来不像我期望的线性图所示。为了弄清楚这是什么,我将其绘制在对数/对数图上,该图具有很好的特性,即所有多项式函数都将转换为斜率等于指数的直线。结果如下:
我咨询了我的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),
但是我们不能从这个变成说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)项? That wouldn't surprise me,因为我们的递归收缩为平方根。但是,我已经进行了一些简单的数据探索,并且在其中看不到任何涉及重复日志的术语。
希望这会有所帮助!
答案 1 :(得分:0)
我们知道:
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/2 + 1/8 + 1/32 + ... + 1/2^k
,我们将得到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})
。
答案 2 :(得分:0)
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
我们将定义一个新函数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))))