一、 什么是算法
算法是特定问题求解步骤的描述;算法的特性如下:
1、输入项(Input):算法具有有0个或多个输入;
2、输出项(Output):算法具有有一个或多个输出;
3、有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止不会无限循环
4、确切性(Definiteness):算法的每一步骤必须有确切的定义,不会出现二义性;
5、可行性(Effectiveness):算法中的每一步都是可行的;
二、 什么是算法的时间复杂度
算法的时间复杂度就是算法运行后对时间需求量的定性描述;
三、 大O表示法
大O表示法就是用大写O()来体现算法时间复杂度的记法。推导大O阶的几个方法如下:
1、 用常数1取代运行时间中的所有加法常数
2、 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。
3、 在判断时首先关注操作数量的最高次项,如下图所示:
![c6a9d3ffed2d0c5f0591b988b39745f5.png](https://i-blog.csdnimg.cn/blog_migrate/7ce593aede6c60a396d014345098bf81.jpeg)
图来自狄泰软件学院
四、 常见的几种时间复杂度
1、 常数阶O(1)
代码中没有循环等复杂结构的,无论执行多少行,这个代码的时间复杂度就是O(1);如下图所示:
![ac958f9cc04db4e665578ad8de194782.png](https://i-blog.csdnimg.cn/blog_migrate/4cbf7f887a35842f5f27bd45f09c6f99.jpeg)
2、 线性阶O(n)
线性阶O(n)的代码段如下图所示:
![9e98ac06d1e1c8d626b97c618cffcb7f.png](https://i-blog.csdnimg.cn/blog_migrate/4b7fecdc0058f67fd02408e7e08dda3c.jpeg)
这段代码的for循环中会执行n遍,它执行消耗时间是随着n的变化而变化的,因此这类代码的时间复杂度都可以用O(n)来表示。
3、 对数阶O(logn)
对数阶O(logn) 的代码段如下图所示:
![6f0de83da74df142f7900962a2cfea42.png](https://i-blog.csdnimg.cn/blog_migrate/3d6cd1bdcc6d9dfaabddf0c9f9e6ce2d.jpeg)
图来自狄泰软件学院
从上面代码可以看出,在while循环里面执行的代码段时间复杂度为O(1),而循环里执行次数为log2^n,因此这类代码的时间复杂度为:O(logn);
4、 平方阶O(n^2)
平方阶O(n^2)的代码段如下图所示:
![711b1fd7610c1318da05812782c263dd.png](https://i-blog.csdnimg.cn/blog_migrate/5ed2bb7dd013667f4345b2ef362520e0.jpeg)
图来自狄泰软件学院
这段代码中for循环里嵌套了for循环,所以它执行的次数就是n^2; 因此这类代码的时间复杂度为:O(n^2);
5、立方阶O(n^3),K次方阶O(n^k)
立方阶O(n^3)参考第4点的平方阶O(n^2)去理解就可以,因此三层循环次数为n的代码时间复杂度为O(n^3);以此类推时间复杂度为O(n^k)的代码段就是k层循环次数为n。
五、 常见时间复杂度的比较
几种时间复杂度的执行效率的比较如下图所示:
![42b2dc76145bdd8cd94c1a9fc8df033e.png](https://i-blog.csdnimg.cn/blog_migrate/a9fcfb53f2d5b01635c8197619d09712.jpeg)
图片来自狄泰软件学院
上图是几种常见的操作数量示例及对应的大O表示法,还有各种算法时间复杂度的效率比较,也许上图的效率比较还不明确;下图给出了各种时间复杂度的效率明确比较。
![a376014a65940d2133d024a58a378c83.png](https://i-blog.csdnimg.cn/blog_migrate/4fa2d47a8cc375475b116e4bd9757ddd.jpeg)
图片来自狄泰软件学院
六、 算法的最好与最坏情况
当查找一个有n个随机数字数组中的某个数字,最好的情况就是第一个数字就是,那么算法的时间复杂度就是O(1),这是最好的情况,当这个数字是在数组的最后一个位置时,那么算法的时间复杂度就是O(n),这也是最坏的一种情况。
当算法在最坏情况下仍然能满足需求时,,可以推断算法的最好情况和平均情况都满足需求。一般没有特殊说明,我们讨论的算法时间复杂度指得是最坏的情况。
请关注“程序猿的自我修炼”,我们一起来修炼吧,成为中心目的大神!