欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++如何實現(xiàn)BitMap數(shù)據(jù)結(jié)構(gòu)

 更新時間:2022年07月22日 15:23:09   作者:yanerhao  
這篇文章主要介紹了C++如何實現(xiàn)BitMap數(shù)據(jù)結(jié)構(gòu),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

分治,分布式。BitMap(位圖)及其升級版bloom filter是處理海量數(shù)據(jù)常用的方法,這里先介紹BitMap概念及其c++實現(xiàn)。

一、BitMap位圖

該數(shù)據(jù)結(jié)構(gòu)描述了一個有限定義域內(nèi)的稠密集合,其中的每一個元素最多出現(xiàn)一次并且沒有其他任何數(shù)據(jù)與該元素相關(guān)聯(lián)。

即使這些條件沒有完全滿足(例如,存在重復(fù)元素或額外的數(shù)據(jù)),也可以用有限定義域內(nèi)的鍵作為一個表項更復(fù)雜的表格索引。

所謂的Bit-map就是用一個bit位來標記某個元素對應(yīng)的Value, 而Key即是該元素。

由于采用了Bit為單位來存儲數(shù)據(jù),因此在存儲空間方面,可以大大節(jié)省。

例如假設(shè)我們要對0-7內(nèi)的5個元素(4,7,2,5,3)排序(這里假設(shè)這些元素沒有重復(fù))。

那么我們就可以采用Bit-map的方法來達到排序的目的。

要表示8個數(shù),我們就只需要8個Bit(1Bytes),首先我們開辟1Byte的空間,將這些空間的所有Bit位都置為0,

如下圖:

遍歷第一個元素4,則在第4為標1:

以此來推,遍歷完所有后結(jié)構(gòu):

我們現(xiàn)在遍歷一遍Bit區(qū)域,將該位是bit 1的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。

二、C++實現(xiàn)

我們可以用一個unsigned int類型的數(shù)組或者向量來表示位圖,假設(shè)我們定義vector<unsigned int> a,則 第i位可表示為a[i/32]的i%32位(其中,32*N+r = i,r為i%32,也就是i/32的余數(shù))。

由于計算機對位的操作比乘除法更有效率,這里計算i/32可以用位移操作:i>>5;計算i%32可以用1&31

若是一個char數(shù)組str,則str的第i位為i/8(i>>3)地址塊的第i%8(i&7)位.下面以char為例說明,int類比可知。

#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
class BitMap{
private:
        char *bitmap;
        int gsize;
public:
       BitMap(){
       gsize=(10000>>3)+1;//default 10000
       bitmap= new char[gsize];
       memset(bitmap,0,sizeof(bitmap));
                }
       BitMap(int n){
       gsize=(n>>3)+1;
       bitmap=new char[gsize];
       memset(bitmap,0,sizeof(bitmap));
                  }
       ~BitMap(){delete []bitmap;}
       int get(int x){
       int cur=x>>3;
       int red=x&7;
       if(cur>gsize)return -1;
       return (bitmap[cur]&=1>>red); 
                      }
       bool set(int x){
       int cur=x>>3;//獲取元素位置,除8得到哪個元素,x/2^3得到那一個byte 
       int red=x&(7);//邏輯與,獲取進準位置,x&7==x%8.該Byte里第幾個 
       if(cur>gsize)return 0;
       bitmap[cur]|=1>>red;//賦值,1向右移動red位,|表示該位賦值1
       return 1; 
                       }
};

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于C++ bitset常用函數(shù)及運算符(詳解)

    基于C++ bitset常用函數(shù)及運算符(詳解)

    下面小編就為大家?guī)硪黄贑++ bitset常用函數(shù)及運算符(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法時間空間復(fù)雜度基礎(chǔ)實踐

    C語言數(shù)據(jù)結(jié)構(gòu)與算法時間空間復(fù)雜度基礎(chǔ)實踐

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)與算法中時間空間復(fù)雜度的基礎(chǔ)實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • strcat函數(shù)與strncat函數(shù)的深入分析

    strcat函數(shù)與strncat函數(shù)的深入分析

    本篇文章是對strcat函數(shù)與strncat函數(shù)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • VC中CWinThread類以及和createthread API的區(qū)別分析

    VC中CWinThread類以及和createthread API的區(qū)別分析

    這篇文章主要介紹了VC中CWinThread類以及和createthread API的區(qū)別分析,較為詳細的講述了CWinThread類的原理,并以實例形式對AfxBeginThread函數(shù)的內(nèi)部實現(xiàn)進行了解釋說明,需要的朋友可以參考下
    2014-10-10
  • C/C++實現(xiàn)線性順序表的示例代碼

    C/C++實現(xiàn)線性順序表的示例代碼

    使用順序存儲結(jié)構(gòu)的線性存儲結(jié)構(gòu)的表為線性順序表。本文將分別利用C語言和C++實現(xiàn)線性順序表,文中示例代碼講解詳細,需要的可以參考一下
    2022-05-05
  • 在C++中關(guān)于友元函數(shù)的進一步理解

    在C++中關(guān)于友元函數(shù)的進一步理解

    今天小編就為大家分享一篇關(guān)于在C++中關(guān)于友元函數(shù)的進一步理解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言中sizeof函數(shù)踩過的坑總結(jié)

    C語言中sizeof函數(shù)踩過的坑總結(jié)

    sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它并不是函數(shù)。sizeof操作符以字節(jié)形式給出了其操作數(shù)的存儲大小。操作數(shù)可以是一個表達式或括在括號內(nèi)的類型名。操作數(shù)的存儲大小由操作數(shù)的類型決定
    2022-04-04
  • C語言之選擇分支語句詳解

    C語言之選擇分支語句詳解

    大家好,本篇文章主要講的是C語言之選擇分支語句詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • c語言實現(xiàn)http下載器的方法

    c語言實現(xiàn)http下載器的方法

    這篇文章主要介紹了c語言實現(xiàn)http下載器的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • C語言如何改變字體顏色

    C語言如何改變字體顏色

    這篇文章主要介紹了C語言如何改變字體顏色,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論