海量數(shù)據(jù)處理系列之:用C++實現(xiàn)Bitmap算法
bitmap是一個十分有用的結(jié)構(gòu)。所謂的Bit-map就是用一個bit位來標(biāo)記某個元素對應(yīng)的Value, 而Key即是該元素。由于采用了Bit為單位來存儲數(shù)據(jù),因此在存儲空間方面,可以大大節(jié)省。
適用范圍:可進(jìn)行數(shù)據(jù)的快速查找,判重,刪除,一般來說數(shù)據(jù)范圍是int的10倍以下
基本原理及要點:使用bit數(shù)組來表示某些元素是否存在,比如8位電話號碼
擴(kuò)展:bloom filter可以看做是對bit-map的擴(kuò)展
問題實例:
1)已知某個文件內(nèi)包含一些電話號碼,每個號碼為8位數(shù)字,統(tǒng)計不同號碼的個數(shù)。
8位最多99 999 999,大概需要99m個bit,大概10幾m字節(jié)的內(nèi)存即可。
2)2.5億個整數(shù)中找出不重復(fù)的整數(shù)的個數(shù),內(nèi)存空間不足以容納這2.5億個整數(shù)。
將bit-map擴(kuò)展一下,用2bit表示一個數(shù)即可,0表示未出現(xiàn),1表示出現(xiàn)一次,2表示出現(xiàn)2次及以上?;蛘呶覀儾挥?bit來進(jìn)行表示,我們用兩個bit-map即可模擬實現(xiàn)這個2bit-map。
下面是一個簡單的Bitmap的實現(xiàn):
#include "stdafx.h"
#include <iostream>
using namespace std;
char *g_bitmap = NULL;
int g_size = 0;
int g_base = 0;
//功能:初始化bitmap
//參數(shù): size:bitmap的大小,即bit位的個數(shù)
// start:起始值
//返回值:0表示失敗,1表示成功
int bitmap_init(int size, int start)
{
g_size = size/8+1;
g_base = start;
g_bitmap = new char[g_size];
if(g_bitmap == NULL)
{
return 0;
}
memset(g_bitmap, 0x0, g_size);
return 1;
}
//功能:將值index的對應(yīng)位設(shè)為1
//index:要設(shè)的值
//返回值:0表示失敗,1表示成功
int bitmap_set(int index)
{
int quo = (index-g_base)/8 ; //確定所在的字節(jié)
int remainder = (index-g_base)%8; //字節(jié)內(nèi)的偏移
unsigned char x = (0x1<<remainder);
if( quo > g_size)
return 0;
g_bitmap[quo] |= x; //所在字節(jié)內(nèi)的特定位置為1
return 1;
}
//功能:取bitmap第i位的值
//i:待取位
//返回值:-1表示失敗,否則返回對應(yīng)位的值
int bitmap_get(int i)
{
int quo = (i)/8 ;
int remainder = (i)%8;
unsigned char x = (0x1<<remainder);
unsigned char res;
if( quo > g_size)
return -1;
res = g_bitmap[quo] & x;
return res > 0 ? 1 : 0;
}
//功能:返回index位對應(yīng)的值
int bitmap_data(int index)
{
return (index + g_base);
}
//釋放內(nèi)存
int bitmap_free()
{
delete [] g_bitmap;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {5,8,7,6,3,1,10,78,56,34,23,12,43,54,65,76,87,98,89,100};
int i;
bitmap_init(100, 0);
for(i=0; i<20; i++)
{
bitmap_set(a[i]);
}
for(i=0; i<=100; i++)
{
if(bitmap_get(i) > 0 )
cout << bitmap_data(i)<< " ";
}
cout << endl;
bitmap_free();
return 0;
}
【問題實例】
1)已知某個文件內(nèi)包含一些電話號碼,每個號碼為8位數(shù)字,統(tǒng)計不同號碼的個數(shù)。
8位最多99 999 999,大概需要99m個bit,大概10幾m字節(jié)的內(nèi)存即可。 (可以理解為從0-99 999 999的數(shù)字,每個數(shù)字對應(yīng)一個Bit位,所以只需要99M個Bit==1.2MBytes,這樣,就用了小小的1.2M左右的內(nèi)存表示了所有的8位數(shù)的電話)
2)2.5億個整數(shù)中找出不重復(fù)的整數(shù)的個數(shù),內(nèi)存空間不足以容納這2.5億個整數(shù)。
將bit-map擴(kuò)展一下,用2bit表示一個數(shù)即可,0表示未出現(xiàn),1表示出現(xiàn)一次,2表示出現(xiàn)2次及以上,在遍歷這些數(shù)的時候,如果對應(yīng)位置的值是0,則將其置為1;如果是1,將其置為2;如果是2,則保持不變?;蛘呶覀儾挥?bit來進(jìn)行表示,我們用兩個bit-map即可模擬實現(xiàn)這個 2bit-map,都是一樣的道理。
欄 目:C語言
下一篇:深入C++中構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、賦值操作符、析構(gòu)函數(shù)的調(diào)用過程總結(jié)
本文標(biāo)題:海量數(shù)據(jù)處理系列之:用C++實現(xiàn)Bitmap算法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4420.html
您可能感興趣的文章
- 01-10C++算法之海量數(shù)據(jù)處理方法的總結(jié)分析
- 01-10解析bitmap處理海量數(shù)據(jù)及其實現(xiàn)方法分析
- 01-10php5系列的apache遠(yuǎn)程執(zhí)行漏洞攻擊腳本
- 01-10C++ 頭文件系列(set)詳解
- 01-10簡單談?wù)凜++ 頭文件系列之(iosfwd)
- 01-10簡單談?wù)凜++ 頭文件系列之(bitset)
- 01-10簡單談?wù)凜++ 頭文件系列之(algorithm)
- 01-10淺談使用C++多級指針存儲海量qq號和密碼
- 01-10C++算法系列之日歷生成的算法代碼
- 01-10C++算法系列之中國農(nóng)歷的算法


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結(jié)
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?