文章目录
- 前言
- 一、时间复杂度
- 二、空间复杂度
- 总结
前言
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间
一、时间复杂度
定义:算法的时间复杂度是一个函数。算法中的基本操作的执行次数,为算法的时间复杂度。
主要是使用的是大O的渐进表示法
大O符号:是用于描述函数渐进行为的数学符号
推导大O阶方法:
1.用常数1取代运行时间中的所有加法常数
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。得到的结果就是大O阶
讲的再多还是要实践,来看几道题目吧!
首先要明白一点大O阶表示方法并不是精确到每一步的运行,而是他的大概,这是最重要的,在我自己的学习中,我常常就会钻牛角尖,从而算出很大的问题。
首先看它第一个是循环2*N次,第二个循环10次,其余的一些像声明并初始化变量就可以省略掉,所以说它的基本操作执行了2N+10,根据大O阶方法,最后得出的结果是O(N)。
这个就更加简单了,分别进行了两次循环,答案就是O(M+N)。
大家不要看循环了100次就觉得答案是O(100),这是错误的!!!
注意大O阶方法的第一条用常数1取代运行时间中的所有加法常数,正确答案也就是O(1),哪怕他循环100000,他的时间复杂度依旧是O(1)。
来看这一题,是不是第一眼看上去就一脸懵,确实,这道题首先要知道这个函数strchr是干什么的?他是用来查找字符串str中首次出现字符character的位置。那怎么找呢,最好的情况肯定是一下子就找到了,最坏的情况的是找遍整个字符串才能找到,平均情况的话就是差不多strlen(str)/2喽。但是我们一般性在生活中做很多事情肯定都是做最坏的打算,才能有一个好的结果,因此在这也是一样的,我们在实际中一般关注的是算法的最坏运行情况。也就是最坏要找N次才能找到,因此答案就是O(N)。
这道题首先要看清代码,并不是简单的嵌套循环,里面的循环次数随着外层改变,也就是他内部的基本执行次数是N+N-1+N-2......3+2+1,这相等于一个等差数列,(不得不承认在这里数学太重要了,本人数学不好,再这里可是吃了大亏)等差数列的和的公式是(首项+末项)*项数/2,=,因此最后的结果为(N+1)*N/2-->O(N^2)。
这是一个二分查找的代码,因此他的执行次数为每次都为N/2/2/2/2/2.....,所以x=logN->O(logN)。
时间复杂度计算中log2N可以简写成logN,有些地方还会写成lgN,但是我们不建议,容易和数学中混淆。
因为执行基本操作递归了N次,时间复杂度为O(N)。
二、空间复杂度
定义:是对一个算法在运行过程中临时占用存储空间大小的量度,也使用大O渐进表示法。
其中要注意的是函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显示申请的额外空间来确定。
老样子,实践出真知
在代码中看出创造了3个变量,他是一个常量,因此为O(1)。
其中重点在于他开辟了n+1个空间,其余的可以忽略,不会对结果造成大的影响,因为答案为O(N)。
这道题他进行了N次的递归,因此开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N) 。
总结
时间复杂度:算法的时间复杂度是一个函数。算法中的基本操作的执行次数,为算法的时间复杂度。
空间复杂度:是对一个算法在运行过程中临时占用存储空间大小的量度。
推导大O阶方法:
1.用常数1取代运行时间中的所有加法常数
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。得到的结果就是大O阶