堆排序的应用:从1亿条数据中从大到小取前10000条
import java.util.Arrays;
import java.util.Date;
import java.util.Random;
public class Top10000{
public static void main(String[] args) {
find();
}
public static void find( ) {//
int number = 1000000000;// 一亿条数据
int maxnum = 1000000000;// 数据最大值
int i = 0;
int topnum = 10000;// 从大到小取多少条
Date startTime = new Date();
Random random = new Random();
int[] top = new int[topnum];
for (i = 0; i < topnum; i++) {
top[i] = Math.abs(random.nextInt(maxnum));//设置为随机数
}
buildHeap(top, 0, top.length);// 构建最小堆, top[0]为最小元素
for (i = topnum; i < number; i++) {
int currentNumber2 = Math.abs(random.nextInt(maxnum));//设置为随机数
// 大于 top[0]则交换currentNumber2 重构最小堆
if (top[0] < currentNumber2) {
top[0] = currentNumber2;
shift(top, 0, top.length, 0); // 构建最小堆 top[0]为最小元素
}
}
System.out.println(Arrays.toString(top));
sort(top);
System.out.println("==============================");
System.out.println(Arrays.toString(top));
Date endTime = new Date();
System.out.println("用了"+(endTime.getTime() - startTime.getTime())+"毫秒");
}
//构建最小堆
public static void buildHeap(int[] array, int from, int len) {
int pos = (len - 1) / 2;
for (int i = pos; i >= 0; i--) {
shift(array, from, len, i);
}
}
/**
* @param array top数组
* @param from 开始
* @param len 数组长度
* @param pos 当前节点index
* */
//调整堆,使成为最小堆
public static void shift(int[] array, int from, int len, int pos) {
// 保存该节点的值
int tmp = array[from + pos];
int index = pos * 2 + 1;// 得到当前pos节点的左节点
while (index < len)// 存在左节点
{
if (index + 1 < len
&& array[from + index] > array[from + index + 1])// 如果存在右节点
{
// 如果右边节点比左边节点小,就和右边的比较
index += 1;
}
if (tmp > array[from + index]) {
array[from + pos] = array[from + index];
pos = index;
index = pos * 2 + 1;
} else {
break;
}
}
// 最终全部置换完毕后 ,把临时变量赋给最后的节点
array[from + pos] = tmp;
}
public static void swap(int array[],int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void sort(int[] array){
for (int i = array.length-1; i > 0; i--) {
/*把根节点跟最后一个元素交换位置,调整剩下的节点,即可排好序*/
swap(array,0, i);
shift(array,0, i - 1,0);
}
}
}
源码下载:
分享到:
相关推荐
- **块内排序**:可以使用各种内部排序算法,如快速排序、归并排序或堆排序,取决于数据特性和内存限制。 - **内存管理**:在内存有限的情况下,需要确保每次只加载适量的数据,并及时释放内存,避免内存溢出。 - ...
3. **快速选择算法(QuickSelect)**:这是一种基于快速排序思想的算法,用于在未排序的数组中找到第k小(或大)的元素。在本例中,我们需要找到前100个最小的元素,可以迭代地应用快速选择,每次找到一个新元素并...
常见的排序算法如快速排序、归并排序、堆排序或计数排序等,可能会在此基础上进行了优化以适应大整数规模的数据。 为了深入了解这个主题,我们可以做以下几点: 1. 访问提供的博客链接,阅读博主对算法的详细解释和...
标题中的“java一亿数字取前100个(3秒钟获取)Java算法”涉及到一个经典的计算机科学问题,即在海量数据中快速找到最大的前N个元素。这个问题在大数据处理、排序以及性能优化等领域有着广泛的应用。在这个场景下,...
- **初步思路**: 将所有IP地址写入一个大文件,考虑到IP地址的范围为2^32,可以使用映射的方法将这些IP分散到较小的文件中。 - **具体步骤**: - 将IP地址按照模1000的方式映射到1000个小文件中。 - 对于每个小...
解决方案是顺序读文件中,对于每个词 x,取 hash(x)%5000,然后按照该值存到 5000 个小文件中。然后,对每个小文件,统计每个文件中出现的词以及相应的频率,并取出出现频率最大的 100 个词。 四、有 10 个文件,每...
在实际应用中,面对大规模数据,比如1亿个浮点数,我们需要找出其中最大的1万个数。这里展示了三种不同的策略: 1. **简单选择法**:逐个比较找到最大值,总比较次数是线性的,对于1亿个数,这种方法需要大约1万亿...
- **查找Top-K问题**:在大量数据中找出前K个最大或最小元素,如在1亿个整数中找前100万个最大值,可以使用小顶堆实现,时间复杂度为O(n log k)。 掌握堆的概念和操作对于理解和实现高级算法至关重要,比如在图的...
根据文档提供的数据,截至2014年,腾讯拥有月活跃用户达8.3亿,其中最高同时在线人数达到2.1亿,这反映出腾讯在社交、游戏、消息传递等多个领域的巨大影响力。这些数据不仅体现了腾讯的市场规模,也显示了其数据处理...
7. 上亿数据统计出现次数最多的 N 个数据: 使用优先队列(最小堆)或者 Top-K 算法,每次新数据出现时更新堆。 8. 判断一个数是否在 40 亿个数中: 类似于第6题,可以构建布隆过滤器,但考虑到误判率要求更低,...
大数据处理算法目录中,主要介绍了三种大数据处理算法:Bitmap 算法、Bloom Filter 算法和分而治之/Hash 映射 + Hash 统计 + 堆/快速/归并排序。 大数据处理算法一:Bitmap 算法 Bitmap 算法是一种常用的大数据...
3. **排序与筛选**:对于较小的数据集,可以先进行排序,然后选取前K个元素。 #### 结论 本文介绍了几种处理海量数据的有效方法,包括分片存储与去重、使用布隆过滤器、MapReduce框架的应用、统计特定字段、TOP-K...
在寻找每个块中第k大的数时,可以利用快速排序的变种,例如“堆排序”或“快速选择”,快速定位到第k个元素。 第二个问题:“有一篇英文文章,请找出‘csdn’这个单词出现的次数,要求效率最高”。这个问题可以通过...
- 循环:每次从优先队列中取出权值最小的边,如果这条边连接的是两个不同集合的节点,就将其加入最小生成树,并更新优先队列和集合。 2. **克鲁斯卡尔算法**: - 初始化:将所有节点视为独立集合,对所有边按权值...
【海量数据处理】是计算机科学领域中的重要主题,特别是在大数据时代,如何...在实际应用中,选择哪种方案取决于数据的特性、可用资源以及对准确性的要求。通过不断学习和实践,我们可以更好地应对大数据时代的挑战。
在内存限制为2G的情况下找出10G个整数中的中位数问题,可以使用外部排序算法将数据分块,然后使用最小堆或最大堆来维护较小的一半数据和较大的一半数据。 时分秒针每天重合的次数,可以通过计算它们的相对速度得出...
- **堆排序**:不稳定,时间复杂度O(nlogn),空间复杂度O(1)。 #### 20. 虚函数与纯虚函数 - **虚函数**:允许子类覆盖父类中的方法。 - **纯虚函数**:没有具体的实现,强制要求子类必须覆盖。 #### 21. 多态的...