第四章 数据结构与算法之算法基础(时间复杂度、空间复杂度、稳定性详述)

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)一般忽略:常数项这个因素,因为这个因素只决定了实现层次的优化与考虑,而和怎么解决整个问题的思想无关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随缘清风殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值