給磁碟檔案排序(點陣圖)
阿新 • • 發佈:2018-11-07
問題描述:
輸入:是一個包含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; }