算法导论 第9章 中位数和顺序统计量

本章介绍了如何在给定集合中高效地找到第i小元素,即选择问题。讨论了寻找最小值和最大值的方法,期望为线性时间的选择算法,以及最坏情况下仍保持线性时间复杂度的选择算法。通过数组划分和中位数确定,能在最坏情况下实现线性时间复杂度的中位数计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法导论 第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小的元素:

其中:

可以证明,假设所有元素是互异的,在期望现性时间内,可以找到任一顺序统计量。

最坏情况为线性时间的选择算法

  1. 将输入的n个元素的数组划分n/5向下取整个组每组5个元素,和1组n mod 5个元素
  2. 对每一组进行插入排序,确定每组的中位数
  3. 对找到了n/5向上取整个中位数,递归调用该方法以找到中位数x
  4. 利用修改过的PARTITION(把划分的主元也作为输入参数)按中位数的中位数x进行划分,让k比划分的低区的元素多1,因此x是第k小的元素
  5. 若i=k则返回x,若i < k则在低区递归调用该方法,若i > k则在高区递归调用该方法查找第i-k小的元素

第1、2、4步需要O(n)时间,步骤3需要T(n/5向上取整),步骤5需要至多T(7n/10+6)。
可以证明整个算法在最坏情况下的运行时间是线性的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值