大O符号与时间复杂度

大O符号与时间复杂度

大O符号

大O符号使用函数来描述数据规模增长到很大时算法的最坏性能是如何与问题规模相关的(这有时称为程序的渐进性能)。这个函数写在大写字母O后面的括号里。
计算算法的大O符号有5个基本规则:
1)如果一个算法对于一个数学函数f执行一系列地步骤f(N)次,它需要O(f(N))步。
比如在FindLargest(寻找最大值)算法中把数组中的每一个数都遍历一遍,所以说它的复杂度是O(N)。
2)如果一个算法对于函数f执行了一个需要O(f(N))步的操作,然后对于函数g执行了第二个需要O(g(N))步的操作,这个算法的整体复杂度是O(f(N) + g(N))。
也就是两个步骤加起来。
3)如果一个算法的复杂度是 O(f(N)+g(N)),并且对于足够大的N,函数f(N)远大于 g(N),这个算法的性能可以被简化为 O(f(N))。
可以忽略那些较小的函数。
4)如果一个算法执行了一个需要O(f(N)步的操作,对于操作中的每一步执行了另外O(g(N))步,这个算法的总体复杂度是O(f(N)Xg(N))。
相当于两个嵌套,

for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
func
}
}//一个简单的示例

5)忽略常数的倍数。如果C是一个常数,O(C×f(N))等同于 O(f(N)。并且 O(f(C×N))等同于 O( f(N))。
在这里,重要的不是常量,而是运行时间的增加与输入值N的平方成正比。

常见的运行时间函数

1.复杂度为O(1)的算法
这类算法往往执行相对琐碎的任务,因为它们在O(1)时间里甚至都不能遍历输出内容。
2.复杂度为O(log N)的算法
复杂度为O(log N)的算法通常在每一步中把它必须考虑的元素的数量除以一个固定的因数。
搜索一棵完全二叉树需要O(log N)步。
3.复杂度为O(sqrt(N))的算法
这个函数增长的很慢但是比log(N)增长得快一点点。
它们也并不是很常见。
4.复杂度为O(N)的算法
函数N增长得比log(N)和 sqrt(N)快但并不快太多,所以大多数复杂度是O(N)的算法在实践中表现都相当不错。
5.复杂度为 O(Nlog N)的算法
假设一个算法遍历其输入中的所有元素,然后在每一个循环中,对那个元素执行了某种复杂度为 O(logN)的计算。在这种情况下,这个算法的复杂度是O(N×logN)或O(N log N)。
许多比较元素的排序算法其时间复杂度都是O(N logN)。实际上,可以证明任何通过比较元素的排序算法至少要O(N logN)步。所以至少在大O符号中,这是能做到的最好状况即便如此,一些算法仍然比其他的算法快,这是因为在大O符号里,常量是被忽略的。
6.复杂度为 O(N^2)的算法
一个算法遍历所有输入,然后对于每一个输入都再次遍历每一个输人的操作时间复杂度就是 O(N^2)。
7.复杂度为 O(2^N)的算法
例如,考虑背包问题:给出一系列有价值和重量的物品,同时也有一个可以容纳一定重量的背包,可以选几个重的物品放在背包里,或者往里面放许多轻的物品。问题是如何能使背包装的物品价值之和最大。
这可能看起来是一个简单的问题。但是已知的寻找最佳方案的算法基本要求检验每个可能的组合。
下面看看一共有多少种可能的组合。请注意每一个物品可以放进背包也可以不放进背包,所以每个物品有两种可能。如果把这些数字乘起来,那么会得到2x2x…x2-2~个可能的选择。
有时不需要尝试每个可能的组合。例如,如果第一个物品就把背包完全填满了,就不需要把第一件物品和任何其他物品的组合包括在选择的物品内。然而,一般来说,不能排除足够多的可能性来缩小搜索的范围。
对于时间复杂度是指数函数的问题,经常需要使用启发式算法。它一般能产生不错的结果,但不能保证产生最佳结果。
8.复杂度为O(N!)的算法
阶乘函数写作 N!,对于大于0的整数,定义为N!=1x2x3x…XN。这个函数增长得非常快,甚至比指数函数2~还快。时间复杂度是阶乘级的经典算法是寻找最佳的输入安排例如,在旅行商问题(Traveling Salesman Problem,TSP)中,输人是一份城市列表目标是寻找一条恰好参观每个城市一次然后回到出发点、并且走过总路程最小的路线。
当城市很少时,这个问题并不难处理。但城市很多时,问题就变得有挑战性了。最显而易见的方法是尝试每个可能的安排。遵循着阶乘算法,在第一个城市有N种可能的选择。在做出选择后,接下来有N-1个城市可以访问。然后有N-2种可能的第三个城市,以此类推。所以安排的总数是 NX(N-1)X(N-2)x…X1=N!。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值