> 文章列表 > 【时间复杂度和空间复杂度】

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

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

时间复杂度和空间复杂度

  • 1、时间复杂度
      • 1.1、常见的时间复杂度案例
    • 1.2、时间复杂度大小对比图
  • 空间复杂度
      • 1.1、常见的空间复杂度案例
  • 理解

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 * 2return 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、常见的空间复杂度案例

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

理解

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