这是一个很常见的算法问题,从一组数中选出最大的K个。
《编程之美》上也有这个问题的一些解法。其中,一种较好的解法就是利用有序队列(如JAVA中的PriorityQueue),主要的算法思路如下:
先从第一个数开始,依次入队k个数,此时,有序队列以对这k个数排序完成,按照从小(队列首)到大(队列尾)顺序排列。
然后,依次遍历后面的剩余数字,当队列首小于即将入队的数时,出队,并将当前的数入队。如此重复,直到遍历完毕。
此时,队列中剩下的即是最大的K个数了。
具体范例如下,使用JAVA编写。
/** 
* @(#)Kmax.java 

* Kmax application 

* @author    
* @version 1.00 2010/2/19 
*/ 
import static java.lang.System.out; 
import java.util.Comparator; 
import java.util.PriorityQueue;

class MyComparator implements Comparator { 
  public int compare(Object a, Object b) { 
    return ((Long)a).compareTo((Long)b); 
  } 
}

public class Kmax { 
        private long []n; 
        private int maxNum = 20; 
        private int k = 5; 
        private final static int BOUND = 1000; 
         
        private void generateNumbers() { 
          n = new long[maxNum]; 
          for(int i = 0; i < maxNum; i++) { 
            n[i] = Math.round(Math.random() * BOUND); 
            out.println(n[i]); 
          } 
        }

private void selectKmax() { 
          PriorityQueue pq = new PriorityQueue(k, new MyComparator()); 
          for(int i = 0; i < k; i++) { 
            pq.offer(n[i]); 
          } 
            
          for(int i = k; i < maxNum; i++) {    
            if(n[i] > (Long)pq.peek()) { 
              pq.poll(); 
              pq.offer(n[i]); 
            } 
          } 
            
          out.println("-----------------------"); 
          while(pq.size() > 0) { 
            out.println((Long)pq.poll()); 
          } 
        } 
         
        public static void main(String[] args) { 
          Kmax kmax = new Kmax(); 
          kmax.generateNumbers();//产生maxNum个随机整数 
          kmax.selectKmax();//从中选出k个最大的数,并输出 
          out.println("Complete!"); 
        } 
}

这个算法速度较快,是一种极好的解法。

本文转自 kevx 51CTO博客,原文链接:http://blog.51cto.com/spinlock/277124,如需转载请自行联系原作者

利用有序队列寻找最大的K个数相关推荐

  1. 程序员编程艺术:第三章、寻找最小的k个数

    程序员编程艺术:第三章.寻找最小的k个数 作者:July. 时间:二零一一年四月二十八日. 致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作 ...

  2. 编程之美2.5 寻找最大的K个数

    在一个数组中寻找最大的K个数,我们首先说一种非常简单的方法,利用快速排序中的分割算法,即我们经常看见的partition.这个函数会返回一个 int 类型的值,这个值代表的是前一半数字和后一半数字的分 ...

  3. 编程之美-寻找最大的k个数

    [问题描述] 有很多无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 方法一:时间复杂度min(O(nlogn), O(nk)) idea 1: 先用快速排序或者堆排序进行排序,然后 ...

  4. 海量数据中,寻找最小的k个数。

    维护k个元素的最大堆,即用容量为k的最大堆存储最小的k个数,k1设为大顶堆中最大元素.遍历一次数列,n,每次遍历一个元素x,与堆顶元素比 较,x<kmax,更新堆,否则不更新堆. 1 // 海量 ...

  5. 算法题解之寻找最大的k个数

    一般看到寻找最大的k个数的题目,我们第一想法便是先使用降序排序,然后取前k个即可,这种方法确实是比较常规的,一般情况下也是可行的,但是如果数据十分庞大,则会影响使得创建的数组内存溢出等等.因此,需要对 ...

  6. 寻找最大的k个数问题

    这是编程之美书第2.5节的一道题目. 各种解法: 解法一,用nlgn复杂度的排序算法对数组进行从大到小排序,取前K个.但这方法做了两件不必要做的事:它对想得到的K个数进行了排序,对不想得到的n-K个数 ...

  7. 寻找最大的K个数(下)

    接着昨天的写,里面的代码包含昨天的 1 #include <iostream> 2 using namespace std; 3 #define N 50 4 5 //初始化数组 6 in ...

  8. Java实现寻找最小的k个数

    1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. package com.liuzhen. ...

  9. 寻找最大的K个数(上)

    这是一道很经典的题目,有太多方法了,今天写了两种方法,分别是快排和堆排序 1 #include <iostream> 2 using namespace std; 3 #define N ...

  10. java第k大的数字,JAVA中寻找最大的K个数解法

    这个题拿到之后首先会想到排序,排好序之后在选取选取最大的K个数.排序选择快速排序是个比较好的选择. 好了,让我们来进行第一个解法:快速排序 代码如下 复制代码代码如下: public static v ...

最新文章

  1. 逃离 AI 赛道的投资人:做局失利、破局无力
  2. SVN本地代码未提交而被覆盖
  3. MySQL错误1264和1366_Mysql错误1366 - Incorrect integer value解决方法
  4. MySQL purge 线程
  5. Redis数据结构之有序集合
  6. 阿里编码规约扫描eclipse插件安装使用
  7. 为什么要与下属建立良好的人际关系?
  8. 25 张图,一万字,拆解 Linux 网络包发送过程
  9. (附源码)spring boot校园二手交易平台 毕业设计 191637
  10. 程序员:职业很抓狂!前途很迷茫?送你破解困境秘籍!
  11. [深入理解Android卷一全文-第八章]深入理解Surface系统
  12. Android竖虚线绘制
  13. 《Head First Java》| 1 进入Java 的世界
  14. 计算机网速单位是什么,文件大小和网速的单位
  15. 【houdini 基础】Ramp 参数
  16. 新浪微博架构和FEED架构分析--人人架构
  17. 【Elasticsearch教程13】Mapping字段类型之nested
  18. 视频教程-大数据电视收视率实战项目教程(企业级案例)-Spark
  19. 乐视2能刷原生android,乐视2高通版(S2) 魔趣OS 安卓9 MagiskV21版 完美ROOT 纯净完美 原生极简 纯净推荐...
  20. 解绑定和释放弹性云服务器的弹性公网IP

热门文章

  1. 收尾决胜武器:软文常用的9个收尾方法
  2. NFC:Arduino、Android与PhoneGap近场通信
  3. 发展下一代互联网的动力
  4. 末日帝国——Agile公司的困境 (4)
  5. 解密《一个操作系统的实现》这本书
  6. 一本关于网上支付解决方案的迷你百科全书
  7. 神经网络训练输入数据并行化
  8. BeamSearch的原理和实现
  9. android picasso 圆形,Andorid开发之Picasso通过URL获取用户头像的圆形显示
  10. Ros学习笔记(三)创建节点及节点之间通信