0

求每个函数的大 O 运行时间:

  1. T(n) = T(n - 2) + n²
    我们的答案:,
  2. T(n) = 3T(n/2) + n
    我们的答案:O(n log n),O(nlog₂3)
  3. T(n) = 2T(n/3) + n
    我们的答案:O(n log base 3 of n),O(n)
  4. T(n) = 2T(n/2) + n^3
    我们的答案:O(n³ log₂n),O(n³)

所以我们很难为每个问题确定正确的答案。

我们都得到了不同的结果,并希望外界对运行时间有什么看法。

提前致谢。

4

1 回答 1

1

澄清一下
问题中的函数似乎是运行时函数T(),正如它们的名称和n参数所暗示的那样。一个更微妙的提示是,它们都是递归的,而递归函数在生成一个描述算法运行时间的函数时很常见(即使算法本身没有正式使用递归)。事实上,递归公式是一种相当不方便的形式,这就是为什么我们使用大 O 表示法来更好地总结算法的行为。

运行时间函数是一个参数化的数学表达式,它允许在给定参数的特定值的情况下计算算法运行时间的[有时是近似的]相对值。就像这里的情况一样,运行时间函数通常有一个参数,通常命名为,并且对应于项目n的总数该算法预计可以使用/使用(例如,对于搜索算法,它可能是数据库中的记录总数,对于排序算法,它可能是未排序列表中的条目数,对于路径查找算法,图中的节点数......)。在某些情况下,运行时间函数可能有多个参数,例如,在图上执行某些变换的算法的性能可能与节点总数顶点总数或两个节点之间的平均连接数有关节点等

因此,手头的任务(对于似乎是家庭作业,因此我的部分答案)是找到一个Big O表达式,该表达式限定每个运行时间函数的上限,无论它们可能对应于什么底层算法。任务不是查找和限定算法以产生函数结果(第二种可能性也是 CS 课程算法类中非常常见的练习类型,但显然不是这里需要的。)

问题是因此更多的是数学而不是计算机科学本身。
基本上,当 n 接近无穷大时,需要找到每个函数的极限(或其近似值)。
这个来自伊利诺伊大学厄巴纳香槟分校的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)实际上是该函数的大 O 表示法的顺序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
于 2012-10-15T08:16:21.770 回答