【算法思想】位图排序算法

简介: 问题的提出一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。假设最多只有1M的内存空间可用,在考虑空间和时间的优化的情况下,请问如何对其进行排序?常规思想我们假设这些整数都是用整型存储(一般整型的大小为4个字节),那么1M字节可以存储250 000个数据。

问题的提出

一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。假设最多只有1M的内存空间可用,在考虑空间和时间的优化的情况下,请问如何对其进行排序?


常规思想

我们假设这些整数都是用整型存储(一般整型的大小为4个字节),那么1M字节可以存储250 000个数据。由于输入文件最大可能有10^7个数据,因此可以通过遍历输入文件40次来完成排序。第一次将在[0,249 999]范围内的整数读入到内存中,第二次将在[250 000,499 999]范围内的整数读入到内存中,依此类推。每读入一次数据,就对这些数据进行排序(可以采用一些排序算法)并输出。显然,我们要对文件进行反复的读写,这不是我们所期望的。下面我们提出一种更加合理的算法—位图排序算法


位图排序算法

如果我们想一次读取文件的全部内容(最大可能有1000万个整数),问题在于如何用1M的内存来表示这些数。我们可以用位图表示集合。我们可以用一个长度为20的字符数组来表示小于20的所有正整数的集合。举例说明:下面的字符串可以表示集合{1,2,3,5,8,13}: 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 集合中有数值的位置都置为1,其它所有位置为0.

这样我们就用一个具有1000万个位的字符串表示了这个文件,其中,当且仅当整数i在文件中存在时,第i位为1。因此我们可以分下面三步来解决这一问题:

  1. 将字符串的所有位置为0即初始化
  2. 逐一读取文件中的每个整数,并将以该整数为下标的对应为置为1
  3. 逐一检查字符串的每一位,如果为1,则输出这一元素的下标

时间、空间的折中与双赢

我们在很多问题中,都遇到着时间和空间的折中,毛泽东在论持久战中也说过以空间换时间(据说是蒋介石先提出来的)。但是上面的程序是:减少程序空间需求的同时也减少了其运行时间。因为需要处理的数据变少了,从而处理数据所需要的时间变少了,同时没有反复的读取文件,进一步避免了磁盘的访问时间。当然,只有当原始设计非最佳方案时,才有可能时空双赢。


奥卡姆的剃刀

    设计者确定其设计已经达到完美的标准不是不能再添加任何东西,而是不能再减少任何东西。

原文: http://blog.csdn.net/tengweitw/article/details/45932981
作者:nineheadedbird

目录
相关文章
|
存储 算法 数据管理
【C/C++ 基础算法】 C/C++ 位图算法的使用
【C/C++ 基础算法】 C/C++ 位图算法的使用
285 0
|
3月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
132 0
|
8月前
|
存储 搜索推荐 算法
算法系列之排序算法-堆排序
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法(即不需要额外的存储空间)。堆排序的核心思想是利用堆的性质来维护一个最大堆或最小堆,然后逐步将堆顶元素(最大值或最小值)取出,放到数组的末尾,最终得到一个有序的数组。
187 8
算法系列之排序算法-堆排序
|
7月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
算法 搜索推荐 测试技术
【调度算法】快速非支配排序算法
【调度算法】快速非支配排序算法
206 3
|
12月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
414 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
12月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
116 0
数据结构与算法学习十四:常用排序算法总结和对比
|
12月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
搜索推荐 算法 数据挖掘
十大排序算法详解-上篇:比较排序算法【python 动态图解】
十大排序算法详解-上篇:比较排序算法【python 动态图解】
|
存储 算法 搜索推荐
黑马c++ STL常用算法 笔记(3) 排序算法
黑马c++ STL常用算法 笔记(3) 排序算法

热门文章

最新文章