最小的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>