站在巨人的肩膀上
面对码农这一说法 笔者是不认可的,编程是一门艺术。编程的根本是数据结构+算法。本文主要总结一下算法复杂度相关内容
时间复杂度
常见时间复杂度函数
常见的几个时间复杂度
类型 | 意义 | 举例 |
---|---|---|
o(1) | 最低复杂度,常量值;也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变 | 哈希算法就是典型的0(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的前提下) |
o(n) | 数据量增大n,耗时也增大n | 遍历 |
o(n^2) | 对n个数排序,需要执行n*n次 | 冒泡排序 |
O(logn) | 数据增大n备时,耗时增大logn倍(logn为以2为底,数据增大256倍,耗时增加八倍) | 二分查找 |
O(nlogn) | nlogn,当数据增大256倍,耗时增大2568= 2048倍,高于线性低于平方 | 归并排序 |
对于O(2^n)和O(n!)这里不做过多描述,算法研究上涉及较小
常见算法时间复杂度
时间复杂度的计算
在我们大概了解的上面介绍的时间复杂度的一些函数的时候,具体时间复杂度怎么计算来的呢,其实我们不要想的太复杂,一般我们把算法时间复杂度,计算到最后都会归总为类似图1的那几类,或者如下图对比的几个分类。下图为我们设计的一段算法程序,执行完成需要的执行次数和输入数量n的函数,并且统一归纳为相应的阶。一般我们程序里研究到nlogn阶即可,剩下的我们都可以不考虑。
下面贴一个详细的例子来加深一下算法时间复杂度计算的一个方法:
例子如下:
我们把每一段代码的时间复杂度相加得出:
抱着平常心,不要把算法问题想的太复杂,一步一步我们都能成为合格的程序设计者。
扩展
空间复杂度顾名思义就是算法占用存储空间,确切的说就是占用运行时内存空间的一个函数表达式。通常用S(n)=O(f(n))来表示。通常有以下几个阶O(1)、O(n)、O(n²)。对于空间复杂度我们掌握一些原则即可如 常见的很多算法用空间换时间 或者说 高效率低存储等等