【问题标题】:Algorithmic analysis / comparing run-times of functions with different growth rates算法分析/比较具有不同增长率的函数的运行时间
【发布时间】:2013-10-05 06:43:17
【问题描述】:

我有一个作业问题:

如果输入大小为 100 的算法需要 0.5 毫秒,如果是 500、1,000 和 10,000 的输入需要多长时间:

  1. 线性,
  2. O(N log N),
  3. 二次方,
  4. 立方,
  5. 指数。

我了解这里的基本概念,但我不确定如何从数学上解决这个问题。我很想简单地计算处理每个输入项所需的时间(例如,在 a 中)我将 0.5 除以 100 得到 0.05,然后乘以 500、1000和 1000 找出处理这些大小的输入需要多长时间。

虽然这对于线性计算很简单,对于二次和三次计算也很简单,但我不太明白如何将此策略应用于 (N log N) 或指数函数:我使用什么值作为指数的底?

对于(N log N),是不是像计算c = 100 * log(100) = 200一样简单;然后计算 c = 500 * log(500) = 1349,即 6.745 乘以 200,然后将 6.745 乘以 0.5 得到 3.3725 作为最终答案?

【问题讨论】:

  • 在这些概念中,除非另有说明,否则 Log 的基数为 2,您所做的计算是正确的方法,但基数错误。
  • @Joni 我说不是吗?
  • 哎呀,错字了。我的意思是:基础确实重要,@RonTeller。以 10 为底,以 2 为底,结果相同。

标签: algorithm math big-o time-complexity


【解决方案1】:

这是一个糟糕的练习:

  • 它教您从单个数据点进行推断。
  • 它教您将渐近分析的结果应用到无法应用的地方。

为了扩展后者,由于隐藏项,您无法根据渐近界给定特定输入来预测系统的性能。许多算法都有隐藏的常数和线性项,这些项在 n=100 等小输入大小的运行时间中占主导地位。

但如果你应该忽略这些事实,你的方法是正确的。

【讨论】:

  • 虽然正确,但如果您(并非完全不合理)猜测 n = 100 大到足以出现主导增长项,您可以做出有根据的猜测。
  • 我见过的大多数 CS 作业问题都是毫无意义的。仍然需要做它们以获得一张有意义的纸进入现实世界,看看它们都是多么的无意义。
  • @templatetypedef:如果(例如 CPU)缓存问题 100 实际上可能由常数项支配。
  • @WilliamGaul,我的意思是给定的信息不足以解决问题,不是不值得花时间和精力去尝试。一般来说,这是一个糟糕的练习题:它告诉您可以从单个数据点进行推断,并告诉您将渐近分析的结果应用到无法应用的地方。
  • @Joni Ah...在那种情况下,非常正确。
【解决方案2】:

假设函数的运行时间由 T(n) 给出。您可以通过执行以下操作来解决这些问题:

  1. 根据函数的增长率写出 T(n) 的一般表达式,假设存在一些隐藏的常数乘数。例如,对于 n log n 的情况,对于某个常数 c,写为 T(n) = c n log n。

  2. 使用您拥有的一个数据点求解 c; T(100) 给你。

  3. 根据需要插入 n 值以估计运行时间。

这适用于任何增长率。​​p>

快速说明:“指数”不够精确,无法做出有意义的估计。 2^n 和 100^n 都是指数的,但后者的增长速度明显快于前者。在计算机科学中,通常日志使用以 2 为底,但没有关于指数的通用约定。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多