【时间复杂度和空间复杂度】

1、时间复杂度

1、什么是时间复杂度?

  • 算法的执行效率
  • 算法的执行时间与算法的输入值之间的关系

2、什么是大O表示法?

  • O(N),其中N指的是例1中的numN = num

【例1:】

def test(num):
    total = 0             # 执行时间为:a;
    for i in range(num):
        total += i        # 执行时间为:b;num次为:num * b;
    return total          # 执行时间为:c;
# 所以test类的时间复杂度 = a + num * b + c

所以当num很大时,那么test类的时间复杂度主要基于num * b。那么例1中对时间复杂度影响最大的就是这个for循环。最后定义例1的时间复杂度为O(N)

1.1、常见的时间复杂度案例

常见的时间复杂度: O ( 1 ) O(1) O(1) O ( l o g n ) O(logn) O(logn) O ( n ) O(n) O(n) O ( n l o g n ) O(nlogn) O(nlogn) O ( n 2 ) O(n^2) O(n2)
【例2: O ( 1 ) O(1) O(1)

def o1(num):
	i = num         # 执行时间为:a;
	j = num * 2     # 执行时间为:b;
	return i + j    # 执行时间为:c;
# 所以o1类的时间复杂度 = a + b + c,为常量,和num的个数无关

定义例2的时间复杂度为O(1)
【例3: O ( N ) O(N) O(N)

def ON(num):
    total = 0             # 执行时间为:a;
    for i in range(num):
        total += i        # 执行时间为:b;num次为:num * b;
    return total          # 执行时间为:c;
# 所以test类的时间复杂度 = a + num * b + c,和num的个数有关

定义例3的时间复杂度为O(N)
【例4: O ( l o g N ) O(logN) O(logN)

def OlogN(num):
    i = 1             # 执行时间为:a;
    while (i < num):
        total = i * 2        # 执行时间为:b;X次为:num = i*2^X,X = log2(num/i)
    return i         # 执行时间为:c;
# 所以test类的时间复杂度 = log2(num/i),和num的个数有关,因为i为常数,可忽略

定义例4的时间复杂度为O(logN)
【例5: O ( N + M ) O(N + M) O(N+M)

def ON(num1, num2):
    total = 0             # 执行时间为:a;
    for i in range(num1):
        total += i        # 执行时间为:b;num次为:num1 * b;
    for i in range(num2):
        total += i        # 执行时间为:b;num次为:num2 * b;
    return total          # 执行时间为:c;
# 所以test类的时间复杂度 = a + num1 * b + num2 * b + c,和num的个数有关

定义例5的时间复杂度为O(N + M)

【例6: O ( N l o g N ) O(NlogN) O(NlogN)

def OlogN(num):
    i = 1             # 执行时间为:a;
    for i in range(num1):         # 执行 num1次
    	while (i < num2):
        	total += i + j        # 执行时间为:b;X次为:num2 = i*2^X,X = log2(num2/i)
        	j = j * 2
    return i         # 执行时间为:c;
# 所以test类的时间复杂度 = (num1)*log2(num2/i),和num的个数有关,因为i为常数,可忽略

定义例4的时间复杂度为NO(logN)
【例5: O ( N + M ) O(N + M) O(N+M)

def ON(num1, num2):
    total = 0             # 执行时间为:a;
    for i in range(num1):
    	for i in range(num2):
        	total += i + j        # 执行时间为:b;num1 * num2次为:num1 * num2 * b;
    return total          # 执行时间为:c;
# 所以test类的时间复杂度 = a + num1 * num2 * b + c,和num的个数有关

定义例4的时间复杂度为 O ( N 2 ) O(N^2) O(N2)

1.2、时间复杂度大小对比图

在这里插入图片描述

时间复杂度从大到小排列: O ( N ! ) O(N!) O(N!) > O ( 2 N ) O(2^N) O(2N) > O ( N 2 ) O(N^2) O(N2) > O ( N l o g N ) O(NlogN) O(NlogN) > O ( N ) O(N) O(N) > O ( l o g N ) O(logN) O(logN) > O ( 1 ) O(1) O(1)

空间复杂度

1、什么是空间复杂度?

  • 算法的存储空间与算法的输入值之间的关系(占空间的都是我们申明的变量)

2、大O表示法?

  • O(N),其中N指的是例1中的numN = num

1.1、常见的空间复杂度案例

在这里插入图片描述
常用的空间复杂度就这两种。

理解

空间复杂度一般指的就是磁盘空间,所以工作中一般优先时间复杂度。

猜你喜欢

转载自blog.csdn.net/weixin_54546190/article/details/129588739