zoukankan      html  css  js  c++  java
  • 纯整型排序的思考

    2015/4/9周四  

      今天看编程珠玑,发现了个有趣的问题,大概是这样的:磁盘上有个文件,其中有多达1千万个不重复的整数(每个整数是7位数的,即小于10 000 000),如何排序后输出到硬盘?要求:时间大概10秒之内,内存大概1M。

      分析:int 占4个字节,即32位,1 M = 1024 K = 1048576 byte,而1M / 4 byte = 262 144 个号码。明显不够用。那么考虑位图法,用1千万个位来表示,需要1250000个字节,约1200K,约1.17M。这样就大概满足了要求了,开始编码:

    1 //初始化
    2 memset(bit,0,sizeof(bit))
    3 //磁盘读进内存
    4 for(int i=0;i<n;i++)
    5     bit[i]=0
    6 //输出
    7 for( i=0;i<n;i++)
    8     write_to_file;
    sort_for_int

      具体实现位操作(自己写出来才能看懂代码):

     1 #define BITSPERWORD 32 
     2 #define SHIFT 5 //位移量
     3 #define MASK 0x1F //右5位,代表32位
     4 #define N 10000000
     5 int a[1 + N/BITSPERWORD];
     6 
     7 void set(int i)
     8 {
     9     a[ i>>SHIFT ] |= ( 1<<(i & MASK) );
    10 }
    11 void clr(int i)
    12 {
    13     a[ i>>SHIFT ] &= ~( 1<<(i & MASK) );
    14 }
    15 int test(int i)
    16 {
    17     return a[ i>>SHIFT ] & ( 1<<(i & MASK) );
    18 }
    for_control

      

  • 相关阅读:
    282. Expression Add Operators
    281. Zigzag Iterator
    280. Wiggle Sort
    How Not to Crash #2: Mutation Exceptions 可变异常
    Moving Swiftly
    How to Use updateConstraints
    Don’t Put View Code Into Your View Controller别把View创建的代码放在VC中
    Where-To-Put-The-Auto-Layout-Code
    iOS five years[转]
    ResponderChain note
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4412319.html
Copyright © 2011-2022 走看看