1. 程式人生 > >給磁碟檔案排序(點陣圖)

給磁碟檔案排序(點陣圖)

問題描述:
輸入:是一個包含n個正整數的檔案,每個數都小於n,n<10^7如果在輸入檔案中出現任何重複整數就是致命錯誤
輸出:按升序排列的輸入的整數列表
約束:最多有1MB 的記憶體可用,有充足的磁碟儲存空間,執行時間最多幾分鐘,10秒即可不比優化
題解:
記憶體只有1MB,即最多能存102410248位二進位制數,一個int型佔32位元組,每個位元組是8位
採用點陣圖儲存集合,每個二進位制位表示該位置所表示的數字存在與否,採用位運算提高程式執行速度。
點陣圖結構
一個有限定義域內的稠密集合,其中沒一個元素最多出現一次,並且沒有其他資料與改元素相關聯。

程式碼如下:

#include<iostream>
#include<string.h>
using namespace std;
const int N=100;
const int MAXN=0x1F; // =31
const int SHIFT=5; 
int num[1+N/32];
bool test(int i){
return num[i>>SHIFT] & (1<<(i&MAXN));
}

int main()
{
memset(num,0,sizeof(num));
int x;
while(cin>>x){
num[x>>SHIFT]|=(1<<(x&MAXN));	//等效於 num[x/32]|=(1<<(i%32)) 
}
for(int i=0;i<=N;i++){
if(test(i))
cout<<i<<endl;
}
return 0;
}