最小的K个数31

来源:互联网 发布:高程测量记录表的算法 编辑:程序博客网 时间:2024/06/05 11:52

题目描述:输入n个整数,找出其中最小的k个数。例如输入{ 4, 5, 1, 6, 2, 7, 3, 8} 这8个数字,则最小的4个数字是1, 2, 3, 4。

解题思路:

  1. O(nlogk)的算法,特别适合做海量数据
  2. 使用STL中的multiset
  3. 先从vector中依次取出k个数存入multiset
  4. 然后将后面的vector元素与multiset(使用红黑树实现,begin既是k个数中最大者)的首元素对比,若发现后续元素比begin小,那么删除multiset首元素,将更小的元素插入
  5. 直到遍历结束,multiset既是最小的k个元素。

测试用例:

int main(){    //原数据    std::vector<int> v { 4, 5, 1, 6, 2, 7, 3, 8};    //辅助容器    std::multiset<int, std::greater<int>> intSet;    //将最小的k个数字存储在intSet    GetLeastNumbers(v, intSet, 4);    //输出结果    for(auto i : intSet)        std::cout << i << " ";    return 0;}

函数实现:

//函数实现void GetLeastNumbers(std::vector<int> &v, std::multiset<int, std::greater<int>> &leastNumbers, int k){    leastNumbers.clear();    std::vector<int>::const_iterator iter = v.begin();    for(; iter != v.end(); ++iter){        if(leastNumbers.size() < k)            leastNumbers.insert(*iter);        else{            //multiset开始处就是最大者            std::multiset<int, std::greater<int>>::iterator iterGreatest = leastNumbers.begin();            //如果下一元素比multiset还小            if(*iter < *(leastNumbers.begin())){                //那么删除当前begin元素                leastNumbers.erase(iterGreatest);                //将更小的元素插入                leastNumbers.insert(*iter);            }        }    }//直到遍历完所有元素}
0 0
原创粉丝点击