我更喜欢尽可能少的正式定义和简单的数学。
当前回答
告诉你从亚马逊订购哈利·波特:完整的8电影收藏(Blu-ray)并同时在线下载相同的电影收藏。你想测试哪种方法更快。
从实验中,我们知道在线购物的规模比在线下载更好,很重要的是要了解大O评级,因为它有助于分析算法的规模性和效率。
注意: 大 O 评级是算法最糟糕的场景,假设 O(1) 和 O(n) 是上面的例子最糟糕的场景。
参考: http://carlcheo.com/compsci
其他回答
这是一个非常简单的解释,但我希望它涵盖了最重要的细节。
让我们说你的算法处理问题取决于某些“因素”,例如,让我们做它N和X。
根据 N 和 X,您的算法将需要一些操作,例如在 WORST 案例中,它是 3(N^2) + log(X) 操作。
由于Big-O不太关心恒定的因素(aka 3),你的算法的Big-O是O(N^2 + log(X))。它基本上翻译“你的算法需要最糟糕的案例规模的操作数量”。
大 O 描述了一个功能的增长行为上限,例如一个程序的运行时间,当输入变得大。
例子:
O(n):如果我翻倍输入大小,运行时间将翻倍O(n2):如果输入大小将翻倍运行时间四倍O(log n):如果输入大小翻倍运行时间将增加一倍O(2n):如果输入大小增加一倍,运行时间将翻倍
输入尺寸通常是比特所需的空间来代表输入。
大 O 描述一类功能。
它描述了大输入值的快速功能的增长方式。
对于一个特定的函数f,O(f)分解了所有函数g(n),您可以找到一个n0和一个恒定的c,以便与n>=n0的g(n)的所有值都低于或相当于c*f(n)。
在较少的数学词语中,O(f)是一组函数,即所有函数,从某些值 n0 向前,增长缓慢或像 f 一样快。
如果 f(n) = n 那么
g(n) = 3n 是 O(f) 。 因为恒定的因素不重要 h(n) = n+1000 是 O(f) 因为它可能比所有值小于 1000 但对于大 O 只有大输入物质。
然而,i(n) = n^2不在O(f)中,因为一个四方函数比一个线性函数增长得更快。
O(n2):被称为四方复杂性
1 件: 1 件 10 件: 100 件 100 件: 10,000 件
请注意,物品的数量增加了10个因素,但时间增加了102个因素。
O(n):被称为线性复杂性
1 件: 1 操作 10 件: 10 操作 100 件: 100 操作
这一次,元素的数量增加了10个因素,所以时间n=10,所以O(n)的规模因素是10。
O(1):被称为恒久复杂性
1 件: 1 操作 10 件: 2 操作 100 件: 3 操作 1000 件: 4 操作 10,000 件: 5 操作
他们降低了数学,所以它可能不是准确的n2或他们说它是什么,但这将是规模的支配因素。
TLDR:Big O在数学术语中解释算法的性能。
较慢的算法倾向于在 n 运行到 x 或多个,取决于它的深度,而更快的,如二进制搜索运行在 O(log n),这使得它运行更快,因为数据集变得更大。
可以从算法中最复杂的线路计算大O看。
有了小型或未分类的数据集,Big O 可能令人惊讶,因为 n log n 复杂性算法如二进制搜索可以缓慢较小的或未分类的集,为一个简单的运行例子线性搜索与二进制搜索,请参见我的JavaScript例子:
https://codepen.io/serdarsenay/pen/XELWqN?editors=1011(下面的算法)
function lineerSearch() {
init();
var t = timer('lineerSearch benchmark');
var input = this.event.target.value;
for(var i = 0;i<unsortedhaystack.length - 1;i++) {
if (unsortedhaystack[i] === input) {
document.getElementById('result').innerHTML = 'result is... "' + unsortedhaystack[i] + '", on index: ' + i + ' of the unsorted array. Found' + ' within ' + i + ' iterations';
console.log(document.getElementById('result').innerHTML);
t.stop();
return unsortedhaystack[i];
}
}
}
function binarySearch () {
init();
sortHaystack();
var t = timer('binarySearch benchmark');
var firstIndex = 0;
var lastIndex = haystack.length-1;
var input = this.event.target.value;
//currently point in the half of the array
var currentIndex = (haystack.length-1)/2 | 0;
var iterations = 0;
while (firstIndex <= lastIndex) {
currentIndex = (firstIndex + lastIndex)/2 | 0;
iterations++;
if (haystack[currentIndex] < input) {
firstIndex = currentIndex + 1;
//console.log(currentIndex + " added, fI:"+firstIndex+", lI: "+lastIndex);
} else if (haystack[currentIndex] > input) {
lastIndex = currentIndex - 1;
//console.log(currentIndex + " substracted, fI:"+firstIndex+", lI: "+lastIndex);
} else {
document.getElementById('result').innerHTML = 'result is... "' + haystack[currentIndex] + '", on index: ' + currentIndex + ' of the sorted array. Found' + ' within ' + iterations + ' iterations';
console.log(document.getElementById('result').innerHTML);
t.stop();
return true;
}
}
}