算法导论9-1

读书笔记

本小节介绍了两点:

  1. 如何找到数组中的最大值和最小值?
  2. 如何同时找到数组中的最大值和最小值?

找到最小值

最小值和最大值的方法是一致,从数组中取出一个值,然后和其他的\(n-1\)个值相比较,不断更新最大值/最小值,经过\(n-1\)次比较,可以获得最大值/最小值。

同时找到最大值和最小值

如果没有同时这个条件的话,可以独立地求出这两个值,总计需要\(2n-2\)次比较。

但是有一种更优的方法来同时获得最大值和最小值。

  1. 从待比较数组中选取两个元素\(a,b\);
  2. 然后这两个元素进行比较,选出较大值和较小值;
  3. 然后较大值和当前最大值比较获得新的最大值,较小值和当前较小值比较获得新的最小值;

一次循环中比较了\(3\)次,一共有\(\lfloor n/2 \rfloor\)次循环,所以一共比较了\(3\lfloor n/2 \rfloor\)次。

如何选取初始的最大值和最小值?

如果元素个数为奇数,初始最大值和最小值为数组的第一个元素;

如果元素个数为偶数,先对数组的前两个元素进行比较,然后较小值作为初始最小值,较大值作为初始最大值;

课后习题

9.1-1

证明:在最坏情况下,找到\(n\)个元素中第二小的元素需要\(n+\lceil \lg{n} \rceil -2\)次比较。(提示:可以同时找最小元素。)

思路请参考这里

代码请参考这里

9.1-2

证明:在最坏情况下,同时找到\(n\)个元素中最大值和最小值的比较次数是\(\lceil 3n/2 \rceil -2\)。(提示:考虑有多少个数有成为最大值或最小值的潜在可能,然后分析一下每一次比较会如何影响这些计数。)

posted @ 2021-01-15 11:05  ijkzen  阅读(204)  评论(0编辑  收藏  举报