时间复杂度与空间复杂度
- 在进行一个算法的设计的时候,对它的算法复杂性的分析也是必不可少的,而算法复杂性呢,就是算法运行锁需要的计算机资源的量,它有两种表现形式,需要时间资源的量称为时间复杂度,而需要空间资源的量呢则称为空间复杂度。
- 时间复杂度的分析
-
一个算法的时间复杂度,与算法的规模n、该算法中执行某种语句所消耗的时间及其执行次数是有关系的,当然了,同一时间复杂度的算法在不同的计算机上的表现是不一样的,时间复杂度不与硬件设备相关联。
-
一个算法,它就是由我们用代码语句来表示的,而算法的执行效率、它执行的时间长短,就是由各个语句的执行次数所决定的,所以,我们在分析算法的时间复杂度的时候,其实就是分析该算法中各语句所消耗时间的量级与它所执行的次数。
- 比如,在进行查找一个长度为n的链表的时候,我们的时间复杂度就是它平均每次查找所执行的代码的次数,由于链表每次查找都需要将其遍历,直到找到该元素为止,那么他的平均查找次数则为n/2,所以它的时间复杂度是O(n)。
- 而如果在一个数组中的某个位置插入元素,由于数组是一片连续的内存空间,我们可以直接获取该位置的地址,而不需要遍历查找,当在其位置进行插入操作时,其后面的每个元素都需要移动一个位置,所以,每次插入操作平均会进行n/2个元素的移动操作,所以它的时间复杂度仍然是O(n)。
- 需要注意的是,如果实现同一功能的算法一个是查找元素的O(n),一个是移动元素的O(n),那么使用查找元素的算法则更有效率,因为移动一个元素所做的开销远比遍历查找下一个元素的开销要大得多。
- 空间复杂度的分析
- 一个算法的空间复杂度,说的是规模为n级的这个算法在存储空间中所消耗的内存大小,比如一个算法需要声明一个n长度的数组,那么它的空间复杂度就是O(n),而在递归调用中,它的空间复杂度就是每次递归调用所需要的辅助空间*递归次数。
- 一般情况下,我们主要是考虑算法的时间复杂度