关于算法复杂度的理解

前言

一般我们谈到算法题,都会涉及到复杂度,如时间复杂度、空间复杂度。
下面,我们具体讲讲复杂度是怎么表示的

分析

要解释复杂度的概念,我们拿最常见的冒泡排序来讲解一下:

假如有一组数组 [4,3,2,1]
冒泡排序的思路是两两比较大小,看是否需要换位置,因此上面的数组需要进行如下对比:
(4,3),(4,2),(4,1),(3,2),(3,1),(2,1),看出来了吗,其实就是我们学数学时的排列组合,上面这个就是C3(2),结果是: 3*(3-1)/2=6
所以冒泡排序的复杂度为:n*(n-1)/2
当然这是指最坏的情况,那么这个时候这个时间复杂度要如何表示呢?
我们可以想象,当n趋于无穷大时可忽略常数,所以-1,/2可忽略,所以冒泡排序最坏的时间复杂度可以表现为:O(n^2)

OK,我们再来一个数组,当数组为: [3,1,2,4]时,其实当对比了(3,1),(3,2)时,数组就已经变成了[1,3,2,4],[1,2,3,4],此时我们已经没有对比的必要了,因为后面的对比并不会产生位置交换,因此只需要两次对比
那当我们要排序的数组是[1,2,3,4]时,其实只需要一次循环就已经知道完成排序了,此时复杂度为:n-1,忽略常数后,最终表现的时间复杂度则为O(n),这个是最好的情况

扩展

上面我们理解了冒泡排序的时间复杂度是:
最坏时间复杂度:O(n^2)
最好时间复杂度:O(n)

那么,平均时间复杂度是什么呢?答案是:O(n^2)

要怎么理解呢?这其中分析的时候要结合概率论的知识,会涉及到很多数学推理与计算,所以我们采用另外一种"有序度" 和“逆序度” 来分析。

还是用我们上面的那个数组来分析: [3,1,2,4]
这个数组中(3,4),(1,2),(1,4),(2,4)是有序的,所以这个数组的有序度为4。

满有序度则是当这个数组是一个完全有序的数组时,例如[1,2,3,4]
此时的满有序度为n*(n-1)/2,所以上面的例子满有序度为6

逆序度 = 满有序对 - 有序对

所以上面的数组的逆有序度为2

那么逆有序度代表什么呢?其实就是代表你需要位置交换的次数

对于包含 n 个数据的数组进行冒泡排序,平均交换次数是多少呢?
最坏情况下,初始状态的有序度是 0,所以要进行 n*(n-1)/2 次交换。
最好情况下,初始状态的有序度是 n*(n-1)/2,就不需要进行交换。
我们可以取个中间值 n*(n-1)/4,来表示初始有序度既不是很高也不是很低的平均情况。

换句话说,平均情况下,需要 n*(n-1)/4 次交换操作,而对比操作肯定要比交换操作多,复杂度的上限又是 O(n^2),所以平均情况下的时间复杂度就是 O(n^2)。即

冒泡排序的平均时间复杂度:O(n^2)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值