概述

所谓bitmap就是用一个bit位来标记某个元素对应的value,而key即是这个元素。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间

算法思想

32位机器上,一个整形,比如int a;在内存中占32bit,可以用对应的32个bit位来表示十进制的0-31个数,bitmap算法利用这种思想处理大量数据的排序与查询
优点:
  • 效率高,不许进行比较和移位
  • 占用内存少,比如N=10000000;只需占用内存为N/8 = 1250000Bytes = 1.2M,如果采用int数组存储,则需要38M多
缺点:
  • 无法对存在重复的数据进行排序和查找
示例:
申请一个int型的内存空间,则有4Byte,32bit。输入 4, 2,  1,  3时:
输入4:
 
输入2:
 
输入1:
 
输入3:
 
思想比较简单,关键是十进制和二进制bit位需要一个map映射表,把10进制映射到bit位上

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
......
下面介绍用位移将十进制数转换为对应的bit位

位移转换

(1) 求十进制数0-N对应的在数组a中的下标
index_loc = N / 32即可,index_loc即为n对应的数组下标。例如n = 76, 则loc = 76 / 32 = 2,因此76在a[2]中。
(2)求十进制数0-N对应的bit位
bit_loc = N % 32即可,例如 n = 76, bit_loc = 76 % 32 = 12
(3)利用移位0-31使得对应的32bit位为1

代码示例(c语言)

#include <stdio.h>
#include <stdlib.h>#define SHIFT 5
#define MASK 0x1F/*** 设置所在的bit位为1** T = O(1)**/
void set(int n, int *arr)
{int index_loc, bit_loc;index_loc = n >> SHIFT; // 等价于n / 32bit_loc = n & MASK; // 等价于n % 32arr[index_loc] |= 1 << bit_loc;
}/*** 初始化arr[index_loc]所有bit位为0** T = O(1)**/
void clr(int n, int *arr)
{int index_loc;index_loc = n >> SHIFT;arr[index_loc] &= 0;
}/*** 测试n所在的bit位是否为1** T = O(1)**/
int test(int n, int *arr)
{int i, flag;i = 1 << (n & MASK);flag = arr[n >> SHIFT] & i;return flag;
}int main(void)
{int i, num, space, *arr;while (scanf("%d", &num) != EOF) {// 确定大小&&动态申请数组space = num / 32 + 1;arr = (int *)malloc(sizeof(int) * space);// 初始化bit位为0for (i = 0; i <= num; i ++)clr(i, arr);// 设置num的比特位为1set(num, arr);// 测试if (test(num, arr)) {printf("成功!\n");} else {printf("失败!\n");}}return 0;
}

参考链接

1. http://blog.csdn.net/v_july_v/article/details/6685962

转载于:https://www.cnblogs.com/gisblogs/p/5993275.html

算法_bitmap算法相关推荐

  1. java bitmap算法_BitMap算法详解

    所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间. 基本思想: 这此我用一个简单的例子来详细 ...

  2. 算法总结---最常用的五大算法(算法题思路)

    算法总结---最常用的五大算法(算法题思路) 一.总结 一句话总结: [明确所求:dijkstra是求点到点的距离,辅助数组就是源点到目标点的数组] [最简实例分析:比如思考dijkstra:假设先只 ...

  3. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  4. 期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用

    期望最大化算法(Expectation-Maximum,简称EM)算法+EM算法+EM的应用 EM的应用 EM算法有很多的应用,最广泛的就是GMM混合高斯模型.聚类.HMM等等.具体可以参考Jerry ...

  5. 数据结构与算法:算法简介

    数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...

  6. 社团发现算法-BGLL算法(附代码实现)

    一.社团发现算法 人们发现许多实际网络均具有社团结构, 即整个网络由若干个社团组成,社团之间的连接相对稀疏.社团内部的连接相对稠密.社团发现则是利用图拓扑结构中所蕴藏的信息从复杂网络 中解析出其模块化 ...

  7. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  8. 【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )

    文章目录 总结 一.标记-清除算法 二.复制算法 三.标记-整理算法 总结 常用的垃圾回收算法 : 标记-清除算法 ; 复制算法 ; 标记-整理算法 ; 这些算法没有好坏优劣之分 , 都有各自的 优势 ...

  9. 【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )

    文章目录 一.双指针算法分类 二.相向双指针示例 ( 有效回文串 ) 一.双指针算法分类 面试时经常遇到 限制算法复杂度为 O(n)O ( n )O(n) 的情况 , 就需要使用以下算法 : 双指针算 ...

最新文章

  1. 如果在BackgroundWorker运行过程中关闭窗体…
  2. mysql group by怎么用
  3. k8s与CICD--将drone部署到kubernetes中,实现agent动态收缩
  4. 东南亚的IT公司,我劝你善良!
  5. 《C++ Primer第五版》第一章-------IO机制和注释缩进
  6. python封装介绍_谈python3的封装
  7. Unity网络--HLAPI(2):Unity HLAPI NetworkManager与NetworkBehaviour的回调函数
  8. 小米:停止2016年发布的红米手机升级推送
  9. 洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver
  10. http ,servlet
  11. 2021年中国电力线通信(PLC)市场趋势报告、技术动态创新及2027年市场预测
  12. JAVA 基础练习题
  13. 上传漏洞-一句话木马
  14. 域名是如何变成IP的
  15. CCF认证 2019-03 01小中大
  16. MATLAB图像分割——检测交通视频中的汽车目标
  17. java游戏主角用毛笔_Java FX版的毛笔效果
  18. CSAPP:archlab
  19. 手把手教你使用Python批量创建复工证明
  20. 32款网页设计开发人员必备的谷歌浏览器扩展

热门文章

  1. centos安装vmware workstation 找不到kernel header解决方法
  2. 阅读记录:Learning multiple layers of representation(杂乱笔记)
  3. springside / springside4—CRUD页面教程
  4. 有关(int)和(int)的区别
  5. 大数据量传输时配置WCF的注意事项
  6. C++读取txt文件
  7. mysql表结构说明只能为1 8_SQL基础
  8. linux删除垃圾文件夹,优雅地删除 Linux 中的垃圾文件第六季
  9. Linux下截屏方法!
  10. c++封装继承多态实例