《数据结构与算法图解》笔记-第4章 运用大O来给代码提速

第4章 运用大O来给代码提速

4.1 冒泡排序

排序算法是计算机科学中被广泛研究的一个课题。历时多年,它发展出了数十种算法,这些算法都着眼于一个问题:如何将一个无序的数字数组整理成升序?

冒泡排序是一种很基本的排序算法,步骤如下。

  1. 指向数组中的头两个元素,比较它们的大小。
  2. 如果它们的顺序错了(即左边的值大于右边),就互换位置。如果顺序已经是正确的,那这一步就什么都不用做。
  3. 将两个指针右移一格。重复第1步和第2步,直至指针到达数组末尾。
  4. 重复第1至3步,直至从头到尾都无须再做交换,这时数组就排好序了。

说明:原书中的冒泡排序是从左向右开始比较数据大小,每一轮将未排序数据中的最大值移动到最右边已排序数据中的相应位置上,也可以从右向左开始比较数据大小,每一轮将未排序数据中的最小值移动到最左边已排序数据的相应位置上,最终效果是一样的。

4.2 冒泡排序实战

4.3 冒泡排序的实现

原书中的代码实现为Python,此处略。

4.4 冒泡排序的效率

冒泡排序的执行步骤可分为两种。

比较:比较两个数看哪个更大。

交换:交换两个数的位置以使它们按顺序排列。

先看看冒泡排序要进行多少次比较

回顾之前那个5个元素的数组,你会发现在第1次轮回我们为4对元素进行了4次比较。到了第2次轮回,则只做了3次比较。这是因为第1次轮回已经确定了最后一个格子的元素,所以不用再比较最后两个元素了。第3次轮回,只比较2次;第4次,只比较1次。

算起来就是:4 + 3 + 2 + 1=10次比较。

推广到N个元素,需要(N -1) + (N -2) + (N -3) + … + 1次比较。

分析过比较之后,再来看看交换

如果数组不只是随机打乱,而是完全反序,在这种最坏的情况下,每次比较过后都得进行一次交换。
( N − 1 ) + ( N − 2 ) + ( N − 3 ) + … + 1 = N ( N − 1 ) / 2 (N -1) + (N -2) + (N -3) + … + 1 = N(N-1)/2 (N1)+(N2)+(N3)++1=N(N1)/2
现在把两种步骤放在一起来看,

N ( N − 1 ) 2 × 2 = N ( N − 1 ) = N 2 − N \frac{N(N-1)}{2} \times 2 = N(N-1) = N^2-N 2N(N1)×2=N(N1)=N2N

由于当N很大时,多项式的首项决定一切,因此描述冒泡排序效率的大O记法,是O(N2)。

用O(N2)算法处理N个元素,大约需要N2步。O(N2)算法是比较低效的,随着数据量变多,其步数也剧增。

最后一点:O(N2)也被叫作二次时间

  1. 本节主要基于自己的理解,并没有完全按原书内容进行描述。

  2. 可以使用倒序相加法证明下面公式。
    ( N − 1 ) + ( N − 2 ) + ( N − 3 ) + … + 1 = N ( N − 1 ) / 2 (N -1) + (N -2) + (N -3) + … + 1 = N(N-1)/2 (N1)+(N2)+(N3)++1=N(N1)/2

简要证明如下:

设 Sn = 1 + 2 + 3 + … + (n - 1) (1)

倒过来一下

Sn = (n-1) + (n-2) + …… + 2 + 1 (2)

(1) + (2) 得

2Sn = n(n-1) ((n-1) 个 n 相加)

所以Sn = n(n-1)/2

4.5 二次问题

毫无疑问,嵌套循环算法的效率就是O(N2)。一旦看到嵌套循环,你就应该马上想到O(N2)。

当遇到低效的算法时,我们都应该花些时间思考下有没有更快的做法。特别是当数据量巨大的时候,优化不足的应用甚至可能会突然挂掉。尽管这可能已经是最佳方案,但你还是要确认一下。

4.6 线性解决

原书提供了一种替代嵌套循环算法的解决方案,提升了效率,但是引入了空间复杂度问题,在显示方案中是否可用需要具体问题具体分析。

4.7 总结

熟悉大O记法能使我们发现低效的代码,有助于我们挑选出更快的算法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值