algorithm - 自顶向下动态规划算法的运行时间
问题描述
我为一项任务提出了以下算法。主要是第 23-24 行中的 for 循环让我不确定。
function TOP-DOWN-N(C, n, p)
let N[1...n, 1...C] be a new array initialized to -1 for all indicies
return N(C, n)
function N(C, n)
if N[C,n] >= 0 then
return N[C,n]
if C < 0 or n < 1 then
return 0
elif C = 0 then
return 1
elif C > 0 and i > 0 then
r = 0
for i = 0 to n do
r += N(C-p[n-i], n-(i+1))
N[C,n] = r
return N
解决方案
让我们忽略这个算法是递归实现的事实。一般来说,如果动态规划算法正在构建一个包含 N 个结果的数组,并且计算每个结果需要使用来自该数组的 k 个其他结果的值,则其时间复杂度为 Ω(Nk),其中 Ω 表示下限。这应该很清楚:使用 k 值来计算结果需要 Ω(k) 时间,并且您必须这样做 N 次。
另一方面,如果计算不做任何渐近比从数组中读取 k 值更耗时的事情,那么 O(Nk) 也是一个上限,因此时间复杂度为 Θ(Nk)。
所以,按照这个逻辑,我们应该期望你的算法的时间复杂度是 Θ(n 2 C),因为它构建了一个大小为 nC 的数组,计算每个结果使用来自该数组的 Θ(n) 其他结果,并且计算是不被别的东西支配。
但是,您的算法比迭代实现具有优势,因为它不必计算数组中的每个结果。例如,如果数字 1 不在数组中,p
那么您的算法将不会计算N(C-1, n')
任何n'
; 如果 in 中的数字p
都大于或等于 C,则循环只执行一次,运行时间主要取决于必须初始化大小为 nC 的数组。
由此可知 Θ(n 2 C) 是最坏情况下的时间复杂度,最好情况下的时间复杂度是 Θ(nC)。
推荐阅读
- asp.net-core - 有没有 Html.GetEnumSelectList 的功能
() 那将选项的值设置为 Enum 的值? - android - 自动开启设备
- html - 从 base64 字符串设置 src 时的 net::ERR_INVALID_URL
- angular - 如何检测客户端是否仍连接到客户端的 SignalR
- testing - Spectron:启动应用程序后无法与电子应用程序上的元素交互
- android - 用户的谷歌密码是否存储在 Android 帐户管理器中?
- null - 如何将 Redux Saga 与 AWS Amplify 结合使用?
- php - 如何使用来自另一个域的 pem 文件签署请求?
- javascript - 带 64 行换行符的证书格式
- android - 可以在 android 的字符串资源中包含字符串资源 id