计算机科学数学中的递归关系 T(n) = 6T(n/6) + 2n + 3 对于 n 的 6 次方 T(1) = 1?
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 解 ?
可以使用 rsolve
from SymPy、Python 的符号数学库解决此重复问题。
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
打印出相同的值。
递归关系可以直接从递归算法中导出,但是 它们的形式不允许我们快速确定效率 算法是。
请问我该如何解决
T(n) = 6T(n/6) + 2n + 3 对于 n 的 6 次幂 T(1) = 1 解 ?
可以使用 rsolve
from SymPy、Python 的符号数学库解决此重复问题。
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)/5T(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
打印出相同的值。