算法的时间空间复杂度笔记

小白一枚,用博客记录我的所学,今天学了时间空间复杂度,搜了好多,但是没有自己认为非常详细的讲解,学完之后自己整理了一下笔记。(第一次写博客,不足之处请指出,多多指教,多多海涵~)

还请各位少侠慢慢观看,细心挑错( * _ *)

算法,是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许结果是一样的,但在过程中的资源消耗和时间却会有很大的区别。

那从什么方面来考虑捏??
答:主要是从算法所占用的 时间 和 空间 两个维度去度量。

时间复杂度 : 度量算法执行时间的长短
空间复杂度 : 度量算法所需储存空间的大小

^ _ ^,那么我们就要学会去计算自己所写的程序的时间复杂度和空间复杂度

一、时间复杂度的计算
先举一个栗子:

计算时间复杂度例子
for i in range(0,n):
	print("hello")
	for j in range(0,n):
		print("byebye~")	

一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)
算法的基本操作重复执行的次数n记为某一个函数f(n),因此,算法的时间复杂度记做:
T(n)=O( f(n) )
随着n的增大,算法执行的时间和f(n)成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高。
步骤
在计算时间复杂度的时候
1.先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有:1<log2n <n <nlog2n <n2<n3<2n<n!这些种),
2.找出后,f(n)=该数量级,若T(n)/f(n)求极限可得到一常数c,则时间复杂度T(n)=O(f(n))

计算时间复杂程度的步骤(以上述代码为例):
1.T(n) = n + n2 数量级为n2,f(n) = n2
2.求n趋近于正无穷时,lim T(n)/f(n) 如果结果为不等于零的常数c,那么时间复杂度T(n)=O(f(n))
求f(n)时,忽略掉T(n)中的常数、低次幂、高次幂的系数
简化版步骤:
再来分析一下,可以看出,决定算法复杂度的是执行次数最多的语句,一般也是最内循环的语句。并且,通常将求解极限是否为常量也省略掉.
于是,以上步骤可以简化为:
1. 找到执行次数最多的语句
2. 计算语句执行次数的数量级
3. 用大O来表示结果
复杂程度大小:O(1)<O(log2n) <O(n) <O(nlog2n) <O(n2)<O(n3)<O(2n)<O(n!)

二、空间复杂度的计算

1.常量空间

当算法的存储空间大小固定时,和输入规模没有直接的关系时,空间复杂度记作O(1) 。

2.线性空间

当算法分配的空间是一个线性的集合,并且集合大小和输入规模n成正比时,空间复杂度记作O(n)

空间复杂程度不会计算,内存这方面不太懂,先放着罢(QTQ)

三、取舍
对于空间,时间的取舍要权衡利弊,两者相权取其轻。
如果两者差不多就选取时间短的(也要考虑按实际要求,条件等)

PS:本文不用于任何商业用途,仅用于学习,其中有一些内容是从网上摘抄,原创作者如不同于请联系鄙人。
PS:有错误请务必指出
PS:空间复杂度以后更新

猜你喜欢

转载自blog.csdn.net/qq_51182221/article/details/111648975