【问题标题】:Recurrence relations in computer science mathematics T(n) = 6T(n/6) + 2n + 3 for n a power of 6 T(1) = 1?计算机科学数学中的递归关系 T(n) = 6T(n/6) + 2n + 3 对于 n 的 6 次幂 T(1) = 1?
【发布时间】:2020-04-07 21:16:35
【问题描述】:

递归关系可以直接从递归算法推导出来,但是 它们的形式不允许我们快速确定效率如何 算法是。

请问我该如何解决这个问题

T(n) = 6T(n/6) + 2n + 3 对于 n 的 6 次幂 T(1) = 1 解?

【问题讨论】:

标签: math recurrence


【解决方案1】:

可以使用 Python 的符号数学库 SymPy 中的 rsolve 解决这种重复。

from sympy import Function, rsolve
from sympy.abc import k, n

f = Function('f')
g = Function('g')

# T(n) = 6T(n/6) + 2n + 3 for n a power of 6     T(1) = 1
T = f(n) - 6*f(n/6) - 2*n - 3
Tk = T.subs({n: 6**k, f(n): g(k), f(n/6):g(k-1)})

s = rsolve(Tk, g(k), {g(0): 1})
print ("solution for k:", s.cancel())

for k in range(0,11):
    print(f"k={k}, n={6**k}, T(n)={2*6**k*k + (8*6**k - 3)//5}")

这给出了:

  • Tk(k) = 2*6**k*k + 8*6**k/5 - 3/5 或 Tk(k) = ((10k+8)6k - 3)/5
  • T(n) = 2*n*log(n)/log(6) + 8*n/5 - 3/5 或 T(n) = ((n(10log6(n)+8) - 3)/5

前 11 个值:

k=0, n=1, T(n)=1
k=1, n=6, T(n)=21
k=2, n=36, T(n)=201
k=3, n=216, T(n)=1641
k=4, n=1296, T(n)=12441
k=5, n=7776, T(n)=90201
k=6, n=46656, T(n)=634521
k=7, n=279936, T(n)=4367001
k=8, n=1679616, T(n)=29561241
k=9, n=10077696, T(n)=197522841
k=10, n=60466176, T(n)=1306069401

我们可以通过递归公式检查公式:

def recursive_t(n):
    if n == 1:
        res =  1
    else:
        t_ndiv6 = recursive_t(n//6)
        res = 6 * t_ndiv6 + 2 * n + 3
    print(f"T({n})={res}")
    return res

recursive_t(6**10)

这会为相同的n 打印出相同的值。

【讨论】:

  • Nit:T(k) 和 T(n) 的含义不同,这有点令人困惑。通常,只要 k = n,您就会要求 T(k) = T(n)。
  • 我现在介绍 Tk 以帮助澄清差异。
  • 我认为这行不通。 n 应该是 6 的幂,但您正在评估 6 次幂,这不是一回事。您为T(n) 提供的公式也不起作用:从文档看来,rsolve 似乎只适用于特定形式的重复,不包括这种重复形式。
  • 正确的解决方案似乎是T(6**k) = (2*k+1)*6**k + 3*(6**k-1)//5
  • 道歉:在重新阅读时,rsolve 确实 可以解决此问题,但要获得正确的解决方案,您需要使用 {g(0): 1} 作为初始条件而不是 @ 987654336@.
猜你喜欢
  • 1970-01-01
  • 2014-05-02
  • 2015-08-29
  • 2019-04-15
  • 1970-01-01
  • 2022-06-17
  • 2017-12-22
  • 2013-06-19
  • 1970-01-01
相关资源
最近更新 更多