亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

用位圖排序無重復數據集實例代碼(C++版)

2020-01-26 15:42:11
字體:
來源:轉載
供稿:網友
《Programming Pearls》(編程珠璣下載)第一章講述了如何用位圖排序無重復的數據集,整個思想很簡潔,今天實踐了下。

一、主要思想

位圖排序的思想就是在內存中申請一塊連續的空間作為位圖,初始時將位圖的每一位都置為0,然后依次讀取待排序文件的整數,將整數所在的位設置為1,最后掃描位圖,如果某一位為1,則說明這個數存在,輸出到已排序文件。比如待排序的數據S={3,0,4,1,7,2,5},max(S)=7,我們可以設置一個八位的位圖B,將位圖的每一位初始為0,即B=[0,0,0,0,0,0,0,0],對S中的每一個整數d,設置B[d]=1,即B=[1,1,1,1,1,1,0,1],最后掃描位圖,對位圖的每一位i,如果B[i]==1,則輸出i到已排序文件,排序后的S={0,1,2,3,4,5,7}。
整個過程只需要遍歷一遍待排序文件和位圖,時間復雜度O(n),需要的輔助空間為(max(S)/8)B。雖然這個排序算法只能在無重復的整數集上運行,但對于有些需求,確實做到高效實現,比如說給手機號碼排序,手機號碼11位,第一位始終為1,理論上可以有10^10個號碼,但一些號碼未發放,即有些號碼在系統中不存在,假設系統中有50%的合法號碼,每個號碼用long int表示,這么多號碼所需要的空間為50%*(10^10)*4B=20GB,不能放在內存中進行快速排序。一個可選的方案是分多趟進行歸并排序,但需要較長的時間。我們申請一個10^10位的位圖,需要的內存是10^10/8B=1.25GB,完全可以在當代的PC機上運行,在掃描位圖時,假設某一位i為1,輸出文件時,在前面添加一個1,例如i=3885201314,輸出為13885201314。

二、算法實現

 用c語言實現的話,需要自己封裝位圖操作,這里需要用到三個操作:設置位圖的所有位為0(setAllZero);設定指定的位為1(setOne);查看指定的位是否為1(find);代碼如下:

 

復制代碼 代碼如下:

 #include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>

#define MAX_NUM 16777216//最大的數,也就是需要的位
#define BYTE_NUM (1+MAX_NUM/8)//字節數
#define MASK 0x07

void setAllZero(unsigned char *p,long size);
void setOne(unsigned char *p,long loc);
int find(unsigned char *p,long loc);
bool getSorted(unsigned char *bitmap,char *fileName);
bool setBitmap(unsigned char *bitmap,char *fileName);
int bitmapSort();
int main(){
    return bitmapSort();
}
int bitmapSort(){
    unsigned char *bitmap;    //位圖指針
    bitmap = (unsigned char *)malloc(BYTE_NUM*sizeof(unsigned char));
    if(bitmap == NULL){
        printf("Malloc failed/n");
        return -1;
    }   
    setAllZero(bitmap,BYTE_NUM);//將位圖所有位設置為0
    setBitmap(bitmap,"phoneNumber.txt");//掃描待排文件,將位圖對應位設置為1
    getSorted(bitmap,"bitmapSort.txt");    //掃描位圖,將位圖為1的位號輸出到文件
    free(bitmap);//釋放位圖
    return 0;
}
/***********設置待排序數據的位圖**************/
bool setBitmap(unsigned char *bitmap,char *fileName){
    FILE *readFp;
    printf("Setting bitmap.../n");
    readFp = fopen(fileName,"r");
    if(readFp == NULL)
        return false;   
    long phoneNum=0;
    while(fscanf(readFp,"%ld/n",&phoneNum) != EOF){
        setOne(bitmap,phoneNum);//將    phoneNum位設置為1   
    }
    fclose(readFp);
    return true;
}
/*****順序遍歷位圖輸出記錄,從而實現排序****************/
bool getSorted(unsigned char *bitmap,char *fileName){
    printf("Search bitmap.../n");
    FILE *writeFp;
    writeFp = fopen(fileName,"w");
    if(writeFp == NULL)
        return false;
    long phoneNum=0;
    for(phoneNum = 0; phoneNum < MAX_NUM; phoneNum += 1){
        if(find(bitmap,phoneNum)){
            fprintf(writeFp,"%ld/n",phoneNum);
        }
    }
    fclose(writeFp);
    return true;
}
/******先將位圖清零********/
void setAllZero(unsigned char *bitmap,long size){
    for(long i=0;i<size;i++)
        *(bitmap+i) &= 0;
}
/*************************************************
將指定的位置為1
(loc>>3)相當于整除2^3=8,即定位到字節數,MASK=0x07,loc&MASK相當于loc%8
***************************************************/
void setOne(unsigned char *bitmap,long loc){
    *(bitmap+(loc>>3)) |= (1<<(loc&MASK));//
}

/******查找指定的位是否為1********/
int find(unsigned char *bitmap,long loc){
    return ((*(bitmap+(loc>>3))) & (1<<(loc&MASK))) == (1<<(loc&MASK));   
}
 

 C++的STL中有一個數據結構bitset,操作位圖很方便。

 

復制代碼 代碼如下:

 #include <bitset>
#define MAX_NUM 4000000//最多的數,即需要的位數
using namespace std;

int main(){
    FILE *readFp,*writeFp;
    readFp = fopen("phoneNumber1.txt","r");       
    writeFp = fopen("bitsetSorted.txt","w");   
    bitset<MAX_NUM> bitmap;
    for(long i=0;i<MAX_NUM;i++){//先將位圖初試化為0
        bitmap.set(i,0);
    }
    printf("Begin set bitmap.../n");
    long number = 0;
    while(fscanf(readFp,"%ld/n",&number) != EOF){
        bitmap.set(number,1);//將number所在位設置為1       
    }
    printf("Begin search bitmap.../n");
    for(long i=0;i<MAX_NUM;i++){
        if(bitmap[i] == 1)//將位1的位輸出到已排序文件
            fprintf(writeFp,"%ld/n",number);
    }
    fclose(writeFp);
    fclose(readFp);
}
 

排序算法很快就寫好了,就開始生成測試數據,想生成0―2^31的亂序數據集還真不容易,首先要保證不重復,第二要丟掉40%的數(無效手機號碼),第三要盡可能的亂序,搗了很久,最終還是找到了實現辦法,生成了12GB的數據集,關于生成這個數據集的辦法,歡迎一起討論,我將會在下一篇中總結一下我的方法。
完整的代碼可以參考github。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99热精品| 精品国产乱码久久久久久虫虫漫画| 一区国产精品视频| 欧美精品一区二区三区国产精品| 日韩影视在线观看| 久久免费少妇高潮久久精品99| 亚洲成人激情在线| 亚洲小视频在线观看| 久久人人97超碰精品888| 在线播放日韩欧美| 国产精品自产拍在线观看| 久久精品久久久久久| 欧美成人h版在线观看| 欧美日韩不卡合集视频| 欧美日韩精品在线| 亚洲在线观看视频| 国产精品劲爆视频| 欧美激情一区二区三区在线视频观看| 国产精品最新在线观看| 性欧美激情精品| 亚洲精品久久久久久久久久久| 国产精品视频导航| 国产91精品在线播放| 欧美精品在线观看| 97免费中文视频在线观看| 欧美激情2020午夜免费观看| 国产91免费观看| 欧美插天视频在线播放| 日韩在线视频线视频免费网站| 国产欧美最新羞羞视频在线观看| 欧美日韩亚洲一区二| 欧美成在线观看| 欧美剧在线观看| 国产一区二区三区在线观看视频| 91精品视频在线| 国产精品日日做人人爱| 亚洲国产精品久久久久秋霞不卡| 国产精品久久久久7777婷婷| 精品香蕉一区二区三区| 国产精品电影久久久久电影网| 在线观看日韩av| 久久精品男人天堂| 久久国产精品电影| 亚洲成人网在线观看| 精品网站999www| 久久精品中文字幕| 成人网址在线观看| 91国产高清在线| 国产精品久久久久久搜索| 亚洲视频999| 日韩av在线直播| 日韩中文视频免费在线观看| 97视频在线观看免费| 欧美大全免费观看电视剧大泉洋| 欧美激情一区二区三区成人| 高清日韩电视剧大全免费播放在线观看| 日韩欧美中文字幕在线观看| 欧美激情在线一区| 日韩av电影免费观看高清| 亚洲福利在线观看| 久久欧美在线电影| 亚洲成人精品视频在线观看| 日韩欧美国产中文字幕| 精品久久久国产精品999| 全亚洲最色的网站在线观看| 国产精品免费电影| 91av在线免费观看视频| 亚洲最大av网站| 精品日本美女福利在线观看| 亚洲精品一区二区三区不| 在线色欧美三级视频| 欧美在线视频在线播放完整版免费观看| 精品久久久久人成| 亚洲美女福利视频网站| 欧美成人一区在线| 在线观看久久久久久| 亚洲成人网在线观看| 亚洲欧美精品suv| 国模gogo一区二区大胆私拍| 欧洲日本亚洲国产区| 亚洲最新在线视频| 精品久久久久久久久久久久久| 最新国产成人av网站网址麻豆| 国产精品久久在线观看| 丁香五六月婷婷久久激情| 国产精品自产拍在线观看| 亚洲欧洲国产精品| 国产69久久精品成人| 欧美日韩中文在线观看| 久久99久国产精品黄毛片入口| 91系列在线观看| 欧美精品情趣视频| 久久精品成人欧美大片古装| 2018国产精品视频| 北条麻妃一区二区在线观看| 亚洲激情小视频| 欧亚精品在线观看| 26uuu国产精品视频| 夜夜嗨av色综合久久久综合网| 国产精品爱久久久久久久| 久久网福利资源网站| 国产精品午夜一区二区欲梦| 亚洲欧美中文字幕| 欧美做爰性生交视频| 国产欧美一区二区三区久久| 中文字幕亚洲综合久久筱田步美| 一二美女精品欧洲| 欧美视频中文在线看| 亚洲精品欧美一区二区三区| 日韩精品免费看| 成人两性免费视频| 色偷偷88888欧美精品久久久| 亚洲欧美日韩图片| 亚洲色图第一页| 亚洲欧美自拍一区| 色综合色综合久久综合频道88| 国产成人一区二区三区| 亚洲香蕉在线观看| 成人亚洲欧美一区二区三区| 中文精品99久久国产香蕉| 欧美最猛性xxxxx免费| 日韩精品免费看| 久久精品国产亚洲一区二区| 国产精品27p| 亚洲片国产一区一级在线观看| 欧美一级电影久久| 国产噜噜噜噜噜久久久久久久久| 亚洲在线视频福利| 91精品综合久久久久久五月天| 亚洲精品一区二区在线| 国产精品网址在线| 欧美性受xxxx黑人猛交| 久久综合国产精品台湾中文娱乐网| 亚洲国产精品va在线看黑人| 高清日韩电视剧大全免费播放在线观看| 97久久精品视频| 亚洲自拍另类欧美丝袜| 伊人久久免费视频| 国产精品视频99| 日韩高清电影免费观看完整| 17婷婷久久www| 国产精品免费看久久久香蕉| 欧美成aaa人片在线观看蜜臀| 久久精品视频va| 久久久av亚洲男天堂| 欧美午夜女人视频在线| 亚洲欧美中文日韩在线v日本| 国产精品福利无圣光在线一区| 91精品视频网站| 国产欧美日韩91| 成人精品视频在线| 久久精品国亚洲| 伊是香蕉大人久久| 欧美大片免费观看在线观看网站推荐| 欧美剧在线观看| 国产一区二区欧美日韩| 高清一区二区三区日本久| 午夜精品久久17c| 久久国产加勒比精品无码| 久久艹在线视频| 国产婷婷色综合av蜜臀av| 午夜精品一区二区三区在线播放| 久久99精品国产99久久6尤物| 国产精品高清在线|