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

本文深入探讨CLRS算法中的9.2章节,解析选择算法在期望线性时间复杂度下的实现。讨论了算法在处理不同情况下的可行性,证明在划分过程中不会对长度为0的数组进行递归调用。此外,阐述了选择主元对子问题概率的独立性,以及提供了算法的伪代码和可运行代码示例。

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

9.2-1
首先,调用RANDOMIZED-SELECT时,传入的参数 i 应该是 1nn 是数组长)。在划分过程中,出现极不平衡的情况下有:
第8行调用RANDOMIZED-SELECTk=1,所以 i<ki>0,显然不可能;
在第9行调用RANDOMIZED-SELECT,此时 q=r,i>ki>qp+1=rp+1,要 i 大于数组长,也是不可能的。
综上所述,不会对长度为0的数组递归调用。

9.2-2
在一次划分中,选择主元并不影响子问题的概率。也就是说在RANDOMIZED-PARTITION中调用RANDOM产生的结果是独立于下一次的。

9.2-3
伪代码略,附上可运行代码

#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;

int RANDOMIZED_PARTITION(int *array,int p, int r)
{
    int i = rand() % (r - p + 1) + p;
    if(i != r)
    {
        int temp = array[i];
        array[i] = array[r];
        array[r] = temp;
    }
    int piovt = array[r];
    i = p - 1;
    for(int j = p; j < r; ++j)
    {
        if(array[j] <= piovt)
        {
            ++i;
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
    int temp = array[i+1];
    array[i+1] = array[r];
    array[r] = temp;
    return i + 1;
}

int RANDOMIZED_SELECT(int *array,int p,int r,int i)
{
    if(p == r)
        return array[p];
    int q = RANDOMIZED_PARTITION(array,p,r);
    int k = q - p + 1;
    if(k == i)
        return array[q];
    else if(i < k)
        return RANDOMIZED_SELECT(array,p,q-1,i);
    else return RANDOMIZED_SELECT(array,q+1,r,i-k);
}

int RANDOMIZED_SELECT_FOR_WHILE(int *array,int p,int r,int i)
{
    while(p < r)
    {
        int q = RANDOMIZED_PARTITION(array,p,r);
        int k = q - p + 1;
        if(k == i)
            return array[q];
        else if(i < k)
            r = q - 1;
        else
        {
            p = q + 1;
            i -= k;
        }
    }
    return array[p];
}

int main()
{
    int array[9] = {5,2,1,4,9,3,7,8,-1};
    cout << RANDOMIZED_SELECT_FOR_WHILE(array,0,8,9) << endl;
    return 0;
}

9.2-4
划分序列为 9,8,7,6,5,4,3,2,1,0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值