我更喜欢尽可能少的正式定义和简单的数学。


当前回答

这是一个非常简单的解释,但我希望它涵盖了最重要的细节。

让我们说你的算法处理问题取决于某些“因素”,例如,让我们做它N和X。

根据 N 和 X,您的算法将需要一些操作,例如在 WORST 案例中,它是 3(N^2) + log(X) 操作。

由于Big-O不太关心恒定的因素(aka 3),你的算法的Big-O是O(N^2 + log(X))。它基本上翻译“你的算法需要最糟糕的案例规模的操作数量”。

其他回答

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或他们说它是什么,但这将是规模的支配因素。

上述说法是一个很好的开始,但不是完全真实的。

更准确的解释(数学)

n = 输入参数数

T(n) = 表达算法运行时间的实际函数为 n 的函数

c = 常态

f(n)= 表达算法运行时间为 n 的函数的约定函数

接下来,在大O方面,接近f(n)被认为足够好,只要下面的条件是真实的。

lim     T(n) ≤ c×f(n)
n→∞

方程式是如 n 接近无限, T 的 n 是少于或等于 c 次 f 的 n。

T(n)∈O(n)

回到英语

基于上面的数学定义,如果你说你的算法是一个大O的n,这意味着它是一个函数的n(输入参数的数量)或更快。

Big O of n 意味着我的算法运行至少如此之快. 你不能看你的算法的 Big O 评分,并说它很慢. 你只能说它很快。

这是一个非常简单的解释,但我希望它涵盖了最重要的细节。

让我们说你的算法处理问题取决于某些“因素”,例如,让我们做它N和X。

根据 N 和 X,您的算法将需要一些操作,例如在 WORST 案例中,它是 3(N^2) + log(X) 操作。

由于Big-O不太关心恒定的因素(aka 3),你的算法的Big-O是O(N^2 + log(X))。它基本上翻译“你的算法需要最糟糕的案例规模的操作数量”。

如果我想向6岁的孩子解释这一点,我会开始绘制一些函数f(x) = x 和f(x) = x^2 例如,并问一个孩子哪个函数将是页面顶部的顶部函数。

statement;

是持久的. 声明的运行时间不会与 N 相比变化

for ( i = 0; i < N; i++ )
  statement;

for ( i = 0; i < N; i++ ) 
{
for ( j = 0; j < N; j++ )
  statement;
}

是四角形的,两条路的运行时间相当于N的平面,当N翻倍时,运行时间增加为N * N。

while ( low <= high ) 
{
 mid = ( low + high ) / 2;
 if ( target < list[mid] )
 high = mid - 1;
 else if ( target > list[mid] )
  low = mid + 1;
else break;
}

算法的运行时间是相当于 N 可以分为 2 次的次数。

void quicksort ( int list[], int left, int right )
{
  int pivot = partition ( list, left, right );
  quicksort ( list, left, pivot - 1 );
  quicksort ( list, pivot + 1, right );
}

是 N * log ( N ). 运行时间由 N 轮子(以色列或重复)组成,它们是 logarithmic,因此算法是线性和 logarithmic 的组合。

一般来说,做某些东西与每个项目在一个维度是线性的,做某些东西与每个项目在两个维度是四方的,并将工作区域分成一半是逻辑的。 还有其他大 O 测量,如圆形,曝光,和平方根,但它们不被报告为常见。 大 O 评分被描述为 O( )在哪里是测量。

查看更多: 这里