1.1时间复杂度

认识时间复杂度

常数时间的操作:一个操作如果和数据量没有关系,每次都是
固定时间内完成的操作,叫做常数操作。

时间复杂度为一个算法流程中,常数操作数量的指标。常用O
(读作big O)来表示。具体来说,在常数操作数量的表达式中,
只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分
如果记为f(N),那么时间复杂度为O(f(N))。

评价一个算法流程的好坏,先看时间复杂度的指标,然后再分
析不同数据样本下的实际运行时间,也就是常数项时间。

理解
1.遍历方式(例子) B->M A->N 常规思路为在for循环0到M-1中外部遍历B,内部嵌套遍历A(for 0到N-1) 定义变量cutrent属于B 看在A中是否拥有
可以明显看到时间复杂度 O(M*N)

2.对于一个无序数组B遍历 0-N-1遍历最小值在0位置 过n个数
1-N-1 min 1 n-1
2-N-1 min 2 n-2
. . . .
直到都排好,每个数都比较交换,直到过1个数
明显需要 N+N-1+N-2+N-3+~~~+2+1=N^2/2+N+常数项
(类似于aN^2+bN+1)----叫做常数操作数量表达式

只要高阶项,不要低阶项,也不要高阶项的系数就是例如:
N^2/100+10*N+1 ->O(N^2)
10000N+4->O(N) N是样本量

评价一个算法流程的好坏要先看他的指标,再看常数项。

一个简单的理解时间复杂度的例子

一个有序数组A,另一个无序数组B,请打印B中的所有不在A中的数,A数
组长度为N,B数组长度为M。
算法流程1:对于数组B中的每一个数,都在A中通过遍历的方式找一下;
算法流程2:对于数组B中的每一个数,都在A中通过二分的方式找一下;
算法流程3:先把数组B排序,然后用类似外排的方式打印所有不在A中出现
的数;
三个流程,三种时间复杂度的表达…
如何分析好坏?

流程一:O(MN)
流程二:二分法:例:1 2 4 5 7 8 9里找8
遍历给其索引为 0 1 2 3 4 5 6
L ----------------------------R
中间位置数为L+R/2=mid=3
拿3上索引的数5与8比较,在右边找,砍掉左边一半
一直砍下去,直到数组没有了或找到8了
O(N)->O(log2N)----A一共砍了这么多次
B有M个数,即O(M
log2N)
流程三:A 1 2 4 6 7
B 6 3 9 =>sort 3 6 9
类似外排方式:刚开始a指向1,b指向3,1<3 a往下移动
2<3 a往下移动 4>3 那么3肯定不在A数组当中出现,打印3
b来下一个位置
就是谁小动谁
B移动条件:b指的数小于a指的数
=不打印直接移动 <没出现的+打印移动
不是b<=a ,就是a 移动
时间复杂度:B数组排序 O(M*logM)

							外排:不动a就动b都往右动,a最多指向N个数,b最多指向M个数,直到ab有一个到达终点,即需O(N+M)
							整个复杂度O(M*logM)+O(N+M)

比较:一>二 pass
二三需要通过样本量分析 不一定

发布了12 篇原创文章 · 获赞 8 · 访问量 237

猜你喜欢

转载自blog.csdn.net/weixin_46250218/article/details/105375222