《算法分析与设计》作业6----选第k小元素(特定分治策略)

目录

1.问题

2.解析

3.设计

4.分析

5.源码


1.问题

选择问题:

设L是n个元素的集合,从L中选取第k小的元素,其中1<=k<=n。

这里第k小的元素是指,当L按从小到大排好序之后,排在第k个位置的元素。

利用特定分治策略选出第k小的元素。

2.解析

3.设计

void select(vector<int>s,int n,int k){
    把s划分成最多5个一组,共n/5组(向上取整)
    把每组的中位数放到集合m
    找出中位数的中位数m*    //用于把s划分成ABCD四部分
    把AD中的每个元素与m*比较大小,小的构成s1,大的构成s2
    s1=s1并C,s2=s2并B    //m*不存入s1或s2,直接丢弃
    if k==s1.size
        输出m*
        return
    else if k<=s1.size
        select(s1,s1.size,k)
    else 
        select(s2,s2.size,k-s1.size-1)
}

4.分析

假设k是5的倍数,且n/5是奇数,即n/5=2r+1,于是

如果A和D的元素都小于m*,那么它们的元素都加入s1,且下一步算法又在这个大的子问题上进行递归调用,这对应了归约后子问题规模的上界,是算法复杂度的最坏情况

子问题规模为:

表明子问题规模不超过原问题规模的7/10

所以

其中,为查找m*的时间,总规模n中选出n/5个数来找中位数

tn是构造中位数集合,以及AD和m*进行比较的时间开销,t是某个常数

5.源码

GitHub地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值