当前位置: 首页 > news >正文

时间复杂度空间复杂度

一、时间复杂度


时间复杂度(Time Complexity)表示算法运行时间随输入规模增长的变化趋势。通常用大 O 表示法(Big O Notation)来描述。

常见时间复杂度
复杂度名称例子
O(1)常数时间复杂度访问数组中的某个元素。
O(log n)对数时间复杂度二分查找。
O(n)线性时间复杂度遍历数组或链表。(一重循环)     
O(n log n)线性对数时间复杂度快速排序、归并排序。  
O(n²)平方时间复杂度冒泡排序、选择排序(双重循环
O(2ⁿ)指数时间复杂度递归求解斐波那契数列(未优化)。
O(n!)阶乘时间复杂度旅行商问题(穷举所有排列)。

 例子

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

int getFirstElement(int[] arr) {
    return arr[0]; // 无论数组多大,只需一次操作
}

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

void printArray(int[] arr) {
    for (int i = 0; i < arr.length; i++) { // 遍历数组,操作次数与数组长度成正比
        System.out.println(arr[i]);
    }
}

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

void bubbleSort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr.length - 1; j++) { // 双重循环,操作次数与数组长度的平方成正比
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
            }
        }
    }
}

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

int binarySearch(int[] arr, int target) {
    int left = 0, right = arr.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) return mid;
        if (arr[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return -1;
}

二、空间复杂度


空间复杂度(Space Complexity)表示算法运行过程中所需的额外存储空间随输入规模增长的变化趋势。通常也用大 O 表示法描述。

常见空间复杂度
复杂度名称例子
O(1)常数空间复杂度只使用固定数量的变量。
O(n)线性空间复杂度使用一个与输入规模成正比的数组或列表。  
O(n²)平方空间复杂度使用一个二维数组(如邻接矩阵)。  

例子

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

int sum(int a, int b) {
    return a + b; // 只使用了固定数量的变量(a 和 b)
}


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

int[] copyArray(int[] arr) {
    int[] newArr = new int[arr.length]; // 创建了一个与输入数组大小相同的新数组
    for (int i = 0; i < arr.length; i++) {
        newArr[i] = arr[i];
    }
    return newArr;
}

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

int[][] createMatrix(int n) {
    int[][] matrix = new int[n][n]; // 创建了一个 n x n 的二维数组
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            matrix[i][j] = i + j;
        }
    }
    return matrix;
}

三. 如何分析时间复杂度和空间复杂度

时间复杂度分析


1. 找出基本操作:通常是循环、递归、条件判断等。
2. 计算基本操作的执行次数:通常与输入规模(如数组长度 `n`)有关。
3. 用大 O 表示法表示:忽略常数项和低阶项。

void printPairs(int[] arr) {
    for (int i = 0; i < arr.length; i++) { // O(n)
        for (int j = 0; j < arr.length; j++) { // O(n)
            System.out.println(arr[i] + ", " + arr[j]); // O(1)
        }
    }
}

总时间复杂度:`O(n) * O(n) * O(1) = O(n²)`。

空间复杂度分析


1. 找出额外存储空间:通常是变量、数组、递归栈等。
2. 计算存储空间的大小:通常与输入规模(如数组长度 `n`)有关。
3. 用大 O 表示法表示:忽略常数项和低阶项。

例子

int[] reverseArray(int[] arr) {
    int[] result = new int[arr.length]; // O(n)
    for (int i = 0; i < arr.length; i++) {
        result[i] = arr[arr.length - 1 - i];
    }
    return result;
}


总空间复杂度:`O(n)`(用于存储 `result` 数组)。

4. 总结

时间复杂度:衡量算法运行时间随输入规模增长的变化趋势。
空间复杂度:衡量算法运行过程中所需的额外存储空间随输入规模增长的变化趋势。
大 O 表示法:忽略常数项和低阶项,关注增长趋势。

谢谢deepseek,存个档

相关文章:

  • 【51单片机】程序实验15.DS18B20温度传感器
  • Android List按属性排序方法总结工具类
  • C# Excel开源操作库MiniExcel使用教程
  • Linux 信号
  • 什么样的物联网框架适合开展共享自助KTV唱歌项目?
  • 游戏引擎学习第144天
  • 《几何原本》命题I.20
  • Spring (八)AOP-切面编程的使用
  • 前端面试题 口语化复述解答(从2025.3.8 开始频繁更新中)
  • 动静态库链接生成和使用以及认识ELF文件
  • FPGA 实验报告:四位全加器与三八译码器仿真实现
  • 【NLP 31、文本匹配任务 —— 深度学习】
  • 跟着 Lua 5.1 官方参考文档学习 Lua (11)
  • 线性代数之矩阵特征值与特征向量的数值求解方法
  • 2022年《申论》第二题(河北A卷)
  • Java高频面试之集合-07
  • 剖析Manus:AI领域的创新先锋还是虚假泡沫?
  • 【leetcode hot 100 141】环形链表
  • 解锁AIGC新时代:通义万相2.1与蓝耘智算平台的完美结合引领AI内容生成革命
  • 掌握Linux基础:从Shell提示符到文件管理的全面指南
  • 国外装修网站建设模板/百度平台营销
  • 温州做网站的公司/最好用的磁力搜索器
  • 网站想做个链接怎么做/网站推广seo是什么
  • 新闻网站建设汇报/百度指数功能模块有哪些
  • 如何制作公司网站和网页/论坛优化seo
  • 哪家购物网站做的好/seo搜索引擎优化就业指导