时间复杂度和空间复杂度
时间复杂度:是指执行当前算法所消耗的时间。
空间复杂度:是指执行当前算法需要占用多少内存空间。
作用:
衡量一个算法的优劣性,有些时候需要在二者之间权衡,进行取舍,寻找二者的平衡点。
时间复杂度计算:
大O表示法:T(n) = O(f(n)) ,其中f(n) 表示每行代码执行次数之和 。
eg:
events = pygame.event.get() #执行一次
for event in events: #执行一次
if event.type in (QUIT,KEYDOWN): #执行N次
sys.exit()
执行的总次数f(n)=n+2 n逐渐变大后,n+2就近似于n, 所以T(n) = O(f(n))=O(n)
时间复杂度量级 :
从上到下复杂度逐渐变大
常数阶O(1)
对数阶O(logN)
线性阶O(n)
线性对数阶O(nlogN)
平方阶O(n²)
立方阶O(n³)
K次方阶O(n^k)【n的k次方,符号不会敲】
指数阶(2^n)
常数阶O(1)
代码只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1)
对数阶O(logN)
i=1
while i<n: #执行x次后,i>n,结束循环,i=(i*2)^x,i初始为1,所以i=2^x,我们将最终的i近似于n,就有 x=log2n[公式敲不出来]
i*=2
线性对数阶O(nlogN)
将对数阶O(logN)执行n遍,就是线性对数阶O(nlogN)
平方阶O(n²)
果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。
空间复杂度
对一个算法在运行过程中临时占用存储空间大小的一个量度 。
空间复杂度比较常用的有:O(1)、O(n)、O(n²)
算法执行所需要的临时空间不随着某个变量n的大小而变化 ,空间复杂度 S(n) = O(1)
空间复杂度其实在这里更多的是说一下这个概念,因为当今硬件的存储量级比较大,一般不会为了稍微减少一点儿空间复杂度而大动干戈,更多的是去想怎么优化算法的时间复杂度。
所以我们在日常写代码的时候就衍生出了用「空间换时间」的做法,并且成为常态