在计算机科学中,动态编程表示任何算法的构建,当相同的子问题在此递归扩展中多次出现时,将其递归地拆分为子问题。一个简单的书籍示例,可以使用动态规划计算斐波那契数:
从通用递归 F(n) = F(n-1) + F(n-2) 您可以实现以下算法:
int fibonacci(n):
if (n < 2): return 1
else: return fibonacci(n-1) + fibonacci(n-2)
现在这当然根本没有效率,因为它创建了大量的递归调用,例如
F(8) = F(7) + F(6) = [F(6) + F(5)] + [F(5) + F(4)] = ...
所以在这里我们已经看到 fibonacci(5) 被实现计算了两次。动态编程范式现在是“记忆”或“缓存”结果,如下所示:
integer_map store;
int memofibo(n):
if (n < 2) : return 1
else if (store.find_key(n)): return store.find_value(n)
else:
int f = memofibo(n-1) + memofibo(n-2)
store.set(n, f)
return f
此实现确保对于 n 的每个参数值最多执行一次递归步骤,因此它在 O(n log n) 时间内计算第 n 个斐波那契数(假设标准 O(log n))实现关联数组 'store '。
所以从计算机科学的角度来看,您提供的链接是相同思想的运筹学/优化问题版本(将问题划分为子问题),但该思想在实践中已抽象为通用计算机领域中的这种递归+记忆模式科学。我希望这有助于清除一些乌云。