一種大資料外部排序(記憶體無法載入所有排序元素)、去除重複元素、快速找到隨機被刪除元素的bitmap小演算法,核心思想即通過將乙個數作為下標(index)來索引乙個bit表示乙個數是否存在,排序時的時間複雜度為o(n),需要的額外空間的複雜度o(n/8),支援整個int範圍(正負數都支援)的演算法示例如下:
char bitmask = ;
int writenumberbittobyte(char *bytearra , unsigned int bytearrasize , int number)
int basearrabitpos = bytearrasize *4; //bytearrasize *8 /2
basearrabitpos+=number;
printf("basearrabitpos=%d,number=%d\n",basearrabitpos,number);
bytearra[basearrabitpos/8] |= mask[basearrabitpos%8];
return 1; //success
}int isnumberbitinbyte(char *bytearra , unsigned int bytearrasize , int number)
int basearrabitpos = bytearrasize *4; //bytearrasize *8 /2
basearrabitpos+=number;
if (bytearra[basearrabitpos/8] & bitmask[basearrabitpos%8])
return 0; //number not found.
}void printorderedbitmap(char *bitmap,unsigned int bitmapcount)
} printf("\n");
}int main()
; int maximumvalue =arra[0],minmumvalue=arra[0];
for (int i = 0; i < sizeof(arra)/sizeof(arra[0]); ++i) }
maximumvalue=maximumvalue<0?-maximumvalue:maximumvalue;
minmumvalue=minmumvalue<0?-minmumvalue:minmumvalue;
maximumvalue=maximumvalue>minmumvalue?maximumvalue:minmumvalue;
printf("maximumvalue=%d\n",maximumvalue);
//unsigned int bitmapcount = (maximumvalue*2+7)/8;
unsigned int bitmapcount = (maximumvalue+3)/4;
bitmapcount = bitmapcount>0?bitmapcount:1;
char *bitmap = (char*)malloc(bitmapcount);
for (int i = 0; i < sizeof(arra)/sizeof(arra[0]); ++i)
printorderedbitmap(bitmap,bitmapcount);
}
僅支援unsigned int範圍的演算法示例如下:
char bitmask = ;
int writenumberbittobyte(char *bytearra , unsigned int bytearrasize , unsigned int number)
int bytepos = number / 8;
int bitpos = number % 8;
bytearra[bytepos] |= bitmask[bitpos];
return 1; //success
}int isnumberbitinbyte(char *bytearra , unsigned int bytearrasize , unsigned int number)
int bytepos = number / 8;
int bitpos = number % 8;
if (bytearra[bytepos] & bitmask[bitpos])
return 0; //number not found.
}
上面的演算法都是用乙個bit來表示乙個數,即只有2種可能,要麼有,要麼無,可以擴充套件到乙個位元組表示乙個數,這樣就可以統計出現255次範圍內的重複元素,原理以此類推。
另外用bit來表示乙個int數,節約了31倍的記憶體空間,即int(4*8),bit(8/1),所以資料量越來使用這種方式的優勢越明顯,前提是場景適用這種方式。
大資料處理 Bitmap
mapreduce是一種程式設計模型,用於大規模資料集 大於1tb 的並行運算。概念 map 對映 和 reduce 歸約 bit map空間壓縮和快速排序去重 1.bit map的基本思想 32位機器上,對於乙個整型數,比如int a 1 在記憶體中佔32bit位,這是為了方便計算機的運算。但是對...
大資料處理時的字串處理
最近在做文字的shingles時,遇到了乙個問題,希望把每個句子按照5個字元一組進行map,因此碰到了字串分割的問題,這裡羅列三種方法 split substring stringtokenize 上網調查了一下,stringtokenize效能最優,substring其次,split最差。但是!請...
一種基於策略模式實現的資料處理流程模組
本人基於策略模式實現了一種資料處理流程模組,該模組可在qt環境下直接使用。模組支援資料處理流程的定製化,目前提供濾波 公式計算 fft三種資料處理方式,可根據實際需求進行處理方式的組合新增以及排序。模組提供了一種資料處理流程框架,實現上採用的是策略設計模式,支援處理方式的擴充套件,可應用於需要對資料...