`
128kj
  • 浏览: 604180 次
  • 来自: ...
社区版块
存档分类
最新评论

堆排序的应用:从1亿条数据中从大到小取前10000条

阅读更多
堆排序的应用:从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);  
        }  

       
    }  
  
}  


源码下载:
分享到:
评论

相关推荐

    一亿组数据排序2

    - **块内排序**:可以使用各种内部排序算法,如快速排序、归并排序或堆排序,取决于数据特性和内存限制。 - **内存管理**:在内存有限的情况下,需要确保每次只加载适量的数据,并及时释放内存,避免内存溢出。 - ...

    java一亿数字取前100个(3秒钟获取)

    3. **快速选择算法(QuickSelect)**:这是一种基于快速排序思想的算法,用于在未排序的数组中找到第k小(或大)的元素。在本例中,我们需要找到前100个最小的元素,可以迭代地应用快速选择,每次找到一个新元素并...

    15行代码5秒搞定上亿规模整数排序

    常见的排序算法如快速排序、归并排序、堆排序或计数排序等,可能会在此基础上进行了优化以适应大整数规模的数据。 为了深入了解这个主题,我们可以做以下几点: 1. 访问提供的博客链接,阅读博主对算法的详细解释和...

    java一亿数字取前100个(3秒钟获取)Java算法.zip

    标题中的“java一亿数字取前100个(3秒钟获取)Java算法”涉及到一个经典的计算机科学问题,即在海量数据中快速找到最大的前N个元素。这个问题在大数据处理、排序以及性能优化等领域有着广泛的应用。在这个场景下,...

    海量数据处理:十道面试题与十个海量数据处理方法总结

    - **初步思路**: 将所有IP地址写入一个大文件,考虑到IP地址的范围为2^32,可以使用映射的方法将这些IP分散到较小的文件中。 - **具体步骤**: - 将IP地址按照模1000的方式映射到1000个小文件中。 - 对于每个小...

    大数据量海量数据处理.pdf

    以下是从“大数据量海量数据处理.pdf”文件中提炼出的若干关键知识点,涵盖了大数据处理的基本概念、常见问题及解决方案。 #### 1. 大数据处理概览 大数据处理涉及对大量、高速产生的数据进行收集、存储、管理和...

    十道海量数据处理面试题与十个方法大总结

    解决方案是顺序读文件中,对于每个词 x,取 hash(x)%5000,然后按照该值存到 5000 个小文件中。然后,对每个小文件,统计每个文件中出现的词以及相应的频率,并取出出现频率最大的 100 个词。 四、有 10 个文件,每...

    算法与数据结构第7章.pdf

    对于大规模数据处理,比如涉及亿级数据量时,传统的简单选择排序法就显得力不从心,因为它需要大量的比较运算,例如在1亿个数据中找出最大1万个数,其运算次数达到惊人的1万亿次。这种效率显然无法满足现代数据处理...

    数据结构之堆详解

    - **查找Top-K问题**:在大量数据中找出前K个最大或最小元素,如在1亿个整数中找前100万个最大值,可以使用小顶堆实现,时间复杂度为O(n log k)。 掌握堆的概念和操作对于理解和实现高级算法至关重要,比如在图的...

    腾讯:大数据平台与推荐应用架构.pdf

    根据文档提供的数据,截至2014年,腾讯拥有月活跃用户达8.3亿,其中最高同时在线人数达到2.1亿,这反映出腾讯在社交、游戏、消息传递等多个领域的巨大影响力。这些数据不仅体现了腾讯的市场规模,也显示了其数据处理...

    十道海量数据处理面试题(卷).doc

    7. 上亿数据统计出现次数最多的 N 个数据: 使用优先队列(最小堆)或者 Top-K 算法,每次新数据出现时更新堆。 8. 判断一个数是否在 40 亿个数中: 类似于第6题,可以构建布隆过滤器,但考虑到误判率要求更低,...

    大数据处理算法.pdf

    大数据处理算法目录中,主要介绍了三种大数据处理算法:Bitmap 算法、Bloom Filter 算法和分而治之/Hash 映射 + Hash 统计 + 堆/快速/归并排序。 大数据处理算法一:Bitmap 算法 Bitmap 算法是一种常用的大数据...

    常见的海量数据处理方法

    3. **排序与筛选**:对于较小的数据集,可以先进行排序,然后选取前K个元素。 #### 结论 本文介绍了几种处理海量数据的有效方法,包括分片存储与去重、使用布隆过滤器、MapReduce框架的应用、统计特定字段、TOP-K...

    百度、google海量数据搜索算法题解

    在寻找每个块中第k大的数时,可以利用快速排序的变种,例如“堆排序”或“快速选择”,快速定位到第k个元素。 第二个问题:“有一篇英文文章,请找出‘csdn’这个单词出现的次数,要求效率最高”。这个问题可以通过...

    数据结构最小生成树源码

    - 循环:每次从优先队列中取出权值最小的边,如果这条边连接的是两个不同集合的节点,就将其加入最小生成树,并更新优先队列和集合。 2. **克鲁斯卡尔算法**: - 初始化:将所有节点视为独立集合,对所有边按权值...

    海量数据[参考].pdf

    【海量数据处理】是计算机科学领域中的重要主题,特别是在大数据时代,如何...在实际应用中,选择哪种方案取决于数据的特性、可用资源以及对准确性的要求。通过不断学习和实践,我们可以更好地应对大数据时代的挑战。

    大厂面试系列二.pdf

    在内存限制为2G的情况下找出10G个整数中的中位数问题,可以使用外部排序算法将数据分块,然后使用最小堆或最大堆来维护较小的一半数据和较大的一半数据。 时分秒针每天重合的次数,可以通过计算它们的相对速度得出...

    c语言如何对海量数据进行处理

    对每个块内的词频进行统计,可以使用最小堆这种数据结构来保存每个块的前100个高频词。然后采用归并排序方法,将所有最小堆中的高频词合并并排序,最后得出全局的最高频词列表。 ### 提取最多访问IP 对于海量日志...

Global site tag (gtag.js) - Google Analytics