《实用算法的分析与程序设计》Chapt 2 顺序统计算法与中位数

n个元素集合中,第i个顺序统计,即第i小的元素。

中位数,即第n/2小元素

2.1 顺序统计的算法(求第i小元素的算法)

可以用分治法,参考快速排序的方法:

设第i小元素为s

divide:

A[0...N]

去中枢pivot = A[0]

以pivot为支点,将集合划分为A[0...J], A[J+1...N],使得前一集合所有元素都小于pivot,后一集合所有元素都大于pivot

conquer:

if(s <= pivot), 在区间1递归寻找

if(s > pivot), 在区间2递归寻找

combine:

#include <iostream>


int split(int arr[], int lo, int hi)
{
    int pivot = arr[lo];

    int pos = lo;
    for(int i=lo+1; i <= hi; ++i)
    {
        if(arr[i] < pivot && pos < i)
        {
            ++pos;
            std::swap(arr[pos], arr[i]);
        }
    }

    std::swap(arr[lo], arr[pos]);
    return pos;
}

int find_ith(int arr[], int lo, int hi, int k)
{
    int mid;
    if(lo < hi)
    {
        mid = split(arr, lo, hi);

        if(k <= mid)
        {
            find_ith(arr, lo, mid, k);
        }
        else if(k > mid)
        {
            find_ith(arr, mid+1, hi, k);
        }
    }
    return arr[k];
}


int main()
{
    int arr[10] ={10, 20, 34, 4, 14, 8, 7, 73, 54, 5};

    for(int i = 0; i< 10; ++i)
    {
        std::cout << "the " << i+1 << "th small element is: " << find_ith(arr, 0, 9, i) << "\n";
    }

    system("PAUSE");
    return 0;
}

算法复杂度分析:O(NlogN)

找第i小元素有线性时间复杂度的算法,详细请见《算法设计技巧与分析》P110

 

2.2 中位数的应用

median

 

 

 

 

 

 

 

[证明]

 

[例子]石油管的最优位置
    Olay教授正在为一家石油公司咨询,公司正在计划建造一条由东向西的管道.滚管道要穿过一个有n口井的油田。从每口井中都有一条喷油管沿最短路径与主管道直接相连(或南或北)。   

oil_path

 

 

 

 

 

 

 

    绐定各个井的x坐标和Y坐标.Olay教授如何才能选择主管道的最优位置(即使得各喷管长度总和最小的位置?)

[分析]确定上管道最优位置置.实际上就是求n个油井Y座标的中位数;

 

带权中位数应用:

post_office

posted @ 2007-11-01 14:39  中土  阅读(1581)  评论(0编辑  收藏  举报
©2005-2008 Suprasoft Inc., All right reserved.