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

首頁 > 編程 > C > 正文

解析bitmap處理海量數據及其實現方法分析

2020-01-26 16:04:17
字體:
來源:轉載
供稿:網友
【什么是Bit-map】
所謂的Bit-map就是用一個bit位來標記某個元素對應的Value, 而Key即是該元素。由于采用了Bit為單位來存儲數據,因此在存儲空間方面,可以大大節省。
如果說了這么多還沒明白什么是Bit-map,那么我們來看一個具體的例子,假設我們要對0-7內的5個元素(4,7,2,5,3)排序(這里假設這些元素沒有重復)。那么我們就可以采用Bit-map的方法來達到排序的目的。要表示8個數,我們就只需要8個Bit(1Bytes),首先我們開辟1Byte的空間,將這些空間的所有Bit位都置為0(如下圖:)
 
然后遍歷這5個元素,首先第一個元素是4,那么就把4對應的位置為1(可以這樣操作 p+(i/8)|(0x01<<(i%8)) 當然了這里的操作涉及到Big-ending和Little-ending的情況,這里默認為Big-ending),因為是從零開始的,所以要把第五位置為一(如下圖): 


然后再處理第二個元素7,將第八位置為1,,接著再處理第三個元素,一直到最后處理完所有的元素,將相應的位置為1,這時候的內存的Bit位的狀態如下: 


然后我們現在遍歷一遍Bit區域,將該位是一的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。下面的代碼給出了一個BitMap的用法:排序。
復制代碼 代碼如下:

//定義每個Byte中有8個Bit位  
#include <memory.h> 
#define BYTESIZE 8 
void SetBit(char *p, int posi)  
{  
    for(int i=0; i < (posi/BYTESIZE); i++)  
    {  
        p++;  
    }  

    *p = *p|(0x01<<(posi%BYTESIZE));//將該Bit位賦值1 
    return;  
}  

void BitMapSortDemo()  
{  
    //為了簡單起見,我們不考慮負數 
    int num[] = {3,5,2,10,6,12,8,14,9};  

    //BufferLen這個值是根據待排序的數據中最大值確定的 
    //待排序中的最大值是14,因此只需要2個Bytes(16個Bit) 
    //就可以了。  
    const int BufferLen = 2;  
    char *pBuffer = new char[BufferLen];  

    //要將所有的Bit位置為0,否則結果不可預知。 
    memset(pBuffer,0,BufferLen);  
    for(int i=0;i<9;i++)  
    {  
        //首先將相應Bit位上置為1 
        SetBit(pBuffer,num[i]);  
    }  

    //輸出排序結果  
    for(int i=0;i<BufferLen;i++)//每次處理一個字節(Byte) 
    {  
        for(int j=0;j<BYTESIZE;j++)//處理該字節中的每個Bit位 
        {  
            //判斷該位上是否是1,進行輸出,這里的判斷比較笨。 
            //首先得到該第j位的掩碼(0x01<<j),將內存區中的 
            //位和此掩碼作與操作。最后判斷掩碼是否和處理后的 
            //結果相同 
            if((*pBuffer&(0x01<<j)) == (0x01<<j))  
            {  
                printf("%d ",i*BYTESIZE + j);  
            }  
        }  
        pBuffer++;  
    }  
}  

int _tmain(int argc, _TCHAR* argv[])  
{  
    BitMapSortDemo();  
    return 0;  


【適用范圍】
可進行數據的快速查找,判重,刪除,一般來說數據范圍是int的10倍以下
【基本原理及要點】
使用bit數組來表示某些元素是否存在,比如8位電話號碼
【擴展】
Bloom filter可以看做是對bit-map的擴展
【問題實例】
1)已知某個文件內包含一些電話號碼,每個號碼為8位數字,統計不同號碼的個數。
8位最多99 999 999,大概需要99m個bit,大概10幾m字節的內存即可。 (可以理解為從0-99 999 999的數字,每個數字對應一個Bit位,所以只需要99M個Bit==1.2MBytes,這樣,就用了小小的1.2M左右的內存表示了所有的8位數的電話)
2)2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。
將bit-map擴展一下,用2bit表示一個數即可,0表示未出現,1表示出現一次,2表示出現2次及以上,在遍歷這些數的時候,如果對應位置的值是0,則將其置為1;如果是1,將其置為2;如果是2,則保持不變?;蛘呶覀儾挥?bit來進行表示,我們用兩個bit-map即可模擬實現這個2bit-map,都是一樣的道理。
bitmap的C語言實現
復制代碼 代碼如下:

bitmap.h 

/*
 *bitmap的c語言實現 
*/ 
#ifndef _BITMAP_H_ 
#define _BITMAP_H_ 

/*
 *功能:初始化bitmap
 *參數:
 *size:bitmap的大小,即bit位的個數
 *start:起始值
 *返回值:0表示失敗,1表示成功
 */ 
int bitmap_init(int size, int start); 

/*
 *功能:將值index的對應位設為1
 *index:要設的值
 *返回值:0表示失敗,1表示成功
 */ 
int bitmap_set(int index); 

/*
 *功能:取bitmap第i位的值
 *i:待取位
 *返回值:-1表示失敗,否則返回對應位的值
 */ 
int bitmap_get(int i); 

/*
 *功能:返回index位對應的值
 */ 
int bitmap_data(int index); 

/*釋放內存*/ 
int bitmap_free(); 

#endif 

bitmap.c 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "bitmap.h" 

unsigned char *g_bitmap = NULL; 
int g_size = 0; 
int g_base = 0; 

int bitmap_init(int size, int start) 

    g_bitmap = (char *)malloc((size/8+1)*sizeof(char)); 
    if(g_bitmap == NULL) 
        return 0; 
    g_base = start; 
    g_size = size/8+1; 
    memset(g_bitmap, 0x0, g_size); 
    return 1; 


int bitmap_set(int index) 

    int quo = (index-g_base)/8 ; 
    int remainder = (index-g_base)%8; 
    unsigned char x = (0x1<<remainder); 
    if( quo > g_size) 
        return 0; 
    g_bitmap[quo] |= x; 
    return 1;  


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;  


int bitmap_data(int index) 

    return (index + g_base); 


int bitmap_free() 

    free(g_bitmap); 


測試程序bitmap_test.c: 

#include <stdio.h> 
#include "bitmap.h" 

int main() 

    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 ) 
            printf("%d ", bitmap_data(i)); 
    } 
    printf("/n"); 
    bitmap_free(); 
    return 0; 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情手机在线视频| 国产一区二区三区18| 亚洲电影在线看| 日韩亚洲欧美中文在线| 成人国产在线激情| 中文字幕亚洲欧美一区二区三区| 日韩中文字幕精品视频| 91精品国产91久久| 亚洲精品狠狠操| 久久久亚洲成人| 欧美日韩色婷婷| 成人激情综合网| 欧美日韩xxxxx| 亚洲精品久久久久久久久久久久| 黑人欧美xxxx| 97精品免费视频| 在线视频一区二区| 亚洲激情成人网| 91欧美视频网站| 久久精品99国产精品酒店日本| 国产一区二区视频在线观看| 在线电影av不卡网址| 国产精品第二页| 欧美色播在线播放| 欧美亚洲国产日本| 日韩国产一区三区| 91精品国产91久久久久| 亚洲免费视频网站| 欧美日韩精品中文字幕| 国产精品亚洲一区二区三区| 岛国视频午夜一区免费在线观看| 亚洲欧美色婷婷| 国产精品成久久久久三级| 国产成人精品一区| 日韩高清av在线| 国产精品v日韩精品| 欧美视频一区二区三区…| 欧美在线一区二区视频| 国产精品久久久久久网站| 日韩视频永久免费观看| 日韩欧美在线免费| 亚洲永久免费观看| 77777亚洲午夜久久多人| 欧美xxxx18国产| 国产国语刺激对白av不卡| 中文字幕国产亚洲| 欧美日韩国产色| 波霸ol色综合久久| 日韩av在线免费播放| 九九精品在线播放| 国产精品99久久久久久白浆小说| 久久精品国产69国产精品亚洲| 日韩有码视频在线| 高清一区二区三区日本久| 亚洲а∨天堂久久精品喷水| 亚洲伊人一本大道中文字幕| 国产成人+综合亚洲+天堂| 成人免费大片黄在线播放| 国产亚洲欧洲在线| 欧美专区在线视频| 欧洲s码亚洲m码精品一区| 91热精品视频| 国产视频精品xxxx| 日韩在线观看免费全| 在线中文字幕日韩| 日韩欧美亚洲范冰冰与中字| 国产欧美韩国高清| 国产女精品视频网站免费| 欧美亚洲在线播放| 中文字幕欧美日韩va免费视频| 美女av一区二区| 91久久精品国产91久久| 国产精品久久网| 午夜精品一区二区三区在线播放| 日韩在线观看免费| 亚洲美女自拍视频| 国产精品视频区1| 最近2019年手机中文字幕| 欧美精品在线观看91| 日韩av在线影视| 欧美激情免费在线| 色老头一区二区三区在线观看| 日韩免费观看高清| 欧美另类极品videosbestfree| 国产精品免费久久久| 欧美性一区二区三区| 亚洲天堂免费在线| 国产精品久久久久久av| 欧美在线观看日本一区| 亚洲欧美综合区自拍另类| 国产精品∨欧美精品v日韩精品| 久久人人爽人人| 亚洲欧美日韩久久久久久| 亚洲性69xxxbbb| 在线精品视频视频中文字幕| 久久在线视频在线| 国产精品高清免费在线观看| 九九热这里只有精品免费看| 色噜噜亚洲精品中文字幕| 69av在线播放| 久久影院在线观看| 久久99国产综合精品女同| 国产91精品不卡视频| 欧美自拍视频在线| 欧美大片在线免费观看| 欧美性色19p| 色老头一区二区三区| 怡红院精品视频| 精品欧美国产一区二区三区| 一区二区三区回区在观看免费视频| 国产精品成人av性教育| 国产精品电影久久久久电影网| 日韩资源在线观看| 亚洲影视九九影院在线观看| 日韩有码视频在线| 成人高清视频观看www| 欧美国产视频日韩| 亚洲精品理论电影| 国产亚洲欧美日韩精品| 国产亚洲欧洲黄色| 国产欧美日韩精品在线观看| 国产精品久久久久久婷婷天堂| 尤物九九久久国产精品的分类| 日韩av电影在线免费播放| 亚洲国产精品悠悠久久琪琪| 国产视频久久久久久久| 色狠狠久久aa北条麻妃| 在线视频欧美日韩| 久久久久久久影视| 茄子视频成人在线| 亚洲色图50p| 亚洲bt天天射| 国产日韩欧美一二三区| 久久成人国产精品| 精品自拍视频在线观看| 国产精品视频导航| 欧美精品videossex88| 亚洲第一网站免费视频| 91热福利电影| 97色在线播放视频| 亚洲精品午夜精品| 日本三级久久久| 国产精品欧美一区二区三区奶水| 亚洲香蕉伊综合在人在线视看| 国产视频精品xxxx| 精品无人区乱码1区2区3区在线| 久久久国产在线视频| 国产精品久久综合av爱欲tv| 懂色av影视一区二区三区| 亚洲精品久久久久久久久久久久久| 不卡av电影院| 日本久久亚洲电影| 亚洲欧美国产制服动漫| 亚洲国产精品一区二区三区| 不卡中文字幕av| 欧美一级片在线播放| 欧美精品在线免费播放| 欧美日韩国产限制| 国产99久久精品一区二区永久免费| 菠萝蜜影院一区二区免费| 国产精品自拍网| 亚洲欧美日韩在线一区| 国产成人+综合亚洲+天堂| 日本精品va在线观看|