01时间复杂度&空间复杂度

262 阅读2分钟

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)