算法:时间复杂度与空间复杂度计算方法

ops/2024/10/18 7:51:15/

计算方法

  • 一、时间复杂度(Time Complexity)
    • 1. 基本概念
    • 2. 计算方法
    • 3.示例
      • 1.常数时间复杂度 O(1)
        • 示例:
          • 讲解:
      • 2. 线性时间复杂度 O(n)
        • 示例1:
          • 讲解:
        • 示例2:
          • 讲解:
      • 3. 平方时间复杂度 O(n²)
        • 示例1:
          • 讲解:
        • 示例2:
          • 讲解:
      • 4. 对数时间复杂度 O(log n)
        • 示例:
          • 讲解:
      • 5. 线性对数时间复杂度 O(n log n)
        • 示例:
          • 讲解:
      • 6. 指数时间复杂度 O(2ⁿ)
        • 示例:
          • 讲解:
  • 二、空间复杂度(Space Complexity)
    • 1. 基本概念
    • 2. 计算方法
    • 3.示例
      • 1. 常数空间复杂度 O(1)
        • 示例:
          • 讲解:
      • 2. 线性空间复杂度 O(n)
        • 示例1:
          • 讲解:
        • 示例2:
          • 讲解:
      • 3. 平方空间复杂度 O(n²)
        • 示例:
          • 讲解:
      • 4. 指数空间复杂度 O(2ⁿ)
        • 示例:
          • 讲解:
  • 三、总结

一、时间复杂度(Time Complexity)

时间复杂度衡量的是算法执行所需的时间,它通常表示为输入数据的规模 ( n ) 的函数。

1. 基本概念

  • 大O符号(Big O Notation):用来描述算法的时间复杂度的上界,表示最坏情况下的时间增长趋势。
  • 常见的时间复杂度
    • ( O(1) ):常数时间复杂度,不随输入规模变化。
    • ( O(log n) ):对数时间复杂度,常见于二分查找。
    • ( O(n) ):线性时间复杂度,常见于简单遍历算法
    • ( O(n log n) ):线性对数时间复杂度,常见于快速排序、归并排序。
    • ( O(n²) ):平方时间复杂度,常见于嵌套循环。
    • (O(2ⁿ) ):指数时间复杂度,常见于递归的组合问题。
    • ( O(n!) ):阶乘时间复杂度,常见于排列问题。

2. 计算方法

  • 逐步分析法:分析算法的每一行代码,累加时间复杂度。
    • 赋值语句、算术运算、比较运算等基本操作的时间复杂度都是 ( O(1) )。
    • 对于循环结构,如果循环次数是 ( n ),那么该部分的时间复杂度是 ( O(n) )。
    • 对于嵌套循环,如果内外层分别有 ( n ) 次和 ( m ) 次,那么时间复杂度是 ( O(n \times m) )。
  • 取最大量级:最终时间复杂度为各部分时间复杂度的最大值。忽略系数和低阶项。

3.示例

1.常数时间复杂度 O(1)

示例:
int a = 10;
int b = a + 5;
讲解:

无论输入数据的规模如何,上述代码中的每个操作都只需要常数时间。因此,这段代码的时间复杂度是 O(1) 。

2. 线性时间复杂度 O(n)

示例1:
c
复制代码
for (int i = 0; i < n; i++) {// O(1) 操作
}
讲解:

这里有一个简单的循环,循环执行了 n 次,每次循环执行 O(1) 的操作。因此,总时间复杂度是 O(n) 。

示例2:
for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {// O(1) 操作}
}
讲解:

在这个例子中,循环运行了 n 次,每次加法操作的时间复杂度是 O(1)。因此,总时间复杂度是 O(n) 。

3. 平方时间复杂度 O(n²)

示例1:
for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {// O(1) 操作}
}
讲解:

这是一个双重嵌套循环。外层循环执行n次,内层循环也执行 n 次,每次内层循环的操作时间复杂度是 O(1)。因此,总时间复杂度是 O(n×n) = O(n²) 。

示例2:
for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {// O(1) 操作}
}
讲解:

在这个例子中,内层循环的次数随外层循环的次数变化,第一次内层循环执行 n 次,第二次执行 n−1 次,以此类推,总时间复杂度为 O(n(n+1)/2) ,简化后依然为 O(n²)。

4. 对数时间复杂度 O(log n)

示例:
int binarySearch(int arr[], int n, int target) {int low = 0;int high = n - 1;while (low <= high) {int mid = low + (high - low) / 2;if (arr[mid] == target)return mid;else if (arr[mid] < target)low = mid + 1;elsehigh = mid - 1;}return -1;
}
讲解:

这是二分查找算法的实现 。在每次循环中,搜索区间都减半,因此时间复杂度为 O(log n) 。

5. 线性对数时间复杂度 O(n log n)

示例:
void mergeSort(int arr[], int l, int r) {if (l < r) {int m = l + (r - l) / 2;mergeSort(arr, l, m);mergeSort(arr, m + 1, r);merge(arr, l, m, r);}
}
讲解:

归并排序是一种典型的 O(n log n) 时间复杂度算法。它将数组递归地分成两半,直到每个子数组只剩一个元素,然后再合并这些子数组。每次合并的复杂度是 O(n) ,递归深度是 O(log n) ,因此总时间复杂度为 O(n log n) 。

6. 指数时间复杂度 O(2ⁿ)

示例:
int fibonacci(int n) {if (n <= 1)return n;elsereturn fibonacci(n-1) + fibonacci(n-2);
}
讲解:

这里是递归计算斐波那契数列的代码。每次递归调用都需要计算两个子问题,导致时间复杂度为 O(2ⁿ) 。这种复杂度通常会导致非常长的执行时间,不适用于大规模数据。

二、空间复杂度(Space Complexity)

空间复杂度衡量的是算法执行过程中所需的存储空间,它表示为输入数据规模 ( n ) 的函数。

1. 基本概念

  • 大O符号:同样使用大O符号表示,表示所需空间的增长趋势。
  • 常见的空间复杂度
    • ( O(1) ):常数空间复杂度,表示不随输入规模变化的额外空间需求。
    • ( O(n) ):线性空间复杂度,表示需要与输入规模成正比的空间。
    • ( O(n²) ):平方空间复杂度,表示需要与输入规模平方成正比的空间。

2. 计算方法

  • 逐步分析法:分析算法中所需的存储空间,累加所有部分的空间复杂度。
    • 简单变量(如整型、浮点型)占用的空间是 ( O(1) )。
    • 数组、列表等数据结构占用的空间与其长度有关,例如一个长度为 ( n ) 的数组占用的空间是 ( O(n) )。
    • 递归调用时,需要考虑调用栈的空间开销。

3.示例

1. 常数空间复杂度 O(1)

示例:
int a = 5;
int b = 10;
int c = a + b;
讲解:

无论输入数据的规模如何,这段代码只占用了固定的内存空间。因此,空间复杂度是 O(1) 。

2. 线性空间复杂度 O(n)

示例1:
int arr[n];
讲解:

如果你声明了一个长度为 n 的数组,那么空间复杂度是 O(n) ,因为数组的大小随 n 的增加而增加。

示例2:
void createArray(int n) {int* arr = (int*)malloc(n * sizeof(int));
}
讲解:

在这个例子中,通过 malloc 分配的内存空间大小为 n 个整数的大小,因此空间复杂度为 O(n) 。

3. 平方空间复杂度 O(n²)

示例:
int matrix[n][n];
讲解:

这里声明了一个 n×n 的矩阵,因此空间复杂度为O(n²) ,因为存储该矩阵所需的空间随 n 的平方增长。

4. 指数空间复杂度 O(2ⁿ)

示例:
void allSubsets(int arr[], int n) {int subset_count = pow(2, n);for (int i = 0; i < subset_count; i++) {for (int j = 0; j < n; j++) {if (i & (1 << j))printf("%d ", arr[j]);}printf("\n");}
}
讲解:

生成一个集合的所有子集需要存储 2ⁿ 个子集。每个子集都可能占用额外的存储空间,导致总体空间复杂度为 O(2ⁿ) 。

三、总结

  • 时间复杂度 主要关注的是算法运行的时间随输入规模的变化趋势。
  • 空间复杂度 主要关注的是算法执行过程中所需的额外存储空间。

http://www.ppmy.cn/ops/100378.html

相关文章

配置PXE预启动执行环境:使用PXE装机服务器网络引导装机

文章目录 PXE概述PXE批量部署的优点基本的部署过程搭建的前提条件 搭建配置PXE装机服务器1. 准备 CentOS 7 安装源&#xff08;YUM 仓库&#xff09;2. 安装并启用 TFTP 服务3. 安装并启用 DHCP 服务4. 准备 Linux 内核和初始化镜像文件5. 准备 PXE 引导程序6. 安装 FTP 服务并…

FreeRTOS学习笔记>内存管理

1. 内存的概念与分类 在计算系统中&#xff0c;内存用于存储变量和中间数据。系统的内存可以分为两种&#xff1a; 内部存储空间&#xff08;RAM&#xff09;&#xff1a;通常指随机存储器&#xff0c;数据存取速度快&#xff0c;可以随机访问&#xff0c;但掉电后数据会丢失…

es、kibana及分词器的安装

文章目录 1、搜索引擎2、为什么使用新型搜索&#xff1f;3、底层原理&#xff1a;倒排索引4、底层API5、你使用了什么分词器&#xff1f;6、ElasticSearch安装6.1、准备目录并授予权限6.2、制作配置文件6.3、初始化es容器6.4、重置es用户密码6.5、安装中文分词器6.5.1、 把资料…

[Hive]四、Hive On Tez

G:\Bigdata\Projects\大数据电商数仓项目(含2.0、3.0版本)\数仓项目实战V2.0\word版资料 1. Hive集成引擎Tez Tez是一个Hive的运行引擎,性能优于MR。为什么优于MR呢?看下图。 用Hive直接编写MR程序,假设有四个有依赖关系的MR作业,上图中,绿色是Reduce Task,云状表示写…

基于Springboot的多功能智能点餐小程序/基于微信小程序的点餐系统

摘要 计算机网络如果结合使用信息管理系统&#xff0c;能够提高管理员管理的效率&#xff0c;改善服务质量。优秀的智能点餐系统能够更有效管理用户智能点餐业务规范&#xff0c;帮助管理者更加有效管理用户智能点餐&#xff0c;可以帮助提高克服人工管理带来的错误等不利因素。…

在银河麒麟服务器V10上源码编译安装mysql-5.7.42-linux-glibc2.12-x86_64

在银河麒麟服务器V10上源码编译安装mysql-5.7.42-linux-glibc2.12-x86_64 一、卸载MariaDB&#xff08;如果已安装&#xff09;二、下载MySQL源码包并解压三、安装编译所需的工具和库四、创建MySQL的安装目录及数据库存放目录五、编译安装MySQL六、配置MySQL七、设置环境变量八…

AI大模型编写多线程并发框架(六十二):限流和并发度优化

系列文章目录 文章目录 系列文章目录前言一、项目背景二、第三轮对话-补充异步执行代码三、第四轮对话-增加限流器四、第五轮对话-抽取限流器接口五、第六轮对话-修改并发度三、参考文章 前言 在这个充满技术创新的时代&#xff0c;AI大模型正成为开发者们的新宠。它们可以帮助…

回归预测|基于北方苍鹰优化核极限学习机的数据预测Matlab程序NGO-KELM 多特征输入单输出

回归预测|基于北方苍鹰优化核极限学习机的数据预测Matlab程序NGO-KELM 多特征输入单输出 文章目录 一、基本原理1. 基本原理核极限学习机&#xff08;KELM&#xff09; 2. NGO-KELM回归预测流程1. 数据预处理2. 核极限学习机&#xff08;KELM&#xff09;模型构建3. 北方苍鹰优…