文章目录

  • 前言
  • 一、时间复杂度
  • 二、空间复杂度
  • 三、常见的案例和示例
    • 1. 线性查找(Linear Search)
    • 2. 快速排序(Quick Sort)
    • 3.动态规划(Dynamic Programming)
    • 4.图搜索(Graph Search)
    • 5.哈希表(Hash Table)
  • 总结

前言

当我们谈论算法的效率时,我们关注的两个主要方面是时间复杂度和空间复杂度。

时间复杂度 描述的是算法在执行过程中所需要的时间资源。它通常用大O符号来表示,表示算法的运行时间随输入规模增大而变化的趋势。比如,O(1) 表示常数时间复杂度,O(n)表示线性时间复杂度,O(n^2)表示平方时间复杂度,等等。时间复杂度越低,算法的执行速度越快。

空间复杂度 描述的是算法在执行过程中所需要的内存资源。它也通常用大O符号来表示,表示算法的内存占用随输入规模增大而变化的趋势。比如,O(1)表示常数空间复杂度,O(n)表示线性空间复杂度,O(n^2)表示平方空间复杂度,等等。空间复杂度越低,算法所占用的内存越少。


为了更好地理解时间和空间复杂度的概念,下面我们通过Java语言来给出一些简单的例子。

一、时间复杂度

常见的表示如下:

  • O(1):常数时间复杂度,表示算法的运行时间不随输入规模变化而变化,例如数组的访问、常数次数的数学运算等
  • O(log n):对数时间复杂度,表示算法的运行时间随着输入规模 n 的增加而以对数形式增长,例如二分查找、平衡二叉搜索树等。
  • O(n):线性时间复杂度,表示算法的运行时间随着输入规模 n 的增加而以线性形式增长,例如顺序查找、线性搜索等。
  • O(n^2):平方时间复杂度,表示算法的运行时间随着输入规模 n 的增加而以平方形式增长,例如嵌套循环、选择排序等。
  • O(n^k):多项式时间复杂度,表示算法的运行时间随着输入规模 n 的增加而以 k 次方的形式增长,其中 k 是常数。
  • O(2^n):指数时间复杂度,表示算法的运行时间随着输入规模 n 的增加而以指数形式增长,例如穷举法、递归法等。

// O(1)的时间复杂度,常数时间复杂度
public void printFirstElement(int[] arr) {System.out.println(arr[0]);
}

上面的代码中,无论输入参数a和b的大小如何,都只进行一次加法操作,因此运行时间不会随输入规模的增加而增加,所以时间复杂度为O(1)


// O(n)的时间复杂度,线性时间复杂度
public void printAllElements(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}
}

上面的代码中,需要对一个长度为n的数组进行遍历,并比较每个元素与当前最大值的大小关系,因此运行时间随输入数组的长度n线性增长,所以时间复杂度为O(n)。


// O(n^2)的时间复杂度,平方时间复杂度
public void printAllPairs(int[] arr) {for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {System.out.println(arr[i] + ", " + arr[j]);}}
}

上面的代码中,嵌套了两层循环,需要对数组中的每一对元素进行输出,因此运行时间随输入数组的长度n的平方增长,所以时间复杂度为O(n^2)。


二、空间复杂度

常见的表示如下:

O(1):常数空间复杂度,表示算法的空间需求不随输入规模变化而变化,例如常数个变量的存储。
O(n):线性空间复杂度,表示算法的空间需求随着输入规模 n 的增加而以线性形式增长,例如数组、链表等。
O(n^2):平方空间复杂度,表示算法的空间需求随着输入规模 n 的增加而以平方形式增长,例如二维数组等。

没有提到 O(logn),是因为空间复杂度很少用于描述对数级别的空间需求。通常情况下,空间复杂度主要关注算法在运行时所需的额外存储空间,例如数组、变量、数据结构等。而对数级别的空间需求很少出现,因为它通常只涉及到一些常数级别的辅助变量


// O(1)的空间复杂度,常数空间复杂度
public int add(int a, int b) {return a + b;
}

上面的代码中,只需要有两个整数型的变量来保存输入参数和返回值,不论输入参数的大小如何,所需的内存空间都是固定的,因此空间复杂度为O(1)。


// O(n)的空间复杂度,线性空间复杂度
public int[] createArray(int n) {int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = i;}return arr;
}

上面的代码中,需要创建一个大小为n的整数型数组,并将数组中的元素初始化为0到n-1的值,因此需要占用n个整数型的内存空间,所以空间复杂度为O(n)


// O(n^2)的空间复杂度,平方空间复杂度
public void printAllPairs(int[] arr) {for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {System.out.println(arr[i] + ", " + arr[j]);}}
}

上面的代码中,虽然没有显式地申请额外的内存空间,但每次输出一对元素的组合时,都需要创建一个包含这两个元素的字符串对象,因此需要占用 n^2 个字符串对象的内存空间,所以空间复杂度为O(n^2)。

三、常见的案例和示例

1. 线性查找(Linear Search)

时间复杂度:O(n)
空间复杂度:O(1)

线性查找是一种简单的查找算法,从数组或列表中逐一遍历元素,直到找到目标元素或遍历完整个数组。在最坏的情况下,目标元素可能在最后一个位置,需要遍历整个数组,因此时间复杂度为O(n)。由于只需要使用常数个变量来存储当前查找的元素和一些辅助信息,所以空间复杂度为O(1)

2. 快速排序(Quick Sort)

时间复杂度:平均情况下O(logn),最坏情况下O(n^2)
空间复杂度:O(logn)

快速排序是一种常用的排序算法,通过选择一个基准元素将数组划分为两部分,然后分别对这两部分进行递归排序。在平均情况下,每次划分都将数组分为大致相等的两部分,需要进行logn次划分,因此时间复杂度为O(nlogn)。但在最坏的情况下,如果选择的基准元素总是导致数组的划分极不均匀,例如已经有序的数组,就会导致每次只能划分出一个元素和n-1个元素,需要进行n次划分,从而时间复杂度变为O(n^2)。空间复杂度取决于递归调用的深度,最坏情况下为O(n),平均情况下为O(logn)。

3.动态规划(Dynamic Programming)

时间复杂度:根据具体问题而定
空间复杂度:根据具体问题而定

动态规划是一种解决优化问题的算法,通过将问题划分为重叠子问题并使用记忆化的方式避免重复计算。动态规划的时间复杂度和空间复杂度通常取决于具体问题的特性和解决方法。例如,对于斐波那契数列问题,使用递归方式计算会导致指数级的时间复杂度和指数级的空间复杂度,但通过使用动态规划并存储中间计算结果,可以将时间复杂度优化到线性级别O(n),空间复杂度优化到O(1)。

4.图搜索(Graph Search)

时间复杂度:根据具体算法和图的规模而定
空间复杂度:根据具体算法和图的规模而定

图搜索是一类解决图相关问题的算法,例如深度优先搜索(DFS)和广度优先搜索(BFS)。其时间复杂度和空间复杂度通常取决于图的规模和具体的搜索算法。例如,在无权图中,DFS和BFS的时间复杂度通常为O(V+E),其中V表示顶点数,E表示边数。而在有权图中,涉及到权重的计算和比较,时间复杂度可能会有所不同。

5.哈希表(Hash Table)

时间复杂度:平均情况下O(1),最坏情况下O(n)
空间复杂度:O(n)

哈希表是一种用于实现查找、插入和删除等操作的数据结构,具有高效的平均查找时间。在哈希表中,通过将关键字映射到数组索引来实现快速的查找操作。在理想情况下,每个关键字都会被均匀地映射到数组中的不同位置,从而保证平均情况下的O(1)时间复杂度。但在最坏的情况下,如果所有关键字都被映射到了同一个位置,就会导致查找操作变得非常缓慢,时间复杂度变为O(n)。空间复杂度取决于哈希表中存储的元素个数,通常为O(n)。

总结

通过以上的例子,我们可以看到,时间和空间复杂度是评估算法效率的重要指标。理解算法的时间和空间复杂度有助于我们在设计和分析算法时,能够更好地选择合适的算法以满足实际需求。

【算法】时间和空间复杂度相关推荐

  1. 排序--Bubble的优化和性能(算法时间、空间复杂度、稳定性)分析

    一.算法基本思想 (1)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分:下一次继续 ...

  2. 数据结构与算法 1.算法与数据结构的关系,以及算法时间、空间复杂度的概 念及其度量方法

    文章目录 前言 一. 数据结构 1.1 概念: 1.2 数据结构分类(逻辑结构和物理结构两大类) 1.2.1 逻辑结构 1.2.2 物理结构 二. 算法 2.1 概念 2.2 算法初体验 2.3 算法 ...

  3. 数据结构与算法——时间与空间复杂度

    目录 时间复杂度 空间复杂度 时间复杂度 大O记法 执行次数=执行时间 大O记法有以下几个规则: ①用常数1取代运行时间中的所有加法常数; 如:O(5),用O(1)来表示. ②在修改后的运行次数中,只 ...

  4. 算法的时间和空间复杂度

    算法定义 算法由控制结构(顺序.分支和循环3种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果.为了便于比较同一个问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题 ...

  5. a*算法的时间复杂度_数据结构与算法系列——时间、空间复杂度

    数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...

  6. 一层循环时间复杂度_数据结构与算法系列——时间、空间复杂度

    数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...

  7. 排序算法的时间与空间复杂度分析

    时间复杂度 时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法. 计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算 ...

  8. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序

    简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...

  9. 「算法与数据结构」时间与空间复杂度

    写在前面 可能有些人会吐槽,学算法有什么用,顶多就是去面试大厂的时候能用上,大厂面试算法也只是强中筛强的一个敲门砖而已,我又不去面大厂,不用学它,真的是这样吗? 肯定不是,在计算机行业发展,不管是前端 ...

最新文章

  1. Dictionary Serializer(Dictionary 序列化)
  2. CF932G Palindrome Partition
  3. ML/DL:关于机器学习、深度学习算法模型的选择
  4. JSF请求处理过程(一) FacesServlet初始化
  5. 基于Django实现RBAC权限管理
  6. 笔记本电脑锁_武汉笔记本电脑模型打样价格
  7. SpringCloud创建Config Client配置读取
  8. 封装的ADO.NET对数据库操作经典类
  9. 全站仪坐标计算机公式,全站仪使用方法及坐标计算讲解
  10. android--------自定义控件 之 组合控件篇
  11. JS入门必备基础知识(适合小白)
  12. c语言编程输出一到十,c语言编程输出1?
  13. signature=111f58ddc27ff0fab1746b92b27414e9,DDCTF2019官方Write Up——MISC篇
  14. 微信小程序点击激活类
  15. 嗅觉AI:为减少食物浪费出点力
  16. 《论文阅读》FroDO: From Detections to 3D Objects
  17. css 中划线,原价样式
  18. 3周个人错误和知识弱点盲点{随时更新}
  19. 使用InfoSphere Guardium保护和加强Netezza数据仓库设备
  20. LaTeX:字体字号榜值对比

热门文章

  1. RP50 RP55 吉他效果器音色推荐
  2. Hbase寻址(1)
  3. 单片C语言程序设计,用C语言编程操作SPMC75系列单片 - 控制/MCU - 电子发烧友网
  4. python编程midi键盘按键_Python中捕获键盘的方式详解
  5. termios的例子
  6. 机器学习分类模型评价指标详述
  7. Hadoop分布式计算框架MapReduce
  8. 2023软考考哪个证书好?
  9. 中国SCR脱硝催化剂行业竞争现状分析与未来需求预测报告2022-2028年
  10. NFS FTP PXE