这是《编程珠玑》中的一道题目。10亿个整数,假设每个整数需要四个字节,如果使用排序的话,需要大约4G的内存,现在的很多pc都没有多这么内存,更不用说作者那个年代。

我们借助最小堆来解决这个问题。

主要步骤:

一、使用一个大小为一百万零一的整数数组来构建堆(堆的下标从1开始)

二、从文件中读取前一百万个数,每读入一个数,调用函数,保持其最小堆的性质,堆的根永远是堆中最小的元素。

三、从一百万零一个数开始,每读入一个数开始,比较这个数与堆的根比较,如果比根大,就用这个数替换掉根,调用函数,保持最小堆性质。

先生成10亿个随机数,使用的也是《编程珠玑》上的方法,将这10亿个数输出到data.txt中。

#include <stdlib.h>
#include <stdio.h>int main(int argc, char *argv[]) {unsigned m, n;printf ("生成m个小于等于n的随机数!,请输入m和n:\n");scanf("%d%d", &m, &n);FILE *fp = fopen("data.txt", "w");/* 生成m个小于等于n的随机数 */unsigned i;for(i = 0; i < n; ++ i){int temp = rand();if((temp  % (n - i)) < m){fprintf(fp, "%d\n", i);-- m;}}fclose(fp);return 0;
}

生成了10亿个小于20亿的随机数,并且这10亿个数是不重复的。整个data.txt文件大约有10G,我的系统无法打开,内存不够。

然后就是从这10亿个数中选出前100万个最大的数。

#include <stdio.h>
#include <stdlib.h>/* 定义堆的大小 */
#define HEAPSIZE 1000000
/* 使用数组来构建最小堆 */
unsigned num[HEAPSIZE+1];/* 在堆的末尾插入新元素后,保持最小堆性质 */
void siftup(int size){int i = size;unsigned parent, temp;while(1){if(i == 1)break;parent = i / 2;/* 已经是最小堆,退出 */if(num[parent] <= num[i])break;/* 交换父亲和儿子 */temp = num[parent];num[parent] = num[i];num[i] = temp;i = parent;}
}/* 替换根元素后保持最小堆性质 */
void siftdown(int size){int i = 1;unsigned child;while(1){child = 2 * i;if(child > size)break;/* child 是 i 的左儿子 */if(child + 1 <= size){/* 选取两个儿子中比较小的那个 */if(num[child+1] < num[child]){++child;}}/* 已经是最小堆,退出 */if(num[i] <= num[child])break;/* 交换父亲和儿子 */unsigned temp;temp = num[i];num[i] = num[child];num[child] = temp;i = child;}
}int main(int argc, char *argv[]) {FILE *fp = fopen("data.txt", "r");unsigned i, number;unsigned count = 0;while(fscanf(fp, "%d", &number) != EOF){/* 前100万个数构建最小堆 */if(count < HEAPSIZE){++count;num[count] = number;siftup(count);continue;}/* 从100万零1个数开始,将当前数与根元素比较 */if(number > num[1]){num[1] = number;siftdown(count);}}fclose(fp);/* 将结果输出到文件中保存 */FILE *result_fp = fopen("result.txt", "w");for(i = 1; i <= HEAPSIZE; ++i){fprintf(result_fp, "%d\n", num[i]);}fclose(result_fp);return 0;
}

前100万个数使用siftup函数构建最小堆,而后的数与堆的根比较,如果比根大,则替换掉根,并使用siftdown函数保持最小堆性质。

(如有疏漏之处,欢迎指正!)

在存有10亿个数的文件中找到最大的100万个数相关推荐

  1. 豪投10亿!华为放话:3年培养100万AI人才!网友神回应了

    近期,AI测试权威软件AI Benchmark的测试数据显示,中国华为研发的7nm旗舰手机芯片麒麟810的AI分数,远远超过美国高通骁龙855了! 麒麟810芯片AI分数是3300多,名列第一.而骁龙 ...

  2. 随机生成100万个数,排序后保存在文件中

    随机生成100万个数,存储在文件out1.txt中,使用内部排序完成,并重新储存在文件out2.txt中. (一)使用STL中的qsort函数进行操作: #include "stdio.h& ...

  3. 检查xml文件中包含非法xml字符的个数(

    xml中需要过滤的字符分为两类,一类是不允许出现在xml中的字符,这些字符不在xml的定义范围之内.另一类是xml自身要使用的字符,如果内容中有这些字符则需被替换成别的字符. 第一类字符 对于第一类字 ...

  4. 编写程序,随机产生20个0到1之间的数,将这20个数写入文本文件中,要求每行5个数

    import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOEx ...

  5. Linux 指令:怎样从文件中找到重复行?

    Linux 指令:怎样从文件中找到重复行? 1.例如有文件test1.txt,内容如下: Hello world. 122 122 343434 222222 执行uniq -d 可以找到重复行: 1 ...

  6. 数据总量 40 亿+,报表分析数据 10 亿+,TiDB 在中通的落地与进化

    作者:luzizhuo 原文来源: https://tidb.net/blog/3da1aed9 本文根据中通快递数据智能部基础架构负责人朱友志在[PingCAP DevCon 2021]上的演讲整理 ...

  7. 【面试题-算法思想】如何从包含大量URL的A,B文件中找到相同的URL?

    面试遇到的算法思想题,没有敲代码,只是整理并在头脑风暴后,重新叙述自己的思路. 文章目录 问题 暴力法思路 暴力延续(哈希思想) 分治思想 并行思想(后话) 问题 存在A,B文件内各包含1000G的U ...

  8. python常用单词汇总_在.txt文件中找到最常用单词的Python程序必须打印word及其连接...

    现在,我有一个函数来替换countChars函数def countWords(lines): wordDict = {} for line in lines: wordList = lines.spl ...

  9. 在php里面找出有用的代码,如何在多个源代码文件中 找到某段代码?

    有一个网站里面有个图片链接已经失效,并且某明奇妙多出了一些字符. 现在我想在多个源代码文件中php或者数据库中找到这段代码,并且修正. 请问有没有好的方法? 回复内容: 有一个网站里面有个图片链接已经 ...

最新文章

  1. ECharts 图表导出
  2. Spring的静态注入
  3. 主流大数据技术全体系参数与搭建与后台代码工程框架的编写(百分之70)
  4. 性能翻倍 IBM借DS3500拓中低端存储市场
  5. 容灾与备份究竟有什么区别?
  6. 图论中的基础概念总结
  7. 二叉树的递归遍历(先序,中序,后序)
  8. nginx subrequest演示示例程序
  9. 神奇的CAReplicatorLayer
  10. Python反向列表
  11. HDOJ--1728--逃离迷宫(广搜)
  12. [HihoCoder1369]网络流一·Ford-Fulkerson算法
  13. C语言井字棋人人对战源代码,回忆儿时游戏-井字棋(完整代码)
  14. visio2010最新密钥
  15. Linux操作系统中常用软件包的下载命令
  16. java中 Object转换成 int 类型。
  17. amp;#9733;用辩证数学解答“缸中之脑”
  18. 郭靖大侠的IT为学之路
  19. 用计算机绘画教学反思,《电脑美术》教学反思范文
  20. qpython androidhelper gps_Qpython SL4A获取手机电量和GPS

热门文章

  1. 电力微气象监测站配置要求是什么?
  2. bpmn整合流程图高亮显示流程进度图
  3. vue中的表单手机号和邮箱自定义验证规则
  4. python统计词频 创建字典_如何利用Python进行文本词频统计
  5. iPhone 12 销量破亿,直追「钉子户神机」的底气是什么?
  6. storm完全分布式部署
  7. 谷歌云告别三女侠时代!继李飞飞李佳之后,Diane Greene 宣布离职
  8. Ralink RT5350:添加自定义GPIO应用程序
  9. 微课设计与开发——利用adobe软件制作的动画(以图片形式展示)
  10. 【Spring Boot学习笔记】——配置文件