如何给10^7个数据量的磁盘文件排序

题目:

输入:给定一个文件,里面最多含有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方法必须满足的条件是:不能有重复的数字

具体看 http://blog.csdn.net/v_JULY_v/article/details/6451990

#include <assert.h>
#include <bitset>
#include <iostream>
using namespace std;
const int maxEachScan = 5000000;
const int maxSortNumber = 10000000;

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, 1);                //bitset内部机制,保存在bit_map中
    }

    for (int i = 0; i < maxEachScan; i++)   //遍历bit_map
    {
        if (bit_map[i] == 1)
            fprintf(fp_SortFile, "%d", i);      //这里就是将数据用bit保存(放在bitmap中),再输出的时候输出其对应的数字
    }

    /*第二遍遍历*/
    bit_map.reset();
    fseek(fp_unSortFile,0,SEEK_SET);  //移到文本的开头
    while (fscanf(fp_unSortFile,"%d",&num)!=EOF)
    {
        if (num >= maxEachScan&&num < maxSortNumber)
            bit_map.set(num-maxEachScan, 1);
    }

    for (int i = 0; i < maxEachScan; i++)
    {
        if (bit_map[i] == 1)
            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<4> foo;
std::cout << foo.set()<<‘\n‘;// 1111
std::cout << foo.set(2,0)<<‘\n‘;// 1011
std::cout << foo.set(2)<<‘\n‘;// 1111
return0;
}
Edit&Run
Output:
1111
1011
1111

3.文件的读取

fscanf(fp_unSortFile,"%d",&num)!=EOF %d可以限定我们读取的是int类型EOF判断文件尾部

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

来自为知笔记(Wiz)

如何给10^7个数据量的磁盘文件排序,布布扣,bubuko.com

时间: 2024-10-25 08:34:00

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

如何给10^7个数据量的磁盘文件进行排序--归并排序

接上面的题目,假若待排序的数据有重复的呢?这里采用的是归并排序. 1.算法分析:     1.稳定性:归并排序是一种稳定的排序.    2.存储结构要求:可用顺序存储结构.也易于在链表上实现.    3.时间复杂度: 对长度为n的文件,需进行lgn趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)..    4.空间复杂度:需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序. 2.总结 与快速排序相

给一千万个数据量的文件排序

#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <set> #include <bitset> #include <ctime> #include <cassert> #include <climits> #include <

现身说法:实际业务出发分析百亿数据量下的多表查询优化

今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化,俗话说的好,一切脱离业务的架构都是耍流氓,接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优化思路.由于本文内容整理自微信群,爬楼不易,整理更不易,如果有遗漏,欢迎大家在评论区留言. 作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/10530223.html 简单的例子 这里我们先举个简单的例子,来个开胃菜,然后再引出今天的访谈主题. 举例:比如

es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

面试题es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的.很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了.第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒.你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对

WCF入门(一)--Request Entity Too large 传输的数据量过大

通过WCF进行数据的查询或者添加的时候,如果数据量过大,一般会报出如下的错误: 1.已超过传入消息(65536)的最大消息大小配额.若要增加配额,请使用相应绑定元素上的MaxReceivedMessageSize 属性. 2.远程服务器返回了意外反应(413)Request Entity too large. 3.远程服务器返回了意外反应(400)Bad Request. 具体的解决方案: 服务端返回数据给客户端报错 在客户端的配置文件中,主要修改maxReceivedMessageSize <

解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接

开发中所用的数据需要通过WCF进行数据传输,结果就遇到了WCF大量传输问题 也就是提示System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接 网上解决方案都是千篇一律互相转发的,并且没有明确的解决方案或者按照,各个博客中的解决方案都没能解决这个问题. 为此我整整浪费了一天时间用来解决这个问题,而且用了最笨的办法一点点的尝试网上所查到的方案.对于精研WCF来说的这可能是一个小问题,但是对于仅仅了解wcf,一知半解的会很困惑.将解决方案贴出来希望能帮

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

最近做项目,需要做一个从mysql数据库中随机取几条数据出来. 总所周知,order by rand 会死人的..因为本人对大数据量方面的只是了解的很少,无解,去找百度老师..搜索结果千篇一律.特发到这里来,供大家学习. 在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的.下面我来介绍随机取数据一些优化方法. SELECT * FROM table_name ORDER BY ran

数据量下高并发同步的讲解(不看,保证你后悔

4.常见的提高高并发下访问的效率的手段 首先要了解高并发的的瓶颈在哪里? 1.可能是服务器网络带宽不够 2.可能web线程连接数不够 3.可能数据库连接查询上不去. 根据不同的情况,解决思路也不同. 像第一种情况可以增加网络带宽,DNS域名解析分发多台服务器. 负载均衡,前置代理服务器nginx.apache等等 数据库查询优化,读写分离,分表等等 最后复制一些在高并发下面需要常常需要处理的内容: 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能.

大数据量高并发的数据库优化

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须