选择问题:线性时间内找到序列的第k小的元素

简介:

  选择问题——在序列中按顺序找到某个元素。这可以用排序方法做到,即先排个序,在找到指定元素,但是这样就按最快的堆排序、合并排序啥的都得是O(nlgn)数量级的,这里采取的方法可以在期望为O(n)的时间内完成。

具体的做法如同快速排序,因为快速排序最好情况时间也为O(nlogn),但是在实际情况下,遇到的代拍序列并不是最好的。因此,一种改进的方式是快速排序的随机化版本。利用随机化方式应用到该选择问题中,可以是程序期望在在线性时间内完成。

具体的实现方式如下

复制代码
int Select(int *A, int begin, int end, int i)
{
        if(begin == end) //如果首尾相同,i一定等于首尾,直接返回指的那个元素即可
        {
            return A[begin];
        }
        int token = RandomizedPartition(A, begin, end), dis;
        dis = token - begin; 
        if(dis == i)
        {
            return A[i];
        }
        else if(dis > i)
        {
            Select(A, begin, token-1, i);
        }
        else
        {
            Select(A, token+1, end, i-dis-1);
        }
}
复制代码

这里RandomizedPartition()函数返回划分的位置,但是,并不是想随机快速排序一样划分的两个部分都递归调用自身,而是根据具体情况调用一部分。先把RandomizedPartition()写到下面:

View Code

为了便于理解,下面举个具体的例子,看看程序怎么执行。

 

 



本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/archive/2013/03/05/2945236.html,如需转载请自行联系原作者

相关文章
|
7月前
|
机器人
【Leetcode -657.机器人能否返回原点 -674.最长连续递增序列】
【Leetcode -657.机器人能否返回原点 -674.最长连续递增序列】
20 0
|
24天前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
4月前
|
算法 测试技术 C#
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
|
5月前
|
算法 测试技术 C#
C++单调向量算法:得到山形数组的最少删除次数
C++单调向量算法:得到山形数组的最少删除次数
|
5月前
|
算法 测试技术 C#
C++算法: 最大化数组末位元素的最少操作次数
C++算法: 最大化数组末位元素的最少操作次数
|
5月前
|
算法 测试技术 C++
C++二分算法:找到最接近目标值的函数值(一)
C++二分算法:找到最接近目标值的函数值
|
5月前
|
算法 C# C++
C++二分算法:找到最接近目标值的函数值(二)
C++二分算法:找到最接近目标值的函数值
|
10月前
1240:查找最接近的元素 2020-12-27
1240:查找最接近的元素 2020-12-27
|
11月前
m 序列(最长线性反馈移位寄存器序列)详解
m 序列(最长线性反馈移位寄存器序列)详解
254 0
|
11月前
|
算法
算法|寻找不规律栈中最小元素
算法|寻找不规律栈中最小元素
54 0