O(n ^ 2)与O(n)的算法

时间:2015-01-02 23:36:46

标签: c# c++ algorithm pseudocode

我是计算机科学的新手,刚开始使用伪代码,我有一些问题。这是我在学期的第三周,大多数是自学。我有一些问题:

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#算法中它看起来如何?

2 个答案:

答案 0 :(得分:5)

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

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循环中有第二个循环。由于在最坏的情况下迭代n * n个元素,因此这是O(n ^ 2)。

初始化空矩阵的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)运行时。

这是一张图表,显示方程式如何随时间增长:(以及它们的增长速度) Graph

答案 1 :(得分:2)

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

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

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