求极限
n->无穷大:
表达式n:–>无穷大
表达式1/n:—>0
(2n2+2n3+n)/n^3
2/n+2+1/n^2
n–》无穷大的时候:
2/n–》0
1/n^2-》0
2–》常数—》此算法的时间复杂度是n^3
时间复杂度的概念:
执行的次数和同数量级(n最高次方数)取商是常数
,那么同数量级就是这个算法的时间复杂度
时间复杂度的计算过程:
1 算出每一行语句执行的次数
2 求和,推导出一个n的表达式T(n)
3 找出同数量级的表示式(n的最高次方)
4 T(n)/同数量级–>常数,那么同数量级就是此算法的时间复杂度
举例1:
for i in range(n): #n
for j in range(5) : #5n
print(i,j) #5n
print(100) #1
T(n)=n+5n+5n+1=11n+1
第三步:同数量级:n
第四步:(11n+1)/n=11
时间复杂度:T(n)=O(n)
举例2:
常数阶
Temp=i;
i=j;
j=temp;
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关
的常数。算法的时间复杂度为常数阶,时间复杂度记作T(n)=O(1)。
如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执
行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
举例3:
n阶:
for i in range(n): #n
print(1) #n
2n–>n
时间复杂度:O(n)
举例4:
n2阶:
for i in range(n): #n
for j in range(n): #n^2
print(1) #n^2
T(n)=2n^2+n
时间复杂度:O(n)=n^2
举例5:
n^3阶:
for i in range(n): #n
for j in range(n): #n^2
for m in range(n): #n^3
print(1) #n^3
T(n)=2n3+n2+n
时间复杂度:O(n)=n^3
举例5:
对数阶
i=1; ①
while (i<=n) #x表示它的执行次数
i=i2; ② 每执行一次,都会2,所以运行次数为2的f(n)次方
解:语句1的频度是1,
设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n
取最大值f(n)= log2n,
时间复杂度:T(n)=O(log2n )
技巧:循环n的时候,循环体里面有了一些条件,让n的执行次数变小,那么就可以认
为是log2n的时间负责度
举例6:
n的对数阶:nlog2n
for i in range(n):
i=1; ①执行1次
while (i<=n) #x表示它的执行次数
i=i*2;
时间复杂度:T(n)=O(nlog2n )
时间复杂度常用的记忆法:
1)访问数组中的元素是常数时间操作,或说O(1)操作。
2)一个算法如 果能在每个步骤去掉一半数据元素,如二分检索,通常它就取O(logn)
时间。
3)用strcmp比较两个具有n个字符的串需要O(n)时间。
4)常规的矩阵乘算法是O(n^3),因为算出每个元素都需要将n对 元素相乘并加到一起
,所有元素的个数是n^2。
5)指数时间算法通常来源于需要求出所有可能结果。例如,n个元 素的
6)集合共有2n个子集,所以要求出所有子集的算法将是O(2n)的。指数算
7)法一般说来是太复杂了,除非n的值非常小,因为,在 这个问题中增
8)加一个元素就导致运行时间加倍。
在计算时间复杂度时,我们一般使用的大O表示法,其时间复杂度,从小到大的排序是
:
(1) < (logn)< (n)< (nlogn)< (n^2)<…< (2^n)< (n!)
时间复杂度越大,时间越多,算的越慢
稳定排序
a=[1,2,-1,-2,3,5,3]
排序:用一个算法排序,排序之后,2个3(任意的多个相等值)的前后相对位置没有
发生变化。换句话说,在排序中,2个3没有进行过交换,那么就叫稳定排序。