1、算法复杂度
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小。
2、时间复杂度
1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:
T(n)=O(f(n))
分析:随着模块n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高。
2. 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n)=该数量级,若T(n)/f(n)求极限可得到一常数c,则时间复杂度T(n)=O(f(n))
例:算法:
for(i=1;i<=n;++i) {
for(j=1;j<=n;++j) {
c[ i ][ j ]=0; //该步骤属于基本操作 执行次数:n的平方 次
for(k=1;k<=n;++k)
c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ]; //该步骤属于基本操作 执行次数:n的三次方 次
}
}
}
则有 T(n)= n的平方+n的三次方,根据上面括号里的同数量级,我们可以确定 n的三次方 为T(n)的同数量级 则有f(n)= n的三次方,然后根据T(n)/f(n)求极限可得到常数c 则该算法的 时间复杂度:T(n)=O(n的三次方)
3.分类
按数量级递增排列,常见的时间复杂度有: 常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk), 指数阶O(2n) 。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
3、空间复杂度
一般是指执行这个算法所需要的内存空间。 一个算法所占用的存储空间包括算法程序所占用的空间、输入的初始数据所占用的存储空间以及算法执行过程中所需要的额外空间。一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。
(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
一个算法所需的存储空间用f(n)表示。
S(n)=O(f(n))
其中n为问题的规模,S(n)表示空间复杂度。
4、说明例子
时间复杂度描述一个算法对数据规模和执行时间之间的关系。
一个算法,处理n条数据需要的时间可以用表达式:a*n+b来表示的话,称它的时间复杂度为O(n),也就是说,100条数据需要1秒的话,1000条数据需要10s。如果是用表达式:a*n*n+b*n+c的话,复杂度为O(n的平方),这样100条1秒,1000条就要100s了。0(0)表达式为a*(n的0次方)+b,也就是个常数。这样无论100还是1000条都只需1秒。
空间复杂度类似,只是描述的是规模与存储空间的关系。下面来看个O(n)和O(1)的例子:
要从0加到n,我们会这么写:
int sum = 0;
for(int i = 0; i<=n; ++i)
{
sum += i;
}
一共算了n次加法,那么就说这个时间复杂度是O(n)。当然O(n)的精确的概念是,是n的最高次方,比如,某个计算共计算了3n + 2次,那么这个时间复杂度也是O(n),因为3n + 2中的最高次方是n。分析如下代码:
int sum = 0;
for(int i = 0; i<=n; ++i)
{
for(int j = 0; j <=n; ++j)
{
sum += (i + j);
}
}
很显然一共算了n^2次加法,那么就说这个时间复杂度是O(n^2),和上面类似,如果某个算法计算了3*n^2 + n + 1次,其时间复杂度仍然是O(n^2),因为3*n^2 + n + 1中最高的次方是n^2
所谓O(1)就是计算的次数是个常量,我们还以上面从0加到n的例子来说,如果我们用等差数列的公式,那么,代码可以这么写:
int sum = n * (n + 1) / 2
不管n有多大(当然不能溢出了),通过上面的公式只需计算一次,也就说计算的次数是不变的,这种情况的时间复杂度就可以说成O(1)。 再比如如果某个计算,不管其他条件怎么变化,均只需计算5次即可得出结果,那么这种情况的时间复杂度,也是O(1)。
5、复杂度判定
要在 hash 表中找到一个元素就是 O(1)
要在无序数组中找到一个元素就是 O(n)
访问数组的第 n 个元素是 O(1)
访问链表的第 n 个元素是 O(n)
简单的判断方法:
如果实现中没有循环就是 O(1)
如果实现中有一个循环就是 O(n)
注:f(n)相当于一个基本的计算单元如:f(n)=ax+2,它是一个线性函数。基于线性函数才能计算时间复杂度。
分享到:
相关推荐
简单来说,时间复杂度指的是语句执行次数,空间复杂度指的是算法所占的存储空间 计算时间复杂度的方法: 用常数1代替运行时间中的所有加法常数 修改后的运行次数函数中,只保留最高阶项 去除最高阶项的系数 时间...
### 算法复杂度详解:时间复杂度与空间复杂度 #### 一、时间复杂度 **1. 时间频度** 在讨论算法效率时,我们通常关注算法执行所耗费的时间。理论上直接计算出算法的确切执行时间是不可行的,这需要具体的硬件...
以下是对选择排序、冒泡排序、归并排序、快速排序和插入排序这五种常见排序算法的详细介绍,以及如何分析它们的时间复杂度。 1. **选择排序(Selection Sort)** - 原理:选择排序是一种简单直观的排序算法,它...
在计算机科学中,时间空间复杂度是衡量算法效率的重要指标,它们描述了程序执行时所需的内存资源和处理时间。这两个概念对于优化代码性能、设计高效算法以及理解系统资源利用至关重要。 时间复杂度分析关注的是算法...
在实际应用中,渐进时间复杂度通常用来描述算法的时间复杂度,并简化表示为`O(f(n))`形式。常见的渐进时间复杂度包括: - 常数阶`O(1)` - 对数阶`O(log_2n)` - 线性阶`O(n)` - 线性对数阶`O(nlog_2n)` - 平方阶`O(n...
然而,递归算法在提供简洁性和直观性的同时,也往往伴随着较高的时间和空间复杂度,尤其是当递归层数较深时,这种复杂度的增加可能会变得不可忽视。 ### 时间复杂度的概念 时间复杂度是衡量算法效率的重要指标之一...
5. 平方时间复杂度O(n^2):冒泡排序、选择排序等简单排序算法的时间复杂度。 6. 高次幂时间复杂度如O(n^3),O(n^4)等:在处理大规模数据时,这些复杂度通常不可接受。 7. 指数时间复杂度O(2^n):这类算法在输入规模...
- 时间复杂度只是衡量算法性能的一个方面,还需要考虑空间复杂度、硬件条件等其他因素。 #### 五、结论 在选择和比较不同算法时,时间复杂度是一项重要的参考指标。一般来说,我们应该优先选择时间复杂度较低的...
- 空间复杂度则描述了算法执行期间所需的额外存储空间,如O(1)、O(log2N)、O(N)等。 在实际应用中,根据数据规模、稳定性需求以及可用内存等因素,会选择不同的排序算法。例如,对于小规模数据,插入排序可能是首选...
1. 大O符号(Big-Oh)表示法:大O符号是用来描述算法运行时间或空间需求的渐进上界。在这些程序片段中,我们使用大O符号来表示每个循环结构的时间复杂度。 - (1) O(N):一个简单的for循环,随着N的增加,执行次数与...
时间复杂度是分析算法效率的一种方式,它描述了算法执行时间与输入数据量之间的关系。本主题将深入探讨选择排序、冒泡排序和递归排序这三种常见排序方法的时间复杂度,帮助我们理解它们的优劣。 1. **选择排序**: ...
### 时间序列的复杂度和熵 #### 6.1 引言 在现代科学与工程领域,特别是非线性动力学、混沌理论以及数据分析中,时间序列的复杂度和熵成为了重要的研究对象。它们不仅有助于理解系统内部的运作机制,还能帮助识别...
3. **代码可读性和维护性**:合理控制空间复杂度有助于编写更加简洁、易于理解和维护的代码。 ### 知识点四:空间复杂度分析方法 1. **直接法**:通过观察算法中的每一行代码,计算每一步所需的空间,然后求和得到...
本文将围绕标题"【考研或自学数据结构1.2】"和描述中的"算法基本概念,时间复杂度和空间复杂度"展开,结合压缩包内的文件内容进行详细阐述。 首先,我们来探讨算法的基本概念。在计算机科学中,算法是一系列解决...
具体的时间复杂度可以通过分析不同子树大小下的子树数量来计算,如上述描述所示,最终的时间复杂度并不是简单的 `O(n^2)`,而是更复杂的多项式时间复杂度。 通过动态规划的方法,我们可以构建一个最优的二叉查找树...
常用的大O表示法用于描述算法的最坏情况下的时间复杂度。 - **常见的时间复杂度**: - O(1):常数时间复杂度,执行时间不受输入数据规模的影响。 - O(logn):对数时间复杂度,常见于二分查找等算法。 - O(n):...
这通常涉及到算法的时间复杂度和空间复杂度,这两个概念是衡量算法效率的重要指标。 时间复杂度描述了算法运行所需的基本操作次数与输入数据规模的关系。它帮助我们预测算法在大规模数据上的性能。通常用大O符号...
时间复杂度描述了算法运行所需的时间与输入规模的关系,而空间复杂度则关注算法执行过程中内存的使用情况。例如,“SimpelSort”可能是对简单排序算法的引用,如冒泡排序或选择排序,它们的时间复杂度一般为O(n^2),...
总而言之,理解并掌握时间复杂度和空间复杂度的概念,对于编写高效、优雅的Python代码至关重要。在算法设计过程中,应该尽量选择复杂度低的算法,以提升程序的性能。同时,合理使用数据结构,可以降低算法的复杂度,...