Big o 帮助理解大O

Big o 帮助理解大O,big-o,Big O,我试图找到一个好的解释来快速理解大O和θ理论。我总是觉得一个解释可以用上百万种不同的方式给出,我想我正在寻找一个最终有意义的解释。我知道这是一个n00b问题,但任何帮助都将不胜感激。就解释而言,StackOverflow的人似乎对我的感到很高兴。你可能也喜欢至于解释,StackOverflow的人似乎对我的很感兴趣。您可能还喜欢一个困惑点是,为什么您可能认为是O(2n)、对列表中的每个项目执行两个操作的东西以及您可能认为是O(n)的其他东西实际上都被认为是O(n) 原因是当你开始使用巨大的数据集

我试图找到一个好的解释来快速理解大O和θ理论。我总是觉得一个解释可以用上百万种不同的方式给出,我想我正在寻找一个最终有意义的解释。我知道这是一个n00b问题,但任何帮助都将不胜感激。

就解释而言,StackOverflow的人似乎对我的感到很高兴。你可能也喜欢

至于解释,StackOverflow的人似乎对我的很感兴趣。您可能还喜欢

一个困惑点是,为什么您可能认为是O(2n)、对列表中的每个项目执行两个操作的东西以及您可能认为是O(n)的其他东西实际上都被认为是O(n)

原因是当你开始使用巨大的数据集时,O(2n)和O(n)之间的差异在考虑如何与O(n ^ 2)或O(log n)比较时并不是很大的差别。考虑是否有3种不同的搜索算法来搜索数据集。该数据集包含一百万项。每个算法将执行的操作数:

O(2n)=2000000

O(n)=1000000

O(n^2)=10000000000

O(2n)的速度只有O(n)的2倍,但是O(n^2)的速度是O(n)的一百万倍。这是一个难以置信的巨大差异<强大的O符号实际上是在处理一个算法“缩放”,或者换句话说,当你考虑越来越大的数据集时,它是如何执行的。>/P> 对于非常小的数据集,O(n^2)算法表现良好,但对于较大的数据集,其性能会迅速下降。O(2n)和O(n)将均匀地逐渐降解,这更接近用户在处理更多数据时的预期

出于这个原因,人们不谈论O(2n),他们只谈论O(n),因为两者都代表线性时间(线性,即随着数据的添加,操作的数量均匀且逐渐增加)


一开始认为某人的算法执行速度是原来的两倍仍然被认为是O(n),这可能令人沮丧,但大O符号并不是相对速度的度量。大O表示法是一种衡量算法如何根据其处理的数据量进行缩放的方法。

一个令人困惑的问题是,为什么您可能认为是O(2n)、对列表中的每个项目执行两个操作的东西以及您可能认为是O(n)的其他东西实际上都被认为是O(n)

原因是当你开始使用巨大的数据集时,O(2n)和O(n)之间的差异在考虑如何与O(n ^ 2)或O(log n)比较时并不是很大的差别。考虑是否有3种不同的搜索算法来搜索数据集。该数据集包含一百万项。每个算法将执行的操作数:

O(2n)=2000000

O(n)=1000000

O(n^2)=10000000000

O(2n)的速度只有O(n)的2倍,但是O(n^2)的速度是O(n)的一百万倍。这是一个难以置信的巨大差异<强大的O符号实际上是在处理一个算法“缩放”,或者换句话说,当你考虑越来越大的数据集时,它是如何执行的。>/P> 对于非常小的数据集,O(n^2)算法表现良好,但对于较大的数据集,其性能会迅速下降。O(2n)和O(n)将均匀地逐渐降解,这更接近用户在处理更多数据时的预期

出于这个原因,人们不谈论O(2n),他们只谈论O(n),因为两者都代表线性时间(线性,即随着数据的添加,操作的数量均匀且逐渐增加)


一开始认为某人的算法执行速度是原来的两倍仍然被认为是O(n),这可能令人沮丧,但大O符号并不是相对速度的度量。大O表示法是一种衡量算法如何根据其处理的数据量进行缩放的方法。

大O是一种用于比较算法的分析工具。大O是函数的上界。将上限视为算法运行所需的最大时间

大O通常使用变量n表示算法中元素的变化量。例如,如果对数组的每个元素执行操作,n将表示数组的大小。您将需要执行该操作n次

程序员使用这种表示法是为了有一个共同点来说明一个算法有多复杂,以及(如上所述)该算法的可伸缩性有多好(意味着当n越来越大时它的性能有多好)

计算fibonnaci序列第n个元素的算法对于大O表示法来说非常有洞察力。考虑一个递归方法求解FiBnNaCi序列的第n个元素:

fib(n) {
   if (n == 0) 
     return 0;
   else if (n == 1)
     return 1;
   else 
     return fib(n-1) + fib(n-2);
 }
这是一个简单的斐波那契实现,对于任何大于100的n,运行时间都非常慢。我们将该算法归类为O(2^n),它在图上以指数速度增长。指数是伟大的,当它是处理你的银行帐户的钱,但可怕的是,当它是处理算法

Fibonacci的不同实现可以显著加快算法的速度

fib(n) {
  fibArr[n + 1];
  fibArr[0] = 0;
  fibArr[1] = 1;


  for(int i = 2; i <= n; i++) {
     fibArr[i] = fibArr[i-1] + fibArr[i-2];
  }
 return fibArr[n];
}
将上述数字视为需要执行的操作量。如果每个操作需要1毫秒(只是一个估计),您可以开始猜测一个算法可能需要多长时间

大O分析还有很多。考虑大O.

的这些不同类型的分类。
Constant time - O(1)
Logarithmic - O(logn)
Linear - O(n)
Quadratic - O(n^2)
Exponential - O(2 ^n)
Factorial - O(n!)

选择算法时,了解执行算法所需的大致运行时间和空间非常重要

Big O是一种用于比较算法的分析工具。大O是函数的上界
fib(n) {
  fibArr[n + 1];
  fibArr[0] = 0;
  fibArr[1] = 1;


  for(int i = 2; i <= n; i++) {
     fibArr[i] = fibArr[i-1] + fibArr[i-2];
  }
 return fibArr[n];
}