01时间复杂度&空间复杂度
笔记背景:
这是我学习数据结构与算法的笔记,也是专栏的第一篇。笔记案例从up主处拷贝并整理,使用python语言。LeetCode刷题语言为JavaScript。
教程来自于up主:爱学习的饲养员——手把手带你刷Leetcode力扣
一、时间复杂度
1.什么是时间复杂度
可以理解为: 算法的执行效率(算法的执行时间与算法的输入值之间的关系)
用大O符号表述
技巧:看循环
2.常见的时间复杂度
无循环
O(1)
执行常数次,和输入num无关
def O1(num):
i = num
j = num*2
return i+j
单层循环
O(n)
执行了num次
def ON(num):
total = 0
for i in range(num):
total+=i
return total
O(logN)
为方便理解,假设num = 5,则输出结果为4,循环了2次;假设num = 10,则输出结果为8,循环了3次。
i = 1,return 2
i = 2,return 4
i = 3,return 8
发现规律,循环了log2的N次。log的底数2来自于i*2,N与num有关,但具体的规律要看具体的代码,于是时间复杂度可以笼统的表示为O(logN)
def OlogN(num);
i = 1
while(i < num):
i = i*2
return i
多层循环
O(M+N) 双层循环并列
def OMN(num):
total = 0
for i in range(num):
total += 1
for j in range(num):
total += j
return total
O(NlogN) 双层循环嵌套
def ONlogN(num1, num2):
total = 0
j = 0
for i in range(num1):
while(j < num2):
total += i + j
j = j*2
return total
O(N^2) 双层循环嵌套
def ON2(num):
total = 0
for i in range(num):
for j in range(num):
total += i + j
return total
3.时间复杂度的耗时比较
O(1) < O(logN) (二分查找) < O(N) < O(NlogN)(排序) < O(N^2) < O(2^n) < O(n!)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P2N6dfEZ-1644330593407)(D:\Code_project\Web_Front_End_Project\数据结构与算法&LeetCode力扣刷题初探\时间复杂度.png)]
二、空间复杂度
1.什么是空间复杂度
可以理解为: 算法的存储空间与算法的输入值之间的关系
技巧:看常量,看其与输入值的关系
2.常见的空间复杂度
O(1)
total为int类型变量,无论num数组多大,total只占据一份空间,所以空间复杂度为O(1)
def test(num):
total = 0;
for i in range(num):
total += i
return total
O(N)
array为一个数组,其大小随着nums变化而变化,所以空间复杂度为O(N)
def ON(nums):
array = []
for num in nums:
array.append(num)
return array
递归O(N)
递归要考虑递归栈
def ON(num): if(num<=0): return 0 return ON(num-1) + ON(num-2)
3.空间复杂度的耗时比较
O(1) < O(N) < O(N^2)