本书第一章提出了一个看似简单的问题,有最多1000万条不同的整型数据存在于硬盘的文件中,如何在1M内存的情况下对其进行尽可能快的排序。

每个数字用4byte,1M即可存储250 000个数据,显然,只要每次对250 000个数据排序,写入到文件中即可,重复40次。

那么如何选出每次遍历的二十五万条数据呢?有如下两个策略:

1、对一千万条数据遍历40次,第i次遍历时,判断数是否属于[i*250000,i*250000+249999),如果是,则读入内存,当第i次遍历完成时,内

存中有了二十五万条数据,这些数据比前i-1次遍历筛选出来的大,但是比后40-i次遍历的小。故,将第i次遍历选入内存中的数排序,输出到硬盘文件,

追加到i-1次输出到那个文件即可。

特点:简单,粗暴,但是遍历次数极多,只能串行,对文件进行了40次读取,本机运行耗时 2分17秒214毫秒。

2、对一千万条数据遍历1次,第i组 二十五万条数据存入内存,排序,输出到文件i,对一千万条数据完成一次遍历后,生成40个内容有序的临时文件,

在对这些文件归并,即可。

特点:对源文件只需要一次读入,排序可以采用多线程,IO次数仍然较高。串行情况下,本机运行耗时21秒221毫秒

那么如何能达到10秒以内呢?

那么分析一下这个问题的特点:

a、数据不超过最大值

b、所有数据不重复

c、每条数据仅是一个数

那么可以申请一个一千万位长的位向量,下标为i的位是1,则代表存在一个数i。

3、由此得到了一种针对此问题的位图排序方法。

申请长度为一千万位的位向量bit[10000000],所有位设置为0,顺序读取待排序文件,每读入一个数i,便将bit[i]置为1。当所有数据读入完成,便对

bit做从头到尾的遍历,如果bit[i]=1,则输出i到文件,当遍历完成,文件则已排好序。本机运行耗时9秒49毫秒。

备注: 无bit类型的编程语言如何实现位操作

以32位操作系统下的int类型为例。设需要申请N个位,则需要有a[N/32+1]个int类型方可容得下N位(当然,最后一个int中有些位被浪费了)

将第i位置为1的时候可以用如下操作:

第i位必然在 int型数组a的第 (i/32)个数中,偏移量是 (i%32),将i位置为1,需要第(i/32)的数与一个数b相 或 即可,b要求是 (i%32)位为1,其他位均

为0,故有如下语句:

a[i/32] | (1 << (i%32)); 

为了保证达到最快的运算速度,上式改写为如下:

a[i >>5] |= (1 << (i & 31));

来源:http://www.cnblogs.com/tntboom/p/4109458.html

对一千万条数据进行排序---编程珠玑第二版 第一章相关推荐

  1. 编程珠玑第二版 ---- 第一章个人习题集(Java)

    第一题:如果不缺内存,如何使用一个具有库的语言来实现一种排序算法? 直接使用Collections.sort(list)排序 第二题:如何使用位逻辑运算来实现位向量? package com.xck. ...

  2. python核心编程第二版第一章学习笔记

    一.名字来源 贵铎·范·罗萨姆(Guido van Rossum)于1989 年底始创了Python,那时,他还在荷兰的CWI(Centrum voor Wiskunde en Informatica ...

  3. 千万条数据,Stack Overflow是如何实现快速分页的

    转载自 千万条数据,Stack Overflow是如何实现快速分页的 Stack Overflow 在分页机制中使用页码代替偏移量,页码指向基于 LIMIT 和 OFFSET 的查询.假设要对 100 ...

  4. 索引(B+树)、B+树一个节点有多大?(一千万条数据,B+树多高?)

    目录 1. 谈谈对索引的理解 2. B树和B+树的区别?为什么使用B+树?(B+树底层文件是怎么存储的) 3. MySQL为什么要用B+树存储索引?而不用平衡二叉树(红黑树).Hash索引(散列表). ...

  5. 利用python处理两千万条数据的一些经验(仅供自己记录)

    5.3老板交给我一个任务,简单处理一些数据,三个CSV文件,每个都是2.3G大小,以下是要求 看着觉得很easy,兴冲冲地去搞了,当时还是用的notepad++写python代码,对于python来说 ...

  6. MySQL利用存储过程自动生成千万条数据

    文章目录 ​前言 ​一.实现思路 ​二.实现步骤 ​1.创建数据库 ​2.创建存储表和内存表 ​3.创建所需函数 ​4.创建存储过程 ​5.调用存储过程插入数据 ​6.统计数据库 ​ 拓展 ​总结 前 ...

  7. insert批量插入500ms_如何快速安全的插入千万条数据

    作者:ksfzhaohui 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文 ...

  8. 如何快速安全的插入千万条数据?

    最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...

  9. mysql如何快速插入一千万条数据_如何快速安全的插入千万条数据?

    最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库. 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概 ...

最新文章

  1. 据说这是大多数人【减肥】的真实写照
  2. gstreamer应用
  3. sh执行文件 参数传递_sh 脚本执行sql文件传参数
  4. 三、SpringBoot-application.properties配置文件和application.yml配置文件
  5. CF773E Blog Post Rating(推导min的通项/线段树)
  6. P3327 约数的个数和 [约数函数性质,数论分块]
  7. 基于Matlab的跨孔CT胖射线追踪算法(四)
  8. leetcode力扣347. 前 K 个高频元素
  9. 11.python并发入门(part3 多线程与互斥锁)
  10. spss和python有什么不同_python与spss的不同
  11. centos 截图命令 screenshot
  12. 维纳(Wiener)滤波及Matlab代码
  13. Unity 反转法线,在 Hierarchy 视图对象的快捷菜单中增加 Flip Mesh Normals(反转网格法线)项...
  14. 大黄,不懂 HTTP 行嘛?
  15. 对于洛谷提高试炼场-动态规划篇的爆破
  16. 论文推荐:陈国生 实证化中医基础理论
  17. TensorFlow Mobilenet SSD模型压缩并移植安卓上以达到实时检测效果
  18. ERROR [KafkaApi-1] Number of alive brokers ‘1‘ does not meet the required replication factor ‘2‘ for
  19. 计算机职称证书退休工资,职称就像是一座大山,相同教龄不同职称的教师退休工资相差多少?...
  20. SAP报工时修改工作中心

热门文章

  1. mysql 事务块 sql_Oracle_PL/SQL的基本写法_BEGIN_END块结构及简单的事务实现
  2. 「Apollo」直接在docker内部安装miniconda失败
  3. springBoot中启用事务管理
  4. 通过sqlplus执行*.sql文件时常见的问题总结
  5. 2021年计算机网络期末考试题,2021年计算机网络期末考试试题及答案-20210515145802.doc-原创力文档...
  6. PHP怎么修改链接,phpcms导航链接怎么修改
  7. 关于Verilog的可综合性
  8. SpringMVC日期类型转换问题三大处理方法归纳
  9. ionic 状态栏显示异常 statusBar
  10. 《单页Web应用:JavaScript从前端到后端》——1.4 小结