【问题标题】:Analysis of algorithms算法分析
【发布时间】:2011-10-29 17:55:29
【问题描述】:

我正在阅读算法分析主题。这是书中的文本sn-p

当 n 翻倍时,线性运算的运行时间增加 2 倍 程序,4 个用于二次程序,8 个用于三次程序。 以对数时间运行的程序只需要一个加法常数 当 n 翻倍时更长,并且以 O(n log n) 运行的程序需要 在相同情况下运行的时间略多于两倍。

如果低阶项具有 系数比较大,n不够大。

我的问题是作者的意思是低阶项具有相对较大的系数?谁能举例说明一下

谢谢!

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    假设您的算法在n 元素上运行时实际执行n^2 + 1000 n 计算。现在n = 1 需要 1001 次计算,n = 2 需要 2004 次。与线性增长的差异很小,几乎看不到二次贡献!

    然而,渐近地,您的算法需要 O(n^2) 步,因此渐近地(随着 n 变大)将输入大小加倍会使您的运行时间增加四倍。但是对于我们的小值,从 1 加倍到 2 并将运行时间加倍!低阶项为n,其系数(1000)相对于前阶项n^2(即1)的系数较大。

    这显示了渐近复杂度如何并没有说明特定的值,尤其是小的值。这只是对n 变大时行为的限制性声明。

    【讨论】:

    • 我想你的意思是:对于 n=2,你需要 2004 (n^2 + 1000 n)
    • @LiKao:谢谢,我做到了!正在修复...也许n^2 + 1000 会是一个更好的例子。
    【解决方案2】:

    使用 O 表示法时,您可以指定作为性能界限的函数的最大项。例如,如果性能始终受 f = c3n3 + c2n2 sup> + c1n + c0,你会说是 O(n3)。作者是说当n很小时,系数对性能的影响可能比n大,例如如果c2很大,c3很小,性能可能看起来是 O(n2),直到 n 的大小支配系数,如果你只考虑 n 的特定小实例的相对性能。

    【讨论】:

      【解决方案3】:

      渐近符号将运行时的边界称为 n->infinity。因此,O(n log n) 的函数的实际运行时间可能为 .1*n log n + 100000*n。

      在这种情况下,100000*n 项是“低阶项”。由于 n->infinity,该项被 .1*n log n 项压倒。

      但是,如您所见,对于较小的 n,100000*n 项将主导运行时。

      【讨论】:

        【解决方案4】:

        例如,如果您有一个较低比例的 O(n) 算法,您可能有 T(n) = 490239n +(在此处插入荒谬的常数),这意味着性能看起来很差,但随着比例的增加,您会看到增加总是线性的。

        现实世界的例子是归并排序,O(n logn) 问题是递归的计算成本或开销是 n 的一个因子,它比 nlogn 的阶数更小,因此它在 Big-O 中被丢弃,问题是该因素也变得相当大并影响性能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-28
          • 1970-01-01
          • 1970-01-01
          • 2013-09-23
          • 2012-05-24
          • 2011-07-28
          • 2010-12-20
          相关资源
          最近更新 更多