找出每个功能的大O运行时间:
T(n) = T(n - 2) + n²
n²
,n³
T(n) = 3T(n/2) + n
O(n log n)
,O(nlog₂3)
T(n) = 2T(n/3) + n
O(n log base 3 of n)
,O(n)
T(n) = 2T(n/2) + n^3
O(n³ log₂n)
,O(n³)
因此,我们无法为每个问题确定正确的答案。
我们都得到了不同的结果,并希望得到关于运行时间的外部意见。
提前致谢。
答案 0 :(得分:1)
稍微澄清:
问题中的功能似乎是 运行时功能 ,正如其T()
名称及其n
参数所暗示的那样。一个更微妙的提示是它们都是递归的,并且当一个人产生一个描述算法运行时间的函数时(即使算法本身没有正式使用递归),递归函数也很常见。实际上,递归公式是一种相当不方便的形式,这就是为什么我们使用 Big O表示法 来更好地总结算法的行为。
运行时间函数是参数化的数学表达式,其允许在给定参数的特定值的情况下计算算法的运行时间的[有时近似]相对值。与此处的情况一样,运行时函数通常具有单个参数,通常名为n
,并且对应于算法预期在其上工作的项的总数(例如,对于例如使用搜索算法,它可以是数据库中的记录总数,使用排序算法,它可以是未排序列表中的条目数,对于路径查找算法,可以是图中的节点数....) 。在某些情况下,运行时函数可能有多个参数,例如,在图上执行某些变换的算法的性能可能会绑定到节点的总数和顶点的总数或者两个节点之间的平均连接数等。
手头的任务(因为看起来像是家庭作业,因此我的部分答案),因此找到一个Big O表达式来限定每个运行时间的上限函数,它们可能对应的基础算法。任务是不找到并验证算法以产生函数的结果(第二种可能性也是CS cursus的算法类中非常常见的练习类型,但显然不是什么这里需要。)
因此,问题更多的是数学而不是计算机科学本身。
基本上,当n接近无穷大时,需要找到每个函数的极限(或其近似值)。
伊利诺伊大学厄巴纳香槟分校的note from Prof. Jeff Erikson为解决复发提供了很好的介绍。
虽然有一些解决复发的快捷方式,特别是如果一个人掌握了微积分,一般的方法是猜测答案,然后通过归纳证明它。像Excel这样的工具,Python或MATLAB或Sage等编程语言中的一些片段可用于生成前几百个值(或更高)的表以及n ^ 2,n ^等值。 3,n!以及功能条款的比率;这些表通常提供足够的洞察功能,以找到函数的封闭形式。
关于问题中列出的答案的一些提示:
功能a)
O(n^2)
肯定是错的:
快速检查序列中的前几个值表明n ^ 2越来越小于T(n)
另一方面,O(n^3)
似乎系统性地大于T(n)
,因为n朝着大数字增长。仔细观察可以看出O(n^3)
实际上是此函数的Big O表示法的 order ,但O(n^3 / 6)
是一个更精确的符号,它系统地超过了T的值( n)[对于较大的n值,和/或n趋于无穷大],但与较粗略的n^3
估计值相比,只有一小部分。
人们可以通过归纳确认O(n^3 / 6)
是这样的:
T(n) = T(n-2) + n^2 // (1) by definition
T(n) = n^3 / 6 // (2) our "guess"
T(n) = ((n - 2)^3 / 6) + n^2 // by substitution of T(n-2) by the (2) expression
= (n^3 - 2n^2 -4n^2 -8n + 4n - 8) / 6 + 6n^2 / 6
= (n^3 - 4n -8) / 6
= n^3/6 - 2n/3 - 4/3
~= n^3/6 // as n grows towards infinity, the 2n/3 and 4/3 factors
// become relatively insignificant, leaving us with the
// (n^3 / 6) limit expression, QED