【问题标题】:Algorithms in O(n^2) vs O(n) [duplicate]O(n ^ 2)与O(n)中的算法[重复]
【发布时间】:2015-01-02 23:36:46
【问题描述】:

我是计算机科学的新手,刚开始使用伪代码,我有一些问题。这是我这个学期的第三周,大部分时间都是自学。我有一些问题:

O(n^2) 算法与 O(n) 算法有什么区别? - 同样,什么是 O(n log n)? - 和 Ω(n^2)?

到目前为止,我已经写了:

horner = 0;
for( i = n; i >= 0; i −− )
    horner = x * horner + a[i];

但发现它是 O(n)。如何转换它?

什么是运行时间? - 我知道第一行的分配是 1 次操作

它在实际的(比如 C#)算法中看起来如何?

【问题讨论】:

  • 这几乎完全是 C# 语法,但我有点困惑。 x * horner 不是每次都为 0 吗?我可能完全误解了伪代码
  • @BenKnoble:那是一个错字。 Horner's method 每次迭代都会更新一个“结果”变量,所以第一次它只是零。
  • @BenKnoble 伪代码可以类似于真实代码。此外,“+a[i]”将在第一次迭代后删除 0
  • 好的,谢谢。我没有意识到问题

标签: c# c++ algorithm pseudocode


【解决方案1】:

您要问的是计算机科学中的一个主题,称为算法复杂性分析。在您的程序中编写算法或解决方案时,这是一个非常重要的主题,因为它与运行时间或计算的运行速度有关。

Big-Oh 或 O(n) 与算法运行的上限运行时间有关。在这种情况下,O(n) 意味着对于 n 元素,需要考虑所有 n 元素以完成算法计算,或者是线性的。这种 Big-Oh 复杂性的范围是从恒定时间 O(1) 到 O(n^n) 的非常大且非常慢的计算。另外,请考虑以下等式:

y=10n+1
y=5n+10

这两个都是 O(n) 复杂度,因为随着元素数量的增加,方程也因此而变得越来越大。我们忽略了常数,因为方程会因为变量而变得更大和更快,而不是因为永远不会改变的常数值。 而等式如下:

y=10n^2+5n+5 

复杂性将是 O(n^2),因为 10n^2 是导致方程增长更快的最大增长元素。我们删除常数并考虑方程中最大的增长分量来评估复杂性。

对于 Big-Omega 复杂度,我们认为这是算法复杂度分析的下限。例如,一个算法可以像 Omega(n) 一样快(最佳情况),但只要 O(n^2)(最坏情况),这在排序算法或搜索算法的分析中很常见。

在某些情况下,出于优化原因,我们希望使用高效且更快的算法编写程序,尤其是当我们想要更快的程序以获得更快的解决方案或更快的运行时间时。

您提供的代码示例是 O(n),因为它使用 for 循环来迭代 n 个元素。考虑一个双 for 循环,在当前的 for 循环中有第二个循环。这是 O(n^2) 由于在最坏的情况下迭代 n*n 个元素。

用于 O(n^2) 运行时初始化空矩阵的 Java 伪代码:

int result[n][m];
for(int i=0; i<n; ++i){
    for(int j=0; j<m; ++j){
       result[i][j] = 0;
    }
}

注意,它使用两个循环,因此会产生 O(n^2) 的运行时间。

下面的图表显示了方程如何随时间增长:(以及它们的增长速度)

【讨论】:

  • O/Θ/Ω 与最佳/平均/最坏情况无关。完全不同的概念。
  • 你说得对,我进行了编辑以将最佳/平均/最坏情况的用法交换为上限和下限。对这种混乱感到抱歉。
【解决方案2】:

O(n) 表示算法需要最多(最坏情况)的迭代、计算或步数它的结束状态,n 是算法开始时给出的对象。

假设您有一个包含 5 个元素的数组,以及一个复杂度为 O(n^2) 的排序算法。您知道,如果对数组应用排序,它最多需要 5^2=25 步才能达到其最终状态。

另请阅读:What is the difference between O, Ω, and Θ?

【讨论】:

  • 我在写作时犯了很多错误和编辑,我认为我的评论写作也需要 O(n^3) 符号。
  • "它最多需要 5^2=25 步才能达到其最终状态" 不。它可能需要 3n^2、10n^2、1000000n^2 或 n^2+10 ^100 步,仍然是 O(n^2)。
  • @T.C.好点子。即使n + log n + n log n + n^2 也算作 O(n^2)。
  • 大 O 表示法是关于增长的顺序。如果您使用 10 个元素运行该算法,则需要一些时间。当数量翻倍时,需要多长时间?双倍时间意味着它是 O(n),四倍时间意味着它是 O(n^2)。您可以查看“主定理”以获取有关如何从时间度量导出大 O 表示法的更多信息。
  • @Ray 是的,但这是关于增长的渐近顺序 - 所以如果你加倍 10,它可能会超过四倍的时间,但随着原始数量越来越大,这个比率接近 4 .
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2019-12-13
  • 2015-05-25
  • 1970-01-01
相关资源
最近更新 更多