数据结构与算法--从一百万个数字中得到前10大的数

2023-12-21 06:32

本文主要是介绍数据结构与算法--从一百万个数字中得到前10大的数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 算法如下:根据快速排序划分的思想 
(1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 
(2) 对(b,d]重复(1)操作,直到最右边的区间个数小于100个。注意[a,b)区间不用划分 
(3) 返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,d2]区间。如果个数不够,继续(3)操作,如果个数超过100的就重复1操作,直到最后右边只有100个数为止。 


2.先取出前100个数,维护一个100个数的最小堆,遍历一遍剩余的元素,在此过程中维护堆就可以了。具体步骤如下: 
step1:取前m个元素(例如m=100),建立一个小顶堆。保持一个小顶堆得性质的步骤,运行时间为O(lgm);建立一个小顶堆运行时间为m*O(lgm)=O(m lgm);       
step2:顺序读取后续元素,直到结束。每次读取一个元素,如果该元素比堆顶元素小,直接丢弃 
如果大于堆顶元素,则用该元素替换堆顶元素,然后保持最小堆性质。最坏情况是每次都需要替换掉堆顶的最小元素,因此需要维护堆的代价为(N-m)*O(lgm); 
最后这个堆中的元素就是前最大的10W个。时间复杂度为O(N lgm)。 


3.分块查找 

先把100w个数分成100份,每份1w个数。先分别找出每1w个数里面的最大的数,然后比较。找出100个最大的数中的最大的数和最小的数,取最大数的这组的第二大的数,与最小的数比较。。。。


  1. package BigData;  
  2.   
  3. import java.io.*;  
  4. import java.util.PriorityQueue;  
  5. import java.util.Queue;  
  6.   
  7. public class FileTest {  
  8.     public FileTest() {  
  9.     }  
  10.   
  11.     public static void main(String[] args) {  
  12.         // madeData();  
  13.         sortData();  
  14.     }  
  15.   
  16.     private static void sortData() {  
  17.         FileReader fr = null;  
  18.         BufferedReader br = null;  
  19.         Queue<Integer> priorityQueue = new PriorityQueue<Integer>(100);  
  20.         try {  
  21.             fr = new FileReader("F:/add3.txt");  
  22.             br = new BufferedReader(fr);  
  23.             int temp;  
  24.             int temp1;  
  25.             String str = null;  
  26.             long begin3 = System.currentTimeMillis();  
  27.             while ((str = br.readLine()) != null) {  
  28.                 temp = Integer.valueOf(str);  
  29.                 if (priorityQueue.size() < 100) {  
  30.                     priorityQueue.add(temp);  
  31.                 } else {  
  32.                     temp1 = priorityQueue.poll();  
  33.                     if (temp1 < temp) {                        
  34.                         priorityQueue.offer(temp);  
  35.                     }else{  
  36.                         priorityQueue.offer(temp1);  
  37.                     }  
  38.                 }  
  39.                 System.out.println("FileReader执行耗时:" + priorityQueue.toString());  
  40.             }  
  41.             br.close();  
  42.             fr.close();  
  43.             long end3 = System.currentTimeMillis();  
  44.             System.out.println("FileReader执行耗时:" + (end3 - begin3) + " 豪秒");  
  45.             System.out.println("FileReader执行耗时:" + priorityQueue.toString());  
  46.         } catch (Exception e) {  
  47.             e.printStackTrace();  
  48.         } finally {  
  49.         }  
  50.     }  
  51.   
  52.     private static void madeData() {  
  53.         FileWriter fw = null;  
  54.         int count = 1000000;// 写文件行数  
  55.         try {  
  56.             fw = new FileWriter("F:/add3.txt");  
  57.             int temp = (int) (Math.random() * 1000000);  
  58.             long begin3 = System.currentTimeMillis();  
  59.             for (int i = 0; i < count; i++) {  
  60.                 temp = (int) (Math.random() * 1000000);  
  61.                 fw.write(temp + "\r\n");  
  62.             }  
  63.             fw.close();  
  64.             long end3 = System.currentTimeMillis();  
  65.             System.out.println("FileWriter执行耗时:" + (end3 - begin3) + " 豪秒");  
  66.         } catch (Exception e) {  
  67.             e.printStackTrace();  
  68.         } finally {  
  69.         }  
  70.     }  
  71. }  
维护一个堆,然后向里面添加数据。。。


这篇关于数据结构与算法--从一百万个数字中得到前10大的数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/518936

相关文章

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St