1、时间复杂度
(1)常数时间操作:一个操作的时间不以样本的数据量为转移,每次都是固定时间。
-
发生场景:常见的算术运算、位运算、赋值、比较、自增、自减操作、数组寻址操作。
-
常数时间操作示例:数组结构按位(索引)查找元素
查找数组的第n个元素:
(1)计算实际内存地址:通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算。
(2)根据内存地址直接取出元素。
- 非常数时间操作实例:链表结构按位查找元素
查找链表的第n个元素:
(1)先找到头节点
(2)循环遍历往后,直到找到第n个节点返回
(2)时间复杂度
-
算法所需时间:常数时间操作次数
-
示例**:重复遍历要排序的数列,一次比较俩个元素,顺序错误则交换位置**,即冒泡排序
算法步骤:
Ⅰ、首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换。
Ⅱ、接着从剩下的n-1个数据中选择次小的1个元素,将其和第2个位置的数据交换
Ⅲ、然后,这样不断重复,直到最后两个数据完成交换。最后,便完成了对原始数组的从小到大的排序。
题目:选择排序 | 8,7,5,9,0 | 时间复杂度 |
---|---|---|
第一步 | 遍历1到n的数据,找到最小值0,0的位置和第一个值的位置进行交换 | 遍历时间复杂度:5,比较时间复杂度:5,交换时间复杂度:1 |
第二步 | 遍历2到n的数据,找到最小值5,5的位置和第二个值的位置进行交换 | 遍历时间复杂度:4,比较时间复杂度:4,交换时间复杂度:1 |
第三步 | 遍历3到n的数据,找到最小值7,7的位置和第三个值的位置进行交换 | 遍历时间复杂度:3,比较时间复杂度:3,交换时间复杂度:1 |
第四步 | 遍历4到n的数据,找到最小值8,8的位置和第四个值的位置进行交换 | 遍历时间复杂度:2,比较时间复杂度:2,交换时间复杂度:1 |
总结公式 | 2aN的平方+bN+C | |
时间复杂度 | O(n的平方),不关注低阶项,不关注系数 |
- 时间复杂度: O(忽略掉系数的高阶项),即常数时间操作次数的表达式,只要把最高阶项留下,低阶项都去掉,高阶项的系数也去掉。
2、空间复杂度
- 算法存储空间:一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。
- 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度,即变量的个数,主要通过函数在运行时候显式申请的额外空间来确定。
范例:同样参考上述的选择排序
题目:选择排序 | 8,7,5,9,0 | 空间复杂度 |
---|---|---|
第一步 | 遍历1到n的数据,找到最小值0,0的位置和第一个值的位置进行交换 | 临时变量存储0,wsap(8,0),现在顺序0,7,5,9,8 |
第二步 | 遍历2到n的数据,找到最小值5,5的位置和第二个值的位置进行交换 | 临时变量存储5,swap(7,5),现在顺序0,5,7,9,8 |
第三步 | 遍历3到n的数据,找到最小值7,7的位置和第三个值的位置进行交换 | 不用临时变量,现在顺序0,5,7,9,8 |
第四步 | 遍历4到n的数据,找到最小值8,8的位置和第四个值的位置进行交换 | 临时变量存储8,swap(9,8),现在顺序0,5,7,8,9 |
临时变量个数 | 用了n-2个临时变量,即O(n-2) | |
空间复杂度 | 平均O(1),所有的临时变量都通过一个临时变量的空间创建 |
- 空间复杂度:
最好,不交换,不用临时变量,O(0)
最坏,每次交换,用n-1个临时变量,O(n)
平均,O(1)
3、算法稳定性分析
- 判断一个排序算法的稳定性:判断两个相同元素在进行排序之后相对位置是否会发生改变。
- 范例:
题目:选择排序 | 8,7,5,9,0 | 稳定性 |
---|---|---|
第一步 | 遍历1到n的数据,找到最小值0,0的位置和第一个值的位置进行交换 | 涉及到数据交换,wsap(8,0),本次不稳定 |
第二步 | 遍历2到n的数据,找到最小值5,5的位置和第二个值的位置进行交换 | 涉及到数据交换,swap(7,5),本次不稳定 |
第三步 | 遍历3到n的数据,找到最小值7,7的位置和第三个值的位置进行交换 | 不涉及到数据交换,所以稳定 |
第四步 | 遍历4到n的数据,找到最小值8,8的位置和第四个值的位置进行交换 | 涉及到数据交换,swap(9,8),本次不稳定 |
数据交换次数 | 每次计算都可能涉及到交换 | |
稳定性分析 | 不稳定 |
- 选择排序每次计算都可能会涉及到数据的交换,所以不稳定。
4、问题最优解的指标
(1)最优先满足:时间复杂度最低
(2)其次满足:使用最小的空间算法流程
(3)一般忽略:常数项这个因素,因为这个因素只决定了实现层次的优化与考虑,而和怎么解决整个问题的思想无关。