BitMap的原理介绍与实现

BitMap

位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用。位图是通过将数组下标与应用中的一些值关联映射,数组中该下标所指定的位置上的元素可以用来标识应用中值的情况(是否存在或者数目 或者计数等),位图数组中每个元素在内存中占用1位,所以可以节省存储空间。位图是一种非常简洁快速的数据结构,它能同时使存储空间和速度最优化。如可用一个10位长的字符串来表示一个所有元素都小于10的简单的非负整数集合,例如,可以用如下字符串表示集合{1,2,4,5,8} ,对应位置数字存在标记为1,否则标记为0。

这里BitMap指的是把数据存放在一个以bit为单位的数据结构里。
每位都只有0和1两个值。为0的时候,证明值不存在,为1的时候说明存在。

举例来说:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

这是24位,也就是24bit, 同时8bit为1个字节。这里的空间也就是3个字节。

这个时候假如我们要存放2 4 6 8 9 10 17 19 21这些数字到我们的BitMap里,我们只需把对应的位设置为1就可以了。

[0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0]

数据结构

假如,我们要存储的数据范围为0-15,这里的数据是16bit:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
[0  0  0  0  0  0 0 0 0 0 0 0 0 0 0 0]

数据为[5, 1, 7, 15, 0, 4, 6, 10]

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
[1  0  0  0  0  1 0 0 1 1 1 1 0 0 1 1]

例如:

申请一个int型的内存空间,则有4Byte,32bit。输入 4, 2, 1, 3时:

输入4:

[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]

输入2:

[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0]

输入1:

[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0]

输入3:

[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0]

map映射表

假设需要排序或者查找的总数N=10000000,那么我们需要申请的内存空间为 int a[N/32 + 1].其中a[0]在内存中占32位,依此类推:

bitmap表为:

a[0] ——> 0 - 31

a[1] ——> 32 - 63

a[2] ——> 64 - 95

a[3] ——> 96 - 127

……

位移转换

  • 求十进制数0-N对应的在数组a中的下标
    公式:index = N / 32即可,index即为对应的数组下标。例如N = 76, 则index = 76 / 32 = 2,因此76在a[2]中。

  • 求十进制数0-N对应的bit位
    bit = N % 32即可,例如 N = 76, bit = 76 % 32 = 12

  • 利用移位0-31使得对应的32bit位为1

代码实现

##include <iostream>
#include <vector>using namespace std;class BitMap
{
public:BitMap( int range ){//开辟空间this->m_bits.resize(range / 32 + 1);}void set( int data ){int index = data / 32; //数组索引即区间int temp = data % 32; //具体位置索引this->m_bits[index] |= ( 1 << temp); //左移4位置为1}void reset( int data){int index = data / 32;int temp = data % 32;this->m_bits[index] &= ~( 1 << temp ); //取反}bool test(int data){int index = data / 32;int temp = data % 32;if( this->m_bits[index]&( 1 << temp)){return true;}else{return false;}}private:vector<int> m_bits;
};void testBitMap()
{BitMap bitmap_1(-1);BitMap bitmap_2(31);bitmap_2.set(16);bitmap_2.set(1);cout<< bitmap_2.test(16) << endl;bitmap_2.reset(16);cout<< bitmap_2.test(16) << endl;
}int main()
{testBitMap();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL与PHP连接

1、mysql_connect()-建立数据库连接 格式&#xff1a; resource mysql_connect([string hostname [:port] [:/path/to/socket] [, string username] [, string password]]) 例&#xff1a; $conn mysql_connect("localhost", "username", "pa…

QML Profiler性能优化教程

QML Profiler 2018年1月26日 vincent 对于一个程序的开发&#xff0c;性能优化是开发中的一个重要步骤。 我们肯定不希望开发出来的程序表现出卡顿&#xff0c;最好是处处流畅&#xff0c;丝滑般的体验。 对于C程序&#xff0c;我们有很多方法可以做性能优化&#xff0c;例如…

uburntu在不能自动获取网络时的联网设置

一&#xff1a;网络基础配置 1. eth0设置不正确&#xff0c;导致无法正常启动&#xff0c;修改eth0配置文件就好 ubuntu 12.04的网络设置文件是/etc/network/interfaces&#xff0c;打开文件&#xff0c;会看到 auto lo iface lo inet loopback 这边的设置是本地回路。在后…

计算机显卡知识普及

显卡知识普及 一、什么是显卡&#xff1f; 显示接口卡&#xff08;Video card&#xff0c;Graphics card&#xff09;、显示器配置卡简称为显卡&#xff0c;是个人电脑基本组成部分之一。 用途是将计算机系统所需要的显示信息进行转换驱动&#xff0c;并向显示器提供信号&…

整除的尾数

Problem Description 一个整数&#xff0c;只知道前几位&#xff0c;不知道末二位&#xff0c;被另一个整数除尽了&#xff0c;那么该数的末二位该是什么呢&#xff1f; Input 输入数据有若干组&#xff0c;每组数据包含二个整数a&#xff0c;b(0<10000,10<b<100)&…

QML 控件大全

QML TypeContainerDelayButtonDialDialogButtonBoxDialogDrawerMenuMenuBarOverlayPageIndicatorRangeSliderScrollViewSpinBoxStackViewSwipeViewSwitchTabBarToolBarToolSeparatorToolTipTumbler QML Type 本篇主要介绍QtQuick Controls 2,Qt Creator 5.10 1.Container im…

斐波那契的整除

Description 已知斐波那契数列有如下递归定义&#xff0c;f(1)1,f(2)1, 且n>3,f(n)f(n-1)f(n-2)&#xff0c;它的前几项可以表示为1&#xff0c; 1&#xff0c;2 &#xff0c;3 &#xff0c;5 &#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34…&#xff0c;现在的…

Qt与QML的枚举绑定(C++枚举)

Qt到QML的枚举绑定 QML中是不支持c的枚举类型的&#xff0c;所以我们可以使用Qt的元对象系统&#xff0c;即MOS,来帮助我们实现。 进行绑定的好处就是&#xff0c;以后数据发生变化的时候&#xff0c;就是枚举发生增加修改&#xff0c;添加等的时候&#xff0c;不需要在QML中…

深入理解Qt的.pro文件

深入理解Qt的pro文件模板变量生成目录生成的应用程序名编译选项目标文件目录包含头文件包含源文件包含资源文件附加头文件包含链接库预编译宏平台相关性处理指定来自ui文件位置指定界面翻译文本列表指定图标 深入理解Qt的.pro文件 一般Qt项目我们是使用Qt Creator自动生成的&…

Ubuntu 用vsftpd 配置FTP服务器

最近开学&#xff0c;有好多课程结束后都需要将文件考到优盘里&#xff0c;而本人又有健忘的毛病&#xff0c;经常忘记带优盘&#xff0c;所以就搭建了自己的ftp服务器&#xff0c;也算是用技术放松自己吧。闲话少叙&#xff0c;进入正题&#xff1a; 网上关于ftp搭建的文章很…

linux的程序打包deb

deb安装包 deb是Unix系统(其实主要是Linux)下的安装包&#xff0c;基于 tar 包&#xff0c;因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组。 由于 Unix 类系统对权限、所有者、组的严格要求&#xff0c;而 deb 格式安装包又经常会涉及到系统比较底层的操作&#…

利用pyinstaller打包python3程序

pyInstaller是一款用于将pyhon程序打包成exe文件的工具&#xff0c;pyInstaller不是一个python的包&#xff0c; 只需要把pyInstaller的文件下载下来放到任意为止都可以&#xff0c;也就是说pyInstaller相当于独立出来专门干打包python的工具&#xff0c;这货是工具不是库&…

C++11新特性之左值右值及移动语句与完美转发

C左值右值左值和右值的由来什么是左值和右值左值右值的本质引用左值引用右值引用 移动语句与完美转发移动语句实现移动构造函数和转移赋值函数stdmove完美转发Perfect Forwarding C左值右值 自从C11发布之后&#xff0c;出现了一个新的概念&#xff0c;即左值和右值&#xf…

nginx中的nginx.conf.default配置

#运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1;#全局错误日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;#工作模式及连接数上限 events {…

C++11新特性之泛型编程与模板

模板泛型编程函数模板普通函数模板成员函数模板函数模板重载模板函数的特化 类模板类模板中的成员函数模板类模板的特化与偏特化类模板成员特化 模板 Template所代表的泛型编程是C语言中的重要组成部分。 泛型编程 泛型编程&#xff08;Generic Programming&#xff09;是…

WordPress更改“固定链接”后 页面404原因及解决方法(Nginx版)

网上盛传的方法是&#xff1a; 在 /etc/nginx/nginx.conf文件的 loction / {} 中添加 if (-f $request_filename/index.html){rewrite (.*) $1/index.html break; }if (-f $request_filename/index.php){rewrite (.*) $1/index.php; }if (!-f $request_filename){rewrite (.*…

C++类型萃取之type_traits和type_info

类型萃取类型判断typeiddecltype和declvalenable_if 类型萃取 通过type_traits可以实现在编译期计算、查询、判断、转换和选择&#xff0c;增强了泛型编程的能力&#xff0c;也增强了我们程序的弹性&#xff0c;让我们能够在编译期就能够优化改进甚至排错&#xff0c;进一步提…

使用Phpstorm实现远程开发

Phpstorm除了能直接打开本地文件之外&#xff0c;还可以连接FTP&#xff0c;除了完成正常的数据传递任务之外&#xff0c;还可以进行本地文件与服务端文件的异同比较&#xff0c;同一文件自动匹配目录上传&#xff0c;下载&#xff0c;这些功能是平常IDE&#xff0c;FTP软件中少…

什么是递归函数?

文章目录递归函数递归例题特点效率优点递归函数 递归 递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身&#xff0c;每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推&#xff0c;直到遇到墙后返回&#xff0c;这个墙就是结束条…

apache ab压力测试报错

今天用apache 自带的ab工具测试&#xff0c;当并发量达到1000多的时候报错如下&#xff1a; [rootaa~]# This is ApacheBench, Version 2.3 <Revision:655654> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Sof…