我更喜欢尽可能少的正式定义和简单的数学。
当前回答
假设我们正在谈论一个算法A,该算法应该做一些与数据集的尺寸n。
然后 O( <某些表达式 X 涉及 n> ) 意思,在简单的英语:
如果您在执行 A 时不幸,可能需要尽可能多的 X(n) 操作完成。
正如发生的那样,有某些功能(想想它们作为X(n))的实施,这些功能往往很常见,这些功能是众所周知的,易于比较的(例子:1、Log N、N、N^2、N!等)。
比较这些,当谈到A和其他算法时,很容易根据他们可能需要完成的操作数量排序算法。
总的来说,我们的目标将是找到或结构一个算法A,以便它有一个函数X(n)返回尽可能低的数字。
其他回答
告诉你从亚马逊订购哈利·波特:完整的8电影收藏(Blu-ray)并同时在线下载相同的电影收藏。你想测试哪种方法更快。
从实验中,我们知道在线购物的规模比在线下载更好,很重要的是要了解大O评级,因为它有助于分析算法的规模性和效率。
注意: 大 O 评级是算法最糟糕的场景,假设 O(1) 和 O(n) 是上面的例子最糟糕的场景。
参考: http://carlcheo.com/compsci
EDIT:快注,这几乎是令人困惑的Big O评分(这是一个上线)与Theta评分(这是一个上线和下线)。在我的经验中,这实际上是非学术设置讨论的典型。
在一个句子中:随着你的工作的规模上升,完成工作需要多长时间?
“大O”评分的一个重要方面是,它不会说哪个算法会更快到一个特定的尺寸。 采取一个字符串(字符串,整体值)对一系列对(字符串,整体值)。 是否更快地找到字符串中的关键或字符串中的元素,基于字符串? (即字符串, “找到字符串部分与特定的关键相匹配的第一个元素” ) 字符串是基因。
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)表达。
预告片
算法:解决问题的程序/公式
如何分析算法,如何比较算法?
例如:你和一个朋友被要求创建一个函数,将数字从 0 到 N. 你与 f(x) 和你的朋友与 g(x) 相同的结果,但两个函数有不同的算法。
Big-O 评分:描述运行时间将与输入相对增长的速度,因为输入随意大。
三个关键点:
比较运行时间的增长速度 不要比较准确的运行时间(取决于硬件) 只关心运行时间的增长与输入(n) 因为n 随意大,专注于将增长最快的术语,因为n 得到大(想想无限) AKA 无形分析
空间复杂性:除了时间复杂性之外,我们也关心空间复杂性(一个算法使用的内存/空间多少)。
大 O 在平式英语是如<=(少于或等)。当我们说为两个函数f 和 g,f = O(g) 它意味着f <= g。
但是,这并不意味着任何 n f(n) <= g(n) 事实上,它意味着 f 是增长方面低于或等于 g 的,这意味着在一个点 f(n) <= c*g(n) 之后,如果 c 是恒定的,然后一个点意味着所有 n >= n0 在那里 n0 是另一个恒定的。
推荐文章
- 如何计算圆周长上的一点?
- 从整数流中找到运行中位数
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 在任何情况下,您更喜欢高大o时间复杂度算法而不是低大o时间复杂度算法吗?
- 如何使用JavaScript比较软件版本号?数量(只)
- 在常数平摊时间O(1)中将一个对象追加到R中的列表?
- 跳跃表vs.二叉搜索树
- 如何使四舍五入百分比加起来为100%
- 是否有可能得到一个函数的所有参数作为单一对象内的函数?
- LL和LR解析之间的区别是什么?
- log(n!) = Θ(n·log(n))?
- C语言中位反转的高效算法(从MSB->LSB到LSB->MSB)
- 递归还是迭代?
- 什么是“P=NP?”,为什么这是一个如此著名的问题?
- 两个长度不等的表之间的排列