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


当前回答

我最喜欢的英语词来描述这个概念是你为一个任务付出的代价,因为它越来越大。

既然这些常态在长期内并不重要,这种语言允许我们讨论超越我们正在运行的基础设施之外的任务,所以工厂可以到任何地方,工人可以到任何地方 - 它都是可怕的,但是工厂的大小和工人的数量是我们在长期内可以改变的事情,因为您的输入和输出增长。

由于时间和空间是经济量(即它们是有限的)在这里,它们都可以用这个语言表达。

技术笔记: 时间复杂性的一些例子 - O(n) 一般意味着如果一个问题是“n”的大小,我至少必须看到一切。 O(log n) 一般意味着我减半问题的大小,检查并重复,直到任务完成。

其他回答

Big-O 是由程序所消耗的资源增加率,即问题例大小。

资源:可能是CPU时间,可能是最大 RAM 空间。

说问题是“找到金额”,

int Sum(int*arr,int size){
      int sum=0;
      while(size-->0) 
         sum+=arr[size]; 

      return sum;
}

problem-instance= {5,10,15} ==> problem-instance-size = 3, iterations-in-loop= 3

problem-instance= {5,10,15,20,25} ==> problem-instance-size = 5 iterations-in-loop = 5

说问题是“找到组合”,

    void Combination(int*arr,int size)
    { int outer=size,inner=size;
      while(outer -->0) {
        inner=size;
        while(inner -->0)
          cout<<arr[outer]<<"-"<<arr[inner]<<endl;
      }
    }

problem-instance= {5,10,15} ==> problem-instance-size = 3, total-iterations = 3*3 = 9

problem-instance= {5,10,15,20,25} ==> problem-instance-size = 5, total-iterations= 5*5 = 25

对于“n”尺寸的输入,该程序以序列中的“n*n”节点的速度生长,因此,Big-O是N2以O(n2)表达。

从(源)可以读到:

大 O 评级根据其增长率定义函数:具有相同增长率的不同函数可以使用相同的 O 评级进行代表。

在计算机科学时间复杂性和空间复杂性理论中,人们可以认为大O评级是对时间和空间的某种最糟糕情况的算法的分类。

一个算法被称为采取线性时间/空间,或者O(n)时间/空间,如果其时间/空间复杂性是O(n)。

和 O(n log n) 如:

一个算法被称为在量子时间/空间中运行,如果T(n) = O(n log^k n)为某种积极的连续 k;线性时间/空间是 k = 1(来源)的情况。

此分類上一篇

它切断到骨头,只提供关于算法的规模性质的信息,具体如何使用资源(思考时间或记忆)的算法规模,以回应“输入大小”。

考虑蒸汽发动机和火箭之间的差异. 它们不仅仅是相同的东西的不同品种(如说,一个Prius发动机与一个Lamborghini发动机),但它们是显著不同的类型的驱动系统,在它们的核心。

大 O 评级是描述算法将运行多快的方式,因为有意数量的输入参数,我们将称之为“n”。在计算机科学中是有用的,因为不同的机器以不同的速度运行,简单地说算法需要 5 秒,不会告诉你很多,因为虽然你可能运行一个系统与 4.5 GHz 八核处理器,我可能运行一个系统。

大 O 评分最常被编程者用作计算(算法)将需要多长时间完成的约定测量,表达为输入组的尺寸的函数。

在许多情况下,一个算法的“O”将落入下列情况之一:

O(1) - 完成时间是相同的,无论输入组的尺寸. 一个例子是通过指数访问一个序列元素. O(Log N) - 完成时间增加大约与 log2(n)相匹配。 例如, 1024 个元素需要大约两倍的长度为 32 个元素,因为 Log2(1024) = 10 和 Log2(32) = 5. 一个例子是找到一个元素在二进制搜索树(BST)。

大 O 忽略了没有有意义的因素,因为输入尺寸向无限增加,而函数的增长曲线,这意味着由函数添加或加倍的恒数只是被忽略。