• 大数据量磁盘文件排序


    一个含有n个不重复正整数的磁盘文件,每个数都不超过10^7,将这些数从小到
    大输出
    条件:只有1M可用内存空间,磁盘空间足够大
     
    归并排序:但是题目限制只有1M可用内存空间
    位图:由于题目的特殊性每个数都不超过10^7,并且没有重复整数,可以用10^7
    位来表示每个整数,如果存在这个整数就把改为置为1,否则置为0,然后再顺序
    遍历数组,检测每一位是否存在,如果存在就打印输出,这样最后所有数都有序。
    但是使用的内存空间为10^7/32,大概是1.25MB,因此需要分两次读取数据,第
    一次读取小于10^7/2的整数,有序输出,第二次再读取大于10^7的整数,内存也
    够用,如果可用内存比较小,可以分k次遍历,所需内存为n/k
     
    这里自己实现了位图操作,借助STL的bitset会更简单
    #include
    #include
    #define width 5000000
     
    int bit[(width>>5)+1];          
     
    void clear(int i)
    {
        bit[i>>5] &= ~(1<<(i2));
    }
     
    void set(int i)
    {
        bit[i>>5] |= 1 <<(i & 31);
    }
    int test(int i)
    {
        return bit[i>>5]&(1<<(i & 31));
    }
    int main()
    {
        FILE * fpin, *fpout;
        int d;
        fpin=fopen("in","r");
        if(fpin==NULL)
            exit(1);
        for(int i=0;i
            clear(i);
       
        while(fscanf(fpin,"%d", &d)!=EOF)
            if(d < width)
                set(d);
     
        fpout=fopen("out","w");
        if(fpout==NULL)
            exit(1);
     
        for(int i=0;i
            if(test(i))
                fprintf(fpout,"%d\n",i);
     
        int length=fseek(fpin,0,SEEK_SET);
        if(length)                  
            exit(1);
     
        for(int i=0;i
            clear(i);
        while(fscanf(fpin,"%d", &d)!=EOF)
            if(d >= width && d < 10000000)
                set(d-width);
     
        for(int i=0;i
            if(test(i))
                fprintf(fpout,"%d\n",i+width);
        return 0;
    }
  • 相关阅读:
    [转]Entity Framework 和NHibernate的区别
    NHibernate One Session Per Request简单实现
    memcache和memcached之间的区别
    Memcached 内存分配机制介绍
    linux,apache,php,mysql常用的查看版本信息的方法
    Linux查看文件夹大小
    Linux查看系统配置常用命令
    php 文件缓存(转)
    memcache在xampp下的安装
    通过改进代码将for循环遍历数组提高效率
  • 原文地址:https://www.cnblogs.com/qianye/p/2786365.html
Copyright © 2020-2023  润新知