我更喜欢尽可能少的正式定义和简单的数学。
当前回答
预告片
算法:解决问题的程序/公式
如何分析算法,如何比较算法?
例如:你和一个朋友被要求创建一个函数,将数字从 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(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或他们说它是什么,但这将是规模的支配因素。
最简单的定义我可以给大 Oh 评分是:
智者可能已经意识到,我们可以表达操作的数量如:n2 + 2n. 但是,正如你从我们的例子中看到的两个数字的百万数字左右,第二个术语(2n)变得毫无意义(计算为0.0002%的总操作在这个阶段)。
因此,要找到一个名字给了电话号码(逆转搜索):
最佳案例:O(1);预期案例:O(n)(为500,000);最糟糕案例:O(n)(为1000,000)。
旅行卖家
听起来很简单吗?再想一想。
聚合物时间
另一个我想快速提到的是,任何具有O(na)复杂性的算法都说具有多元复杂性,或者在多元时间可溶解。
大 O 评分是描述一个算法的空间或运行时间的上限的一种方式. n 是问题的元素数量(即序列的尺寸,树上的节点数量等) 我们有兴趣描述运行时间,因为 n 变得大。
要说二进制搜索有运行时间的O(登录)是说有某些恒定的c,你可以增加登录(n)通过它将总是比运行时间的二进制搜索。
换句话说,g(n)是你的算法的运行时间,我们说g(n) = O(f(n))当g(n) <=c*f(n)当n > k,当c和k是某些恒定的。
告诉你从亚马逊订购哈利·波特:完整的8电影收藏(Blu-ray)并同时在线下载相同的电影收藏。你想测试哪种方法更快。
从实验中,我们知道在线购物的规模比在线下载更好,很重要的是要了解大O评级,因为它有助于分析算法的规模性和效率。
注意: 大 O 评级是算法最糟糕的场景,假设 O(1) 和 O(n) 是上面的例子最糟糕的场景。
参考: http://carlcheo.com/compsci
推荐文章
- 如何计算圆周长上的一点?
- 从整数流中找到运行中位数
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 在任何情况下,您更喜欢高大o时间复杂度算法而不是低大o时间复杂度算法吗?
- 如何使用JavaScript比较软件版本号?数量(只)
- 在常数平摊时间O(1)中将一个对象追加到R中的列表?
- 跳跃表vs.二叉搜索树
- 如何使四舍五入百分比加起来为100%
- 是否有可能得到一个函数的所有参数作为单一对象内的函数?
- LL和LR解析之间的区别是什么?
- log(n!) = Θ(n·log(n))?
- C语言中位反转的高效算法(从MSB->LSB到LSB->MSB)
- 递归还是迭代?
- 什么是“P=NP?”,为什么这是一个如此著名的问题?
- 两个长度不等的表之间的排列