【算法导论】9.中位数和顺序统计量

在一个由n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。一个中位数是它所属集合的“中点元素”。中位数总是出现在上中位数处和下中位数处,本书中所用的“中位数”都是指下中位数。

本章讨论的问题是,从一个由n个互异的元素构成的集合中选择第i个顺序统计量的问题,假设集合中的元素都是互异的。问题可被形式化定义为:

输入:一个包含n个(互异的)数的集合A和一个整数i,1<=i<=n.

输出:元素x属于A,且A中恰好有i-1个其它元素小于它。(即在增序情况说下,x为第i 个元素)。


9.1最小值和最大值

对于确定单个最小值(最大值)的问题,能得到的下界就是n-1次比较,即需要遍历整个数组进行比较。

Minimum(A)
{
    min=A[1];
    for i=2 to A.length
        if min>A[i]
            min=A[i];
    return min
}

同时找最小值和最大值,如果分别独立地找出最小值和最大值,需要共2n-2次比较。

采用另一种方法:记录已知的最小值和最大值(上面的做法是用每一个输入元素与当前的最小值和最大值进行比较,这样每个输入值都需要比较两次),对输入元素进行成对处理。先将一对输入元素相互进行比较,然后把较小的与当前最小值比较,把较大的与当前最大值进行比较,这样每两个元素需要3次比较。此时的比较次数为3\left\lfloor n/2 \right\rfloor,可以同时找到最小值和最大值。

设定已知的最小值和最大值的初始值依赖于n是奇数还是偶数。当n是奇数时,最大值和最小值的初始值都设为第一个元素的值,然后成对的处理剩下的元素。如果n是偶数,就对前两个元素做一次比较,决定最大值和最小值的初值,然后成对的处理剩下的元素。


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

解决选择问题的分治算法,期望运行时间为\Theta(n)。

Randomized-Select(A, p, r, i)//返回数组A[p..r]中第i小的元素
{
    if p==r//此时A中只包括一个元素,直接返回
        return A[p];
    q=Randomized-Partition(A, p, r);
    k=q-p+1;
    if i==k//检查A[q]是否是第i小的元素
        return A[q];//如果是的话,就返回A[q]
    else if i

Randomized-Select的最坏情况运行时间为\Theta(n^2),因为在每次划分时可能总是按余下的元素中最大的来进行划分,划分操作需要\Theta(n)时间。同时,该算法有线性期望运行时间,因为它是随机化的,所以不存在一个特定会导致其最坏情况发生的输入数据。


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

一个最坏时间为O(n)的选择算法。像Randomized-Select一样,Select算法通过对输入数组的递归划分来找出所需元素。但是在该算法中能够保证得到对数组的一个好的划分。通过执行下列步骤,算法select可以确定一个有n>1个不同元素的输入数组中第i小的元素。(如果n=1,则select只返回它的唯一输入数值作为第i小的元素)。

1. 将输入数组的n个元素划分为(向下取整(n/5))组,每组5个元素,且至多只有一组由剩下的nmod5个元素组成。

2.寻找这(向上取整(n/5))组中每一组的中位数:首先对每组元素进行插入排序,然后确定每组有序元素的中位数。

3.对第2步中找出的(向上取整(n/5))个中位数,递归调用select以找出其中位数x(如果有偶数个中位数,为了方便,约定x是较小的中位数)。

4.利用修改过的Partition版本,按中位数的中位数x对输入数组进行划分。让k比划分的低区中的元素数目多1,因此x是第k小的元素,并且有n-k个元素在划分的高区。

5.如果i=k,则返回x。如果ik,则在高区递归查找第i-k小的元素。

(代码下次补)。

时间复杂度为O(n)。

你可能感兴趣的:(算法)