算法基础概念
一、概念
1、算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制
2、时间复杂度(Time Complexity)
(1)时间频度(语句频度)
一个算法中,语句执行的次数,称为时间频度或语句频度。记为T(n),其中n为问题规模,T(n) 随n的变化而变化。
(2)时间复杂度
为了描述时间频度T(n)随问题规模n的变化规律,引入了时间复杂度。记为T(n)=O(f(n)),O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。f(n)为T(n)的同数量级函数。
同数量级函数f(n):若存在某个辅助函数f(n),在n趋于无穷大时,使得T(n)/f(n)的极限值为不等于0的常数,则称f(n)为T(n)的同数量级函数。
3、空间复杂度(Space Complexity)
(1)存储空间
一个算法在运行过程中占用存储空间大小的量度,称为算法存储空间。记为S(n),其中n为问题规模,S(n)随n的变化而变化。
算法存储空间分为三部分:算法本身、输入输出、运行时临时占用。
一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地"进行的,是节省存储的算法,有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况。
(2)空间复杂度
为了描述存储空间S(n)随问题规模n的变化规律,引入了空间复杂度。记为S(n)=O(f(n)),O(f(n)) 为算法的渐进空间复杂度,简称空间复杂度。f(n)为S(n)的同数量级函数,f(n)描述了语句关于n所占存储空间的函数。
4、 Landau符号(O)
Landau符号的作用在于用简单的函数来描述复杂函数行为,给出一个上或下(确)界。在计算算法复杂度时一般用O符号表示。
二、时间复杂度计算例子
1、常见的时间复杂度
注意:经常将log2n(以2为底的对数)简写成logn
2、时间复杂度之间的关系图
3、所消耗的时间从小到大
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
4、计算例子
分析:时间复杂度:O(1)
只会执行三次语句,所以时间复杂度为常数复杂度O(1)
分析:
(1)n为多少就执行多少次语句,n跟语句执行次数是一个线性关系,所以为O(n)
(2)问题规模n和语句执行次数为n^2次关系,所以时间复杂度为O(n^2)
分析:方法一时间复杂度为O(n),因为他需要执行n次语句
方法二时间复杂度为O(1),因为他只需要执行一次语句
答案:
(1)O(n)、O(n)、O(n),因为都要全部遍历一次,所以需要执行n次
(2)O(n),同(1)
(3)O(n),同(1)不管是深度还是广度,它访问的节点只会访问一次
(4)O(logn)
三、空间复杂度计算例子
(1)如果是数组,那么数组的长度就是空间复杂度
(2)如果是递归,那么递归的最深度就是空间复杂度
(3)既有数组又有递归,则取两者最大的值就是空间复杂度
三、心得
没学习算法之前,对算法的概念比较模糊,对其在代码的应用更多的是疑惑,学习了算法的基础后,开始有了自己的理解,在自己写代码是,也开始会注意代码的时间和空间复杂度,这对自己来说感觉像是开多了一扇窗,对程序员的理解也多了一层感悟。
参考:
概念
[1]: https://baike.baidu.com/item/%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E6%80%A7/5930669?fromtitle=%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6&fromid=1894057&fr=aladdin
[2]: https://baike.baidu.com/item/%E7%A9%BA%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6/9664257?fr=aladdin
[3]: https://blog.csdn.net/zolalad/article/details/11848739
计算
[4]: https://blog.csdn.net/xlengji/article/details/82142758
[5]: https://www.zhihu.com/question/21387264
[6]: https://zh.wikipedia.org/wiki/%E4%B8%BB%E5%AE%9A%E7%90%86
[7]: https://en.wikipedia.org/wiki/Master_theorem_(analysis_of_algorithms)
[8]: https://blog.csdn.net/xlengji/article/details/82142758