目录
什么是复杂度
算法复杂度的分类
时间复杂度(Time Complexity):
空间复杂度(Space Complexity):
度量程序执行时间的方法
事后统计法
事前分析估算的方法
时间复杂度
(1)时间频度
(2)时间复杂度
大O符号表示法
参考文章
时间复杂度和空间复杂度(超详细)-CSDN博客
什么是复杂度
算法的复杂度是指算法在执行过程中随着输入数据规模增长,其所需计算资源(如时间、空间等)的增长趋势。它通常用来衡量算法的效率,特别是在处理大规模数据时。
算法复杂度的分类
算法复杂度可以分为两大类:时间复杂度和空间复杂度。
-
时间复杂度(Time Complexity):
- 时间复杂度描述了算法执行时间随输入数据规模增长的变化情况。它通常用大O符号(O)表示,例如O(n)、O(n^2)、O(log n)等。
- 时间复杂度关注的是算法执行的操作次数,如比较、交换、计算等,以及这些操作如何随着输入数据规模的增加而增加。
- 例如,一个简单的线性搜索算法的时间复杂度是O(n),因为它需要遍历整个列表来查找一个元素;而快速排序算法的平均时间复杂度是O(n log n)。
-
空间复杂度(Space Complexity):
- 空间复杂度描述了算法执行过程中所需存储空间随输入数据规模增长的变化情况。
- 它关注的是算法在执行过程中需要多少额外的存储空间,包括变量、数据结构以及中间结果等。
- 例如,一个简单的数组复制操作的空间复杂度是O(n),因为它需要一个与原数组同样大小的新数组来存储复制的数据。
算法复杂度的分析有助于我们:
- 估计算法在实际应用中的性能。
- 比较不同算法的效率。
- 优化算法以提高性能。
- 在设计算法时做出合理的选择。
在实际应用中,我们通常希望算法的时间复杂度和空间复杂度都尽可能低,但这两者之间往往存在权衡。有时,为了提高时间效率,可能需要牺牲一定的空间效率,反之亦然。因此,在设计和选择算法时,需要根据具体的应用场景和资源限制来平衡这两者。
度量程序执行时间的方法
事后统计法
这种方法可行,但不是一个好的方法。该方法有两个缺陷:一是要想对设计的算法的运行性能进行评测,必须先依据算法编制相应的程序并实际运行;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优势。
事前分析估算的方法
因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用事前分析估算的方法。
在编写程序前,依据统计方法对算法进行估算。一个程序在计算机上运行时所消耗的时间取决于下列因素:
(1) 算法采用的策略、方法;(2).编译产生的代码质量;(3) 问题的输入规模;(4)机器执行指令的速度。
时间复杂度
(1)时间频度
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
(2)时间复杂度
在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
大O符号表示法
大O符号表示法(Big O notation)是一种数学符号,用于描述算法或函数的时间复杂度或空间复杂度,特别是在计算机科学中。它提供了一个函数增长速率的上界估计,用于分析算法的效率。大O符号表示法关注的是当输入数据规模趋向于无穷大时,函数的增长率趋势。
大O符号通常用于描述算法的时间复杂度,也可以描述空间复杂度。以下是一些常见的大O符号表示法及其含义:
-
O(1):常数时间复杂度。算法的执行时间不随输入数据规模的变化而变化。
-
O(log n):对数时间复杂度。算法的执行时间随着输入数据规模的增加而缓慢增长,常见于二分查找等算法。
-
O(n):线性时间复杂度。算法的执行时间与输入数据规模成正比,例如顺序搜索。
-
O(n log n):线性对数时间复杂度。算法的执行时间是输入数据规模的线性对数函数,例如快速排序。
-
O(n^2):二次时间复杂度。算法的执行时间与输入数据规模的平方成正比,例如冒泡排序。
-
O(n^k):多项式时间复杂度。算法的执行时间与输入数据规模的k次方成正比。
-
O(2^n):指数时间复杂度。算法的执行时间随着输入数据规模的指数增长而增长,例如简单的暴力搜索。
-
O(n!):阶乘时间复杂度。算法的执行时间与输入数据规模的阶乘成正比,这种复杂度的算法在实际应用中通常不可行。
大O符号表示法的主要用途是提供一个算法性能的理论上限,帮助开发者理解不同算法在最坏情况下的性能。它不提供具体的执行时间,也不考虑常数因子和低阶项,因为这些在大O符号中被认为是次要的,尤其是在输入数据规模非常大时。