【问题标题】:Can someone help solve this recurrence relation? [closed]有人可以帮助解决这种重复关系吗? [关闭]
【发布时间】:2011-04-26 18:21:03
【问题描述】:
T(n) = 2T(n/2) + 0(1)

T(n) = T(sqrt(n)) + 0(1)

在第一个中,我对 n、logn 等使用替换方法;都给了我错误的答案。
递归树:不知道能不能申请,因为根是常数。

有人可以帮忙吗?

【问题讨论】:

  • 我投票结束这个问题,因为它是一个数学问题,而不是一个编程问题。

标签: algorithm math time-complexity recurrence


【解决方案1】:

使用Master Theorem来解决这种递归关系。

a 为大于或等于 1 的整数,b 为大于或等于 1 的实数 1. 令 c 为正实数, d 非负实数。鉴于表单的重复发生

  • T (n) = a T(n/b) + nc .. 如果 n > 1

  • T(n) = d .. 如果 n = 1

那么对于 n 的 b 次方,

  1. 如果 logb a c),
  2. 如果 logb a = c, T (n) = Θ(nc log n),
  3. 如果 logb a > c, T (n) = Θ(nlogb a)。

1) T(n) = 2T(n/2) + 0(1)

在这种情况下

a = b = 2;
日志b a = 1; c = 0(因为 nc =1 => c= 0)

所以情况(3)是适用的。所以T(n) = Θ(n) :)


2) T(n) = T(sqrt(n)) + 0(1)

设 m = log2 n;

=> T(2m) = T( 2m / 2 ) + 0(1)

现在重命名 K(m) = T(2m) => K(m) = K(m/2) + 0(1)

应用案例(2)。


【讨论】:

  • 即使 f(n) 是常数,我也可以应用 masters theorem,例如在这种情况下 0(1) 第二个问题呢?
  • @Ringo:是的,你可以。查看编辑。
  • 第 2 部分不正确。如果2^m = t,那么2^(m/2) 又是sqrt(t)。或者更确切地说,2^m = 2^log n = n,所以替换没有取得任何成果。
  • @casablanca:谢谢!!已更正。
  • 非常感谢。但是,在第二种情况下,您最终是如何选择 m=lg(n) 的?我的意思是如何猜测?
【解决方案2】:

让我们看看第一个递归,T(n) = 2T(n/2) + 1。n/2 是我们的线索:每个嵌套项的参数是其父项的一半。因此,如果我们从 n = 2^k 开始,那么在我们达到基本情况 T(0) 之前,我们将有 k 个项在我们的扩展中,每个项都加 1。因此,假设 T(0) = 1,我们可以说 T(2^k) = k + 1。现在,由于 n = 2^k,我们必须有 k = log_2(n)。因此 T(n) = log_2(n) + 1。

我们可以将相同的技巧应用于您的第二次重复,T(n) = T(n^0.5) + 1。如果我们从 n = 2^2^k 开始,我们将在展开式中有 k 个项,每个项相加总数为 1。假设 T(0) = 1,我们必须有 T(2^2^k) = k + 1。由于 n = 2^2^k,我们必须有 k = log_2(log_2(n)),因此 T(n) = log_2(log_2(n)) + 1.

【讨论】:

    【解决方案3】:

    对于第 1 部分,您可以按照 @Prasoon Saurav 的建议使用 Master Theorem。

    对于第 2 部分,只需扩展循环:

    T(n) = T(n ^ 1/2) + O(1)         // sqrt(n) = n ^ 1/2
         = T(n ^ 1/4) + O(1) + O(1)  // sqrt(sqrt(n)) = n ^ 1/4
         etc.
    

    该系列将继续使用k 条款直到n ^ 1/(2^k) <= 1,即2^k = log nk = log log n。这给了T(n) = k * O(1) = O(log log n)

    【讨论】:

    • 2^k = log n 是如何导致 k = log log n 的?
    • @casablanca,你能解释一下
    【解决方案4】:

    让我们看看第一个。首先,你需要知道 T(base case)。你提到它是一个常数,但是当你做这个问题时,把它写下来很重要。通常它类似于 T(1) = 1。我会使用它,但你可以推广到它是什么。

    接下来,找出你递归的次数(即递归树的高度)。 n 是您的问题大小,那么我们可以重复将 n 除以 2 多少次?从数学上讲,n/(2^i) = 1 时的我是什么?想清楚,以后再坚持。

    接下来,做一些替换,直到你开始注意到一个模式。

    T(n) = 2(2(2T(n/2*2*2) + θ(1)) + θ(1)) + θ(1)

    好的,模式是我们将 T() 多次乘以 2,然后将 n 除以 2 多次。多少次? i次。

    T(n) = (2^i)*T(n/(2^i)) + ...

    对于最后的大 θ 项,我们使用了一个可爱的技巧。看看上面我们有几个替换的地方,忽略 T() 部分。我们想要 θ 项的总和。请注意,它们加起来为(1 + 2 + 4 + ... + 2^i) * θ(1)。你能找到1 + 2 + 4 + ... + 2^i 的封闭表格吗?我给你那个;这是(2^i - 1)。只是记住是一个很好的,但是here's how you'd figure it out

    总之,我们得到了所有的东西

    T(n) = (2^i) * T(n/(2^i)) + (2^i - 1) * θ(1)

    如果您之前解决了i,那么您知道i = log_2(n)。插入它,做一些代数,然后你就可以开始了

    T(n) = n*T(1) + (n - 1)*θ(1)T(1) = 1。所以T(n) = n + (n - 1)*θ(1)。即 n 乘以一个常数,加上一个常数,再加上 n。我们去掉了低阶项和常数,所以它是 θ(n)。

    Prasoon Saurav 使用主方法是正确的,但重要的是您要知道递归关系在说什么。要问的是,我在每个步骤中做了多少工作,以及n 大小的输入的步骤数是多少?

    【讨论】:

      【解决方案5】:

      递归关系和递归函数也应该从 f(1) 开始求解。在情况 1 中,T(1) = 1; T(2) = 3; T(4) = 7; T(8) = 15;很明显,T(n) = 2 * n -1,在 O 表示法中是 O(n)。
      在第二种情况下 T(1) = 1; T(2) = 2; T(4) = 3; T(16) = 4; T(256) = 5; T(256 * 256) =6;很快就会发现 T(n) = log(log(n)) + 1 其中 log 以 2 为底。显然这是 O(log(log(n)) 关系。

      【讨论】:

        【解决方案6】:

        大多数时候处理递归的最好方法是绘制递归树并小心处理基本情况。

        不过这里我给你一点提示,用替换法解决。

        在循环中首先尝试替换n = 2^k 在重复第二次尝试替换n = 2^2^k

        【讨论】:

          猜你喜欢
          • 2022-06-10
          • 2019-04-15
          • 1970-01-01
          • 2020-06-15
          • 2012-11-21
          • 1970-01-01
          • 2018-04-24
          • 2022-06-14
          • 2013-05-17
          相关资源
          最近更新 更多