程序和算法的时间复杂度
1.一个程序或算法的时间效率,也称“时间复杂度”,有时简称“复杂度”
2.复杂度常用大写字母O和小写字母n来表示,比如O(n),O(n²)等,n代表问题的规模
3.时间复杂度是用算法运行过程中,某种时间固定的操作需要被执行的次数和n的关系来度量的,在无序数列中查找某个数,复杂度是O(n)
4.计算复杂度的时候,只统计执行次数最多的(n足够大时)那种固定操作的次数,比如某个算法需要执行加法n²次,除法n次,那么就记其复杂度是O(n²)
5.复杂度有“平均复杂度”和“最坏复杂度”两种,两者可能一致,也可能不一致
例如:顺序查找,平均复杂度为n/2,最坏复杂度为n,复杂度都为O(n),注意这里不计系数
快速排序,平均复杂度n*log n,最坏复杂度为n²
6.如果复杂度是多个n函数的和,只关心随n增长增长速度最快的那个函数
7.常见的大O运行时间
O(log n),对数级,包括二分查找
O(n),线性级,包括简单查找即顺序查找
O(n*log n),线性对数级,快速排序
O(n²),平方级,选择排序,冒泡排序,插入排序
O(nª),多项式级,基于n的a层循环
O(n!),阶乘级,旅行商问题
二分查找
例:
A有一个1~100的数,B来猜,可以提问,A只能回答对和错,要以最少次数猜到这个数字
1.是1吗?是2吗?。。。是99吗?平均要问50次
2.大于50吗?大于75吗?。。。每次缩小范围到一半,7次以内就能猜到
此时二分查找的简单程度显而易见
简单查找时间复杂度为O(n),二分查找时间复杂度为O(log n)
但请注意,二分查找前提条件是查找的数列必须是有序的
下面来写一个程序描述上述过程:
最后提一下旅行商问题
大概就是一个旅行商需要前往5个城市,同时要确保旅程最短
为此,可以考虑前往这些城市的各种可能性
对于每种顺序,他都计算总旅程,再挑选出旅程最短的线路
显然,5个城市有5!=120种不同的排列方式
推而广之,n个城市需要执行n!次操作才能计算出结果
因此运行时间为O(n!),这种算法时间复杂度非常糟糕