我一直在注意使用这些术语的堆栈溢出的答案,但我不知道它们是什么意思。他们叫什么,有一个很好的资源,可以用简单的术语解释它们吗?
答案 0 :(得分:14)
这种表示法称为Big O notation,用作表达算法复杂性的简写(基本上随着输入大小(n)的增长,给定的算法运行需要多长时间)
一般来说,您将遇到以下主要类型的算法:
通常,您可以通过查看算法的使用方式来粗略地衡量算法的复杂程度。例如,查看以下方法:
function sum(int[] x) {
int sum = 0;
for (int i = 0; i < x.length; i++) {
sum += x[i];
}
return sum;
}
这里有一些事情需要做:
有一些操作在这里持续运行(前两个和最后一个),因为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)
。