算法导论 第9章 中位数和顺序统计量
在一个由n个元素组成的集合中,第i个 顺序统计量 是指该集合中第i小的元素,如最小值是第1个顺序统计量。中位数 是它所属集合的中点元素,本书中都指下中位数,即i=(n+1)/2向下取整。
本章讨论 选择问题,即输出集合中第i小的元素。
最小值和最大值
若要确定一个n元素集合中的最小元素或最大元素,显然需要n-1次比较,即Θ(n)。
若要同时找到最小值和最大值,可以首先记录已知的最小值和最大值,然后对输入元素成对的相互比较,把较小的与当前最小值比较,较大的与当前最大值比较,这样总的比较次数至多是3 * (n / 2向下取整)。
期望为线性时间的选择算法
该算法以第7章快速排序算法为模型,但只处理划分的一边。首先讲集合划分为A[p…q-1]和A[q+1…r],使得A[p…q-1]中元素都小于或等于A[q],A[q+1…r]中元素都大于或等于A[q],然后计算A[p…q]的元素个数k,确定第i小的元素在哪一个集合中,并递归调用该方法直到取得第i小的元素:
其中:
可以证明,假设所有元素是互异的,在期望现性时间内,可以找到任一顺序统计量。
最坏情况为线性时间的选择算法
- 将输入的n个元素的数组划分n/5向下取整个组每组5个元素,和1组n mod 5个元素
- 对每一组进行插入排序,确定每组的中位数
- 对找到了n/5向上取整个中位数,递归调用该方法以找到中位数x
- 利用修改过的PARTITION(把划分的主元也作为输入参数)按中位数的中位数x进行划分,让k比划分的低区的元素多1,因此x是第k小的元素
- 若i=k则返回x,若i < k则在低区递归调用该方法,若i > k则在高区递归调用该方法查找第i-k小的元素
第1、2、4步需要O(n)时间,步骤3需要T(n/5向上取整),步骤5需要至多T(7n/10+6)。
可以证明整个算法在最坏情况下的运行时间是线性的。