计算递归关系T(n)= sqrt(n * T(sqrt(n))+ n)

时间:2020-04-17 00:36:38

标签: algorithm recursion math time-complexity complexity-theory

我认为通过更改变量和归纳,此递归的复杂度为O(n ^ 2/3)`。但我不确定。这个解决方案正确吗?

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)的值,则会得到以下曲线:

Plot of the values of T(n), showing a quickly-growing but concave-down curve

这看起来不像我期望的线性图所示。为了弄清楚这是什么,我将其绘制在对数/对数图上,该图具有很好的特性,即所有多项式函数都将转换为斜率等于指数的直线。结果如下:

The log-log plot, showing a straight line.

我咨询了我的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))))
相关问题