《算法导论》第9章 中位数和顺序统计量 个人笔记

第9章 中位数和顺序统计量

9.1 最小值和最大值

寻找集合中的最小值or最大值,必须要做n-1次比较。
同时寻找最小值和最大值不需要2(n-1)次比较,我们将一对输入元素相互进行比较,然后把较小的与当前最小值比较,较大的与当前最大值比较,这样每2个元素共需3次比较。所以总的比较次数至多是3(n/2)。

9.2 期望为线性时间的选择算法

选择数组A[p..r]种第i小的元素:

int randomized_select(int a[], int low, int high, int i){
    if(low == hight)
        return a[low];
    q = randomized_partition(a, low, high);
    k = q - low + 1;
    if(i == k)
        return a[q];
    else{
        if(i < k)
            return randomized_select(a, low, q-1 ,i);
        else
            return randomized_select(a, q+1, low ,i-k);
    }
}

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

SELECT算法
1. 将输入数组的n个元素划分为 n/5 组,每组5个元素,且至多只有一组由剩下的n mod 5个元素组成
2. 寻找这 n/5+1 组中每一组的中位数:首先对每组元素进行插入排序,然后 确定每组有序元素的中位数
3. 对第2步中找出的 n/5+1 个中位数,递归调用SELECT以找出其中位数x(若有偶数个中位数,约定x是较小的中位数)
4. 利用修改多的PARTITION 版本,按中位数的中位数x对数组进行划分。让k比划分的低区中的元素数目多1,因此x是第k小的元素,并且有 nk 个元素在划分的高区
5. 如果 i=k ,则返回x。如果 i<k ,则在低区递归调用SELECT来找出第i小的元素。如果 i>k ,则在高区递归查找第i-k小的元素。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值