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


当前回答

仅仅是以快速而简单的方式表达一个算法的复杂性。 大 O 评分存在,以解释任何算法的最佳、最糟糕和平均案例时间复杂性。

否则,与这些功能工作是非常困难的,因为它们倾向于:

有太多的泡沫 - 像二进制搜索这样的算法通常运行得更快,因为序列分区工作得很好,因为 n = 2k − 1 的尺寸,因为序列分区工作得更快。 这个细节并不特别重要,但它警告我们,任何算法的准确时间复杂性功能可能非常复杂,如图2.2 所示,有很少的上下泡沫。

https://mimoza.marmara.edu.tr/~msakalli/cse706_12/SkienaTheAlgorithmDesignMan ual.pdf

其他回答

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,告诉我们这个数学是多么艰难。

现在他们要求我添加一个到十个!为什么我会这样做?我不想添加一个到六个?添加一个到十个......好......这会更难!

对于大 n 而言, n 平方比 n 更大。

一个:我选择一张卡在我们现在工作的地板部分,你可以为我选择一个,如果你愿意(第一次我们这样做,“我们现在工作的地板部分”是整个地板,当然。

大 O 告诉我们:这个类型需要 O(n log n) 工作完成,在中间情况下。

现在你知道我的朋友,大O,他帮助我们做不到工作,如果你知道大O,你也可以做不到工作!

你和我一起学到了这一切!你太聪明了!谢谢你!

现在这个工作已经完成了,让我们玩吧!


什么是“大O”笔记的明确英语解释?

我想强调“大O”评分的驱动动力是一件事,当算法的输入尺寸变得太大时,算法的某些部分(即恒数、比例、术语)的方程式描述算法的尺寸变得如此无意义,以至于我们忽略它们。

因此,如果输入尺寸不太大,那么“大O”评分(上限)的想法将毫无意义。


Lets say you want to quantify the performance of the following algorithm
int sumArray (int[] nums){
    int sum=0;   // here we've 1 operation
    for(int i=0; i < nums.length;i++){   // we've n times
        sum += nums[i]; // taking initialization and assignments, 3 ops
    }
    return sum;
}

在上面的算法中,让我们说你发现T(n)如下(时间复杂性):

T(n) = 3*n + 2

n= 1,000,000   -> T(1,000,000) = 3,000,002
n=1,000,000,000  -> T(1,000,000,000) = 3,000,000,002
n=10,000,000,000  -> T(10,000,000,000) = 30,000,000,002

将此类输入给另一个函数 F(n) = n

n= 1,000,000   -> F(1,000,000) = 1,000,000 
n=1,000,000,000  -> F(1,000,000,000) = 1,000,000,000
n=10,000,000,000  -> F(10,000,000,000) = 10,000,000,000

因为你可以看到输入尺寸变得太大,T(n)大约相当于或接近F(n),所以连续2和比例3变得太不重要,现在大O“评级的想法来了,

O(T(n)) = F(n)
O(T(n)) = n

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

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

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

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

测量软件程序的速度非常困难,当我们尝试时,答案可以非常复杂,并且充满了例外和特殊案例,这是一个很大的问题,因为所有这些例外和特殊案例都令人沮丧和无助,当我们想比较两个不同的程序,以确定哪个是“最快”。

好事:

邪恶的:

和那可怕的: