最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

海量數(shù)據(jù)處理系列之:用C++實(shí)現(xiàn)Bitmap算法

 更新時間:2013年05月29日 09:37:25   作者:  
本篇文章是對用C++實(shí)現(xiàn)Bitmap算法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
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倍以下
基本原理及要點(diǎn):使用bit數(shù)組來表示某些元素是否存在,比如8位電話號碼
擴(kuò)展:bloom filter可以看做是對bit-map的擴(kuò)展
問題實(shí)例:
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即可模擬實(shí)現(xiàn)這個2bit-map。
下面是一個簡單的Bitmap的實(shí)現(xiàn):
復(fù)制代碼 代碼如下:

#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; 


【問題實(shí)例】
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即可模擬實(shí)現(xiàn)這個 2bit-map,都是一樣的道理。

相關(guān)文章

  • C++使用UDP通訊的實(shí)現(xiàn)示例

    C++使用UDP通訊的實(shí)現(xiàn)示例

    本文實(shí)現(xiàn)對C++使用UDP做了簡單封裝,實(shí)現(xiàn)通訊,包括服務(wù)端和客戶端,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • EasyC++靜態(tài)持續(xù)變量

    EasyC++靜態(tài)持續(xù)變量

    這篇文章主要介紹了EasyC++靜態(tài)持續(xù)變量,除了自動存儲變量之后,C++當(dāng)中還有靜態(tài)持續(xù)變量。關(guān)于靜態(tài)持續(xù)變量的定義C++和C語言是一樣的,它擁有三種鏈接性,即外部鏈接性、內(nèi)部連接性和無鏈接性,下面一起進(jìn)入文章了解更具體內(nèi)容吧
    2021-12-12
  • 詳解用C語言實(shí)現(xiàn)三子棋游戲流程

    詳解用C語言實(shí)現(xiàn)三子棋游戲流程

    三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了
    2021-11-11
  • C++中各種可調(diào)用對象深入講解

    C++中各種可調(diào)用對象深入講解

    這篇文章主要給大家介紹了關(guān)于C++中各種可調(diào)用對象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • c語言判斷是否素數(shù)程序代碼

    c語言判斷是否素數(shù)程序代碼

    這篇文章主要介紹了c語言判斷是否素數(shù)的方法和問題,大家參考使用吧
    2013-11-11
  • Qt中Tab與Tree組件實(shí)現(xiàn)分頁菜單

    Qt中Tab與Tree組件實(shí)現(xiàn)分頁菜單

    本文主要介紹tabWidget選擇夾組件與TreeWidget樹形選擇組件的常用方法及靈活運(yùn)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • C++中鏈表操作實(shí)例分析

    C++中鏈表操作實(shí)例分析

    本文給大家分享了個人對于C++中鏈表操作的理解,并對具體實(shí)例進(jìn)行了分析,是篇非常不錯的學(xué)習(xí)鏈表操作的文章,希望大家能夠喜歡
    2017-07-07
  • C語言計算代碼執(zhí)行所耗CPU時鐘周期

    C語言計算代碼執(zhí)行所耗CPU時鐘周期

    本文給大家介紹的是使用C語言來計算代碼執(zhí)行所耗CPU時鐘周期的代碼,非常的簡單實(shí)用,不過要依托于sync,有需要的小伙伴自己參考下吧。
    2015-03-03
  • Qt實(shí)現(xiàn)進(jìn)程界面之間的鼠標(biāo)焦點(diǎn)切換

    Qt實(shí)現(xiàn)進(jìn)程界面之間的鼠標(biāo)焦點(diǎn)切換

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)進(jìn)程界面之間的鼠標(biāo)焦點(diǎn)切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 淺談mwArray和一般數(shù)組的區(qū)別

    淺談mwArray和一般數(shù)組的區(qū)別

    下面小編就為大家?guī)硪黄獪\談mwArray和一般數(shù)組的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12

最新評論

汉寿县| 昭苏县| 理塘县| 临洮县| 连州市| 美姑县| 三门峡市| 浦东新区| 沧州市| 舒城县| 木兰县| 刚察县| 山西省| 瓮安县| 雷波县| 哈尔滨市| 岑巩县| 江津市| 琼海市| 罗江县| 墨脱县| 高州市| 花垣县| 吉木萨尔县| 介休市| 仙桃市| 仁化县| 杭锦旗| 盐亭县| 尉犁县| 万年县| 紫云| 大渡口区| 泰来县| 衡东县| 宁河县| 林州市| 石棉县| 峨眉山市| 阿瓦提县| 新营市|