题目:

输入:给定一个文件,里面最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数),且其中每个数都小于等于n,n=10^7。
输出:得到按从小到大升序排列的包含所有输入的整数的列表。
分析:

1、归并排序。你可能会想到把磁盘文件进行归并排序,但题目要求你只有1MB的内存空间可用,所以,归并排序这个方法不行。
    2、位图方案。熟悉位图的朋友可能会想到用位图来表示这个文件集合。例如正如编程珠玑一书上所述,用一个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。

说明:使用bitset方法必须满足的条件是:不能有重复的数字

 
#include <assert.h>
#include <bitset>
#include <iostream>
using namespace std;
const int maxEachScan = ;
const int maxSortNumber = ; void SortBigNumber()
{
FILE *fp_unSortFile = fopen("d:\\unSort_data.txt","r+");
FILE *fp_SortFile = fopen("d:\\sort_data.txt", "w+");
assert(fp_unSortFile);
bitset<maxEachScan> bit_map; //因为数据比较大,分成两次执行,这里相当于定义了一个数组来保存所有结果
bit_map.reset(); //置0
int num; /*第一遍遍历*/
while (fscanf(fp_unSortFile,"%d",&num)!=EOF)
{
if (num < maxEachScan)
bit_map.set(num, ); //bitset内部机制,保存在bit_map中
} for (int i = ; i < maxEachScan; i++) //遍历bit_map
{
if (bit_map[i] == )
fprintf(fp_SortFile, "%d", i); //这里就是将数据用bit保存(放在bitmap中),再输出的时候输出其对应的数字
} /*第二遍遍历*/
bit_map.reset();
fseek(fp_unSortFile,,SEEK_SET); //移到文本的开头
while (fscanf(fp_unSortFile,"%d",&num)!=EOF)
{
if (num >= maxEachScan&&num < maxSortNumber)
bit_map.set(num-maxEachScan, );
} for (int i = ; i < maxEachScan; i++)
{
if (bit_map[i] == )
fscanf(fp_SortFile,"%d",i+maxEachScan);
} fclose(fp_unSortFile);
fclose(fp_SortFile);
}
需要用到的函数:
1.fseek: 用来将指针移到指定位置,本代码主要是移动到文本开头,进行第二次扫描
2.bitset 容器
  bitset:: reset   用来将bit位全部置0
 
  bitset:: set  给bit位置设置0或者1 来表示这个bit有没有元素
// bitset::set
#include<iostream>// std::cout
#include<bitset>// std::bitset
int main ()
{
std::bitset<> foo;
std::cout << foo.set()<<'\n';//
std::cout << foo.set(,)<<'\n';//
std::cout << foo.set()<<'\n';//
return0;
}
Edit&Run
Output:
3.文件的读取
 
fscanf(fp_unSortFile,"%d",&num)!=EOF %d可以限定我们读取的是int类型EOF判断文件尾部
 

参考:http://blog.csdn.net/v_JULY_v/article/details/6451990

如何给10^7个数据量的磁盘文件排序--bitset的更多相关文章

  1. Mysql大数据量查询优化

    一般MYSQL最基本的分页方式: select * from content order by id desc limit 0, 10 在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就 ...

  2. Mysql优化-大数据量下的分页策略

    一.前言 通常,我们分页时怎么实现呢? 1 SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但是,数据量猛增以后呢? 1 SELECT * FROM t ...

  3. mysql/oracle jdbc大数据量插入优化

    10.10.6  大数据量插入优化 在很多涉及支付和金融相关的系统中,夜间会进行批处理,在批处理的一开始或最后一般需要将数据回库,因为应用和数据库通常部署在不同的服务器,而且应用所在的服务器一般也不会 ...

  4. 这么设计,Redis 10亿数据量只需要100MB内存

    本文主要和大家分享一下redis的高级特性:bit位操作. 本文redis试验代码基于如下环境: 操作系统:Mac OS 64位 版本:Redis 5.0.7 64 bit 运行模式:standalo ...

  5. 大数据量冲击下Windows网卡异常分析定位

    背景 mqtt的服务端ActiveMQ在windows上,多台PC机客户端不停地向MQ发送消息. 现象 观察MQ自己的日志data/activemq.log里显示,TCP链接皆异常断开.此时尝试从服务 ...

  6. POI3.8解决导出大数据量excel文件时内存溢出的问题

    POI3.8的SXSSF包是XSSF的一个扩展版本,支持流处理,在生成大数据量的电子表格且堆空间有限时使用.SXSSF通过限制内存中可访问的记录行数来实现其低内存利用,当达到限定值时,新一行数据的加入 ...

  7. Oracle普通表->分区表转换(9亿数据量)

    背景介绍: 环境:Linux 5.5 + Oracle 10.2.0.4 某普通表T,由于前期设计不当没有分区,如今几年来的数据量已达9亿+, 空间占用大约350G,在线重定义为分区表不现实,故采取申 ...

  8. jquery.datatable.js与CI整合 异步加载(大数据量处理)

    http://blog.csdn.net/kingsix7/article/details/38928685 1.CI 控制器添加方法 $this->show_fields_array=arra ...

  9. MySQL随机获取数据的方法,支持大数据量

    最近做项目,需要做一个从mysql数据库中随机取几条数据出来. 总所周知,order by rand 会死人的..因为本人对大数据量方面的只是了解的很少,无解,去找百度老师..搜索结果千篇一律.特发到 ...

随机推荐

  1. [Unity菜鸟] Character控制移动

    1. 给角色加角色控制器组件,然后用以下代码可以控制角色移动和跳跃 float speed = 6.0f; float jumpSpeed = 8.0f; float gravity = 20.0f; ...

  2. TCoolMemo

    我们先起个名字叫做TCoolMemo.以上篇已经讲了很多组件的技术,这里就只说出几个重点.其余不多说了. 首先,该Memo从CustomMemo继承,它有这样外观:属于平面的,边框是可以设置颜色的线, ...

  3. 特殊的css样式

    在一定范围大小变化的div .div { width:auto; height:auto; min-height:100px; min-width:100px; max-height:200px; m ...

  4. bat拷贝文件

    最近在部署服务器的时候,需要用到把一个站点文件拷贝到其他站点.一个一个手动copy太累人了,写了个简单的批处理文件,基本能达到目的,具体怎么做呢: 1.把需要拷贝到各个站点的文件,单独放到一个目录下. ...

  5. Ubuntu使用总结

    错误 鼠标闪烁解决 系统设置->显示—>未知显示器->关闭->应用->选择当前配置 提示sudo: unable to resolve host ,亦即无法解析主机. 原 ...

  6. 使用stringstream时的清空操作

    在C++中可以使用stringstream来很方便的进行类型转换,字符串串接,不过注意重复使用同一个stringstream对象时要先继续清空,而清空很容易想到是clear方法,而在stringstr ...

  7. 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

    题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...

  8. bzoj4154

    一开始读错题,各种不会做,后来发现染色只是染孩子…… 那不就简单了吗……注意这题是允许离线的 染色如果没有距离限制,它就是个dfs序 距离限制怎么做呢?我们考虑扩展一维变成二维的问题,将每个点变为二维 ...

  9. Parallel并行运算实例

    并行运算Parallel,是.net 4.0版本里添加的新处理方式,主要充分利用CPU.任务并发的模式来达到提高运算能力.简单理解为每个CPU都在处理任务,而不会让它们空闲下来. 直接看实例: nam ...

  10. BZOJ1272: [BeiJingWc2008]Gate Of Babylon

    题解: 多重集合的组合数?还是0-m?有些元素有个数限制? 多重集合的组合数可以插板法,0-m直接利用组合数的公式一遍求出来,个数限制注意到只有15个,那我们就暴力容斥了 AC了真舒畅.. 注意开lo ...