topN算法问题
问题:
如何在10亿个整数中找出前1000个最大的数?
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();
}
topN算法问题的更多相关文章
- topN 算法 以及 逆算法(随笔)
topN 算法 以及 逆算法(随笔) 注解:所谓的 topN 算法指的是 在 海量的数据中进行排序从而活动 前 N 的数据. 这就是所谓的 topN 算法.当然你可以说我就 sort 一下 排序完了直 ...
- .net下使用最小堆实现TopN算法
测试代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...
- TopN算法,流式数据获取前N条数据
背景:由于业务需求,用户想要统计每周,每月,几个月,一年之中的前N条数据. 根据已有的思路无非就是对全部的数据进行排序,然后取出前N条数据,可是这样的话按照目前最优的排序算法复杂度也在O(nlog(n ...
- 大数据算法设计模式(1) - topN spark实现
topN算法,spark实现 package com.kangaroo.studio.algorithms.topn; import org.apache.spark.api.java.JavaPai ...
- 数据算法 --hadoop/spark数据处理技巧 --(1.二次排序问题 2. TopN问题)
一.二次排序问题. MR/hadoop两种方案: 1.让reducer读取和缓存给个定键的所有值(例如,缓存到一个数组数据结构中,)然后对这些值完成一个reducer中排序.这种方法不具有可伸缩性,因 ...
- 分别使用Hadoop和Spark实现TopN(1)——唯一键
0.简介 TopN算法是一个经典的算法,由于每个map都只是实现了本地的TopN算法,而假设map有M个,在归约的阶段只有M x N个,这个结果是可以接受的并不会造成性能瓶颈. 这个TopN算法在ma ...
- TopN问题(分别使用Hadoop和Spark实现)
简介 TopN算法是一个经典的算法,由于每个map都只是实现了本地的TopN算法,而假设map有M个,在归约的阶段只有M x N个,这个结果是可以接受的并不会造成性能瓶颈. 这个TopN算法在map阶 ...
- 关于topN问题的几种解决方案
在系统中,我们经常会遇到这样的需求:将大量(比如几十万.甚至上百万)的对象进行排序,然后只需要取出最Top的前N名作为排行榜的数据,这即是一个TopN算法.常见的解决方案有三种: (1)直接使用Lis ...
- 找工作面试题记录与参考资料(Golang/C++/计算机网络/操作系统/算法等)
记录下去年(2020年)找工作的面试题及参考资料. C++ 智能指针的实现原理 多态的实现原理[2] C++11/14/17新特性[3] 手写memcpy和memmove[4] 介绍下boost库 计 ...
- Apache Kylin
日前,eBay公司隆重宣布已经正式向开源业界推出分布式分析引擎:Kylin(http://kylin.io).作为一套旨在对Hadoop环境下分析流程进行加速.且能够与SQL兼容性工具顺利协作的解决方 ...
随机推荐
- Dockerfile参考
From openjdk:8u252-jdkENV MEMORY_SIZE {{ MEMORY_SIZE | default (1024) }}MENV PROJECT_NAME {{PROJECT_ ...
- idea集成maven插件 使用骨架创建maven的java工具 不使用骨架创建maven的java工程
idea集成maven插件 使用骨架创建maven的java工具 new-->FIle-->Model 选择Maven对勾选上要不不能使用骨架 找到这个,选上下一步 Finish即可 ...
- C# 使用CefSharp完成自动签到
1首先新建项目,右键项目选择管理NuGet 程序包,在浏览中搜索CefSharp.Winfrom ,点击安装,会自动安装相应的包.因为CefSharp是不能以AnyCPU的模式运行所以需要修改配置,有 ...
- Unity3D发布Android注意事项
当你制作完一款游戏,准备发布Android平台时,需要进行一些设置.如下: 一.设置AndroidSDK路级和JDK路径 AndroidSDK目录可以通过AndroidStudio查看,如下: 这个路 ...
- js 深拷贝 和 浅拷贝
1. ...运算符 (浅拷贝) let obj = {a:1,b:2}; let obj2 = {...obj}; obj.a=3 obj //{a: 3, b: 2} obj2 //{a: 1, ...
- Python学习笔记之7.5 - 定义有默认参数的函数》》》直接在函数定义中给参数指定一个默认值,默认参数的值应该是不可变的对象
问题: 你想定义一个函数或者方法,它的一个或多个参数是可选的并且有一个默认值. 解决方案: 定义一个有可选参数的函数是非常简单的,直接在函数定义中给参数指定一个默认值,并放到参数列表最后就行了.例如: ...
- 「NOTE」常系数齐次线性递推
要不是考到了,我还没发现这玩意我不是很会-- # 前置 多项式取模: 矩阵快速幂. # 常系数齐次线性递推 描述的是这么一个问题,给定数列 \(c_1,c_2,\dots,c_k\) 以及数列 \(f ...
- 「DIARY」PKUSC 2021 游记
冬令营没了但是还有夏令营 (完蛋,前两天忘写游记了,完全没想起来--最后一天补一补) 试题分析在另外一篇博客上 # Day 0 早上去机场的时候把手机落在出租车上了 (还好之后找回来了),导致我前两天 ...
- SQLServer遇到的问题解决方案(6月9日)
一.判定两个浮点数数值是否相等 对比数据类型为浮点数的数据时,因为浮点数精度问题,当判断两个数值是否相等时往往会出现错误的结果,如下图: 解决方案:一个比较好的解决方案是设定一个精度,通过判定两个值差 ...
- 关于JDK1.8 java HashMap的tableSizeFor的解析:一个数最近2的幂次数方法
简介 一个数的最近2的幂次数,是java hashmap初始化方法指定容量里面对容量进行处理采用的方法 1.位运算符号介绍 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两 ...