在哪里可以找到O(n ^ 2)和O(n)等的含义?

时间:2010-08-23 13:15:33

标签: algorithm language-agnostic programming-languages

我一直在注意使用这些术语的堆栈溢出的答案,但我不知道它们是什么意思。他们叫什么,有一个很好的资源,可以用简单的术语解释它们吗?

4 个答案:

答案 0 :(得分:14)

这种表示法称为Big O notation,用作表达算法复杂性的简写(基本上随着输入大小(n)的增长,给定的算法运行需要多长时间)

一般来说,您将遇到以下主要类型的算法:

  1. O(1) - 常量 - 此算法完成所需的时间长度不依赖于算法必须处理的项目数。
  2. O(log n) - 对数 - 此算法完成所需的时间长度取决于算法必须处理的项目数。随着输入大小变大,每个新输入所需的时间就越少。
  3. O(n) - 线性 - 此算法完成所需的时间长度直接取决于算法必须处理的项目数。随着输入大小的增加,所需的时间也会增长。
  4. O(n ^ 2) - 多项式 - 随着输入大小的增加,处理输入所需的时间会越来越大 - 这意味着大的输入大小变得非常难以解决
  5. O(2 ^ n) - 指数 - 最复杂的问题类型。处理时间会根据输入的大小而极端增加。
  6. 通常,您可以通过查看算法的使用方式来粗略地衡量算法的复杂程度。例如,查看以下方法:

    function sum(int[] x) {
        int sum = 0;
        for (int i = 0; i < x.length; i++) {
            sum += x[i];
        } 
        return sum;
    }
    

    这里有一些事情需要做:

    • 初始化名为sum
    • 的变量
    • 初始化名为i
    • 的变量
    • 对于i的每次迭代:将x [i]添加到sum,将i加1,检查i是否小于x.length
    • 退还金额

    有一些操作在这里持续运行(前两个和最后一个),因为x的大小不会影响它们运行的​​时间。同样,有些操作以线性时间运行(因为它们对x中的每个条目运行一次)。使用Big O表示法,算法被简化为最复杂的,因此这个和算法将在 O(n)

    中运行

答案 1 :(得分:4)

首先阅读Computational Complexity,然后尝试一些有关Introduction to Algorithms等算法的书籍。

来自维基百科页面:

  

Big O符号根据其增长率来表征功能

如果您不想深入细节,通常可以通过分析代码来近似算法的复杂性:

void simpleFunction(arg); // O(1) - if number of function instructions is constant and don't depend on number of input size

for (int i=0;i<n;i++) {simpleFunction(element[i]);} // O(n)

for (int i=0;i<n;i++) { // this one runs O(n^2)
    for (int j=0;j<n;j++) {
        simpleFunction(element[i]);
    }
}

for (int i=0;i<n;i*=2) {  // O(lgn)
    simpleFunction(element[i]);
}

有时候估算函数/算法并不是那么简单,在这种情况下使用{O}符号复杂度amortized analysis。上面的代码应该只作为快速启动。

答案 2 :(得分:0)

这称为Big O notation,用于量化算法的复杂性。

O(1)表示无论处理多少数据,算法都需要一个恒定的时间。

O(n)表示算法速度随着数据量的增长呈线性增长。

依旧......

因此,O符号中n的幂越低,算法解决问题的效果越好。最好的情况是O(1)(n = 0)。但是在许多问题中存在固有的复杂性,因此几乎在所有情况下都找不到这样一种理想的算法。

答案 3 :(得分:0)

到目前为止,答案很好。网络搜索的主要术语是“Big O notation”。

“someformula is O(someterm)”数学背后的基本思想是,当你的变量变为无穷大时,“someterm”是支配的公式的一部分。

例如,假设您有0.05*x^3 + 300*x^2 + 200000000*x + 10。对于非常小的x(x == 1或x == 2),200000000*x到目前为止是最大的部分。此时,公式的图表看起来是线性的。随着你的进展,300*x^2部分会更大。但是,如果你继续使x更大,你想要的那么大,0.05*x^3部分将是最大的,并且最终将完全超出公式的其他部分。通过图表可以清楚地看到您正在查看立​​方体函数。所以我们会说公式是O(x^3)