首页 > 编程语言 >topN算法问题

topN算法问题

时间:2023-02-27 17:47:10浏览次数:29  
标签:10 arr int 问题 topN 算法 static 小顶 public

问题:

如何在10亿个整数中找出前1000个最大的数?
小顶堆堆排序 首先,我们需要构建一个大小为N(1000)的小顶堆,小顶堆的性质如下:每一个父节点的值都小于左右孩子节点,然后依次从文件中读取10亿个整数,如果元素比堆顶小,则跳过不进行任何操作,如果比堆顶大,则把堆顶元素替换掉,并重新构建小顶堆。当10亿个整数遍历完成后,堆内元素就是TopN的结果。
public class TopN {    
    //Top10 
    public static int N = 10;           
   //1亿个整数  
    public static int LEN = 100000000;     
  
    public static int arrs[] =  new int[LEN];    
    public static int arr[] = new int[N];    
    //数组长度    
    public static int len = arr.length;    
    //堆中元素的有效元素 heapSize<=len    
    public static int heapSize = len;    
    public static void main(String[] args) {        
    //生成随机数组       
    for(int i = 0;i<LEN;i++){           
        arrs[i] = new  Random().nextInt(999999999);       
    }        
    //构建初始堆       
    for(int i =  0;i<N;i++){           
        arr[i] = arrs[i];       
    }       
    //构建小顶堆        
    long start =System.currentTimeMillis();       
    buildMinHeap();       
    for(int i = N;i<LEN;i++){           
        if(arrs[i] > arr[0]){               
            arr[0] = arrs[i];               
            minHeap(0);           
        }       
    }        
    System.out.println(LEN+"个数,求Top"+N+",耗时"+(System.currentTimeMillis()-start)+"毫秒");       
    print();    
    }      
    
    /**     
     * 自底向上构建小堆     
     */    
    public static void buildMinHeap(){        
        int size = len / 2;        
        for(int i = size;i>=0;i--){            
        minHeap(i);        
        }    
    }     
    
    /**     
     * i节点为根及子树是一个小堆     
     * @param i     
     */    
    public static void minHeap(int i){        
        int l = left(i);       
        int r = right(i);        
        int index = i;        
        if(l<heapSize && arr[l]<arr[index]){            
            index = l;        
        }        
        if(r<heapSize && arr[r]<arr[index]){            
            index = r;        
        }        
        if(index != i){            
            int t = arr[index];            
            arr[index] = arr[i];            
            arr[i] = t;            
            //递归向下构建堆            
            minHeap(index);        
        }    
    }     
    
    /**     
     * 返回i节点的左孩子     
     * @param i     
     * @return     
     */    
    public static int left(int i){        
        return 2*i;    
    }     
    
    /**     
     * 返回i节点的右孩子     
     * @param i     
     * @return     
     */    
    public static int right(int i){        
        return 2*i+1;    
    }    
    
    /**     
     * 打印     
     */    
     public  static void print(){        
         for(int a:arr){            
             System.out.print(a+",");        
         }        
         System.out.println();    
     }

 

标签:10,arr,int,问题,topN,算法,static,小顶,public
From: https://www.cnblogs.com/lockyluo/p/17160610.html

相关文章

  • 解决数据库表的字段id中间自增断层问题(删除自增主键其中的任意一条数据后,再次插入数据
    万能解决办法:先将该表的id字段删除,然后再重新按照见表需求创建该字段注意!!!!!!!!!!!!!注意!!!!!!!!!!!!!注意!!!!!!!!!!!!!删除之前一定要复制建表时候的SQL语句,以防你删了之后忘了原来的字段咋设置的了!!!!!!!!!!!!!!!按......
  • 【算法笔记】Day of Week
    DayofWeek时间限制:1Sec  内存限制:32MB提交:2252  解决:692 题目描述WenowusetheGregorianstyleofdatinginRussia.Theleapyearsareyearswith......
  • 【 NP 问题】P 问题、 NP 问题、NP 完全问题
    P问题P(polynomial)问题就是能在多项式时间内解决的问题,像​​O(1),O(log(n)),O(n^a)​​​等,我们把它叫做多项式级复杂度,因为它的规模n出现在底数的位置;另一种是​​O(a^n)......
  • Windows驱动开发学习记录-IRP取消例程问题
    一般设置IRP取消例程很简单,大致代码如下{......IoSetCancelRoutine(pIrp,LogIRPCancelRoutine); pIrp->IoStatus.Status=STATUS_PENDING;returnSTATU......
  • stl算法汇总
          ......
  • 解决Maven下载依赖慢的问题
    参考:https://blog.csdn.net/web15085599741/article/details/126459039<repositories><repository><id>nexus-aliyun</id><name>nexus-aliyun</na......
  • json-bigint处理前端long丢失精度问题
    通过ajax请求回来的数据在response和preview两种状态显示的id是不同的。      原因:response中的看到的数据格式其实是字符串(ajax请求回来的数据本质上是字......
  • JqGrid表格编辑时出现的问题记录
    触发场景:设jqgrid中有20行数据,设置class=“hide-row”隐藏5行后,再通过操作栏删除5行后,点击保存表单。此时在数据库只能查询到页面显示的10行数据。隐藏行的数据没有被保存......
  • 数的进制转换【《算法竞赛进阶指南》】
    数的进制转换编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。这里有62个不同数位{0−9,A−Z,a−z}。输入格式第一行输入一个整数,代表接下来的行数。......
  • 乱码问题
    是否有遇见过乱码问题,有的时候不是软件问题,而是电脑区域设置问题 有时语言显示为中尉,但是依然又乱码,需要有详细的设置,具体解决办法: ......