最小的K个数

输入N个整数,找出其中最小的K个数;

这里讲解O(nlogk)的算法,特别适合处理海量数据。

我们先创建大小为K的数据容量来存储最小的K个数字,接着我们每次从输入的n个整数中读入一个数。如果容器中已有的数字少于K个,就直接把这次读入的数放入容器中,如果容器中已经有K个数字,那么我们找出这K个数中的最大值与这次读入的数字最比较,如果这次读入的数字比最大值小则替换。

从前面分析中我们可以想到这个容器的数据结构最好是个最大堆,我们可以使用STL中的set 和multiset来实现。

下面是代码:

typedef multiset<int,greater<int> >  intSet;
typedef multiset<int, greater<int> >::iterator setIterator;

void GetLeastNumbers(const vector<int>& data, intSet & leastNumbers, int k)
{
    leastNumbers.clear();

    if( k < 1 || data.size() < k)
        return;

    vector<int>::const_iterator iter =data.begin(); 
    for(; iter != data.end() ; ++iter)
    {
        if( (leastNumbers.size() ) < k)
            leastNumbers.insert(*iter);
        else
        {
            setIterator iterGreatest = leastNumbers.begin(); // 在容器中第一个数永远是最大的数
            if( *iter  < *(leastNumbers.begin()) )
            {
                leastNumbers.erase(iterGreatest);
                leastNumbers.insert(*iter);
            }
        }
    }

}

要使用gerater<int>模版需要包含头文件<functional>

posted @ 2013-03-07 13:49  没离开过  阅读(147)  评论(0编辑  收藏  举报