一、Bitmap简介

Bitmap是一种常用的数据结构,其实就是一个连续的数组,主要是用于映射关系,如映射整数,一位代表一个数,即这里假设Bitmap有100Bytes * 8 这么多的位,那么这里可以映射出来0~799,虽然大于799的数也能够映射,但是在查找时就不能确定该位是某数还是某数加800。为什么会设计这个数据结构,因为在映射大量数据时,这个数据结构可以很好的节省空间,并且有较高的查找效率。所以这种数据结构在海量数据的时候有较广泛的应用。这里还要说明的一点就是,一位代表一个数只是一种应用的方式,还可一扩展到两位代表一个数,还可以记录一些别的需要的信息。参考资料2,3中有一些涉及到Bitmap的面试题,有兴趣的可自行查阅。

二、Bitmap的一种实现

这里仅给出一位映射一个数的情况,比如现在有Bitmap这个数组,那么给定一个数怎么映射呢?比如这个数是23,那么需要在Bitmap数组中的第二十三位设置为1,这里的第二十三位不一定是顺序数的第二十三位(计算机有大端存储和小端存储,可见参考文献1,这个链接可能打不开了,我把整理的pdf放到了代码下载的位置,有兴趣的可自行下载查看),但是这里只要符合一一映射这个关系即可,查找的过程就是你映射过程的逆过程即可。

三、Bitmap的简单代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_SIZE 100#define QUOTIENT(number) ((number) / (((sizeof(char)) * 8)))
#define REMAINDER(number) ((number) % (((sizeof(char)) * 8)))int
main(int argc, char const *argv[])
{char bitmap[MAX_SIZE];memset(bitmap, 0, sizeof(bitmap));char *ptr = bitmap;int number_in = 0;int number_search = 0;int i = 0;printf("Please input the numbers continuously(less than and not equal %d) ""that will be saved in the bit map and enter the number -1 to finish!\n", MAX_SIZE * sizeof(char) * 8);while(EOF != (scanf("%d", &number_in))){if(-1 == number_in)break;ptr = bitmap;if(MAX_SIZE <= QUOTIENT(number_in))return 0;for (i = 0; i < QUOTIENT(number_in); ++i){ptr++;}*ptr |= (0x01 << REMAINDER(number_in));}printf("Please input the numbers continuously(less than and not equal %d) ""that will be searched whether in the bit map or not and enter the number -1 to finish!\n", MAX_SIZE * sizeof(char) * 8);while(EOF != (scanf("%d", &number_search))){if(-1 == number_search)break;char location = (char)0;ptr = bitmap;if(MAX_SIZE < QUOTIENT(number_search))return 0;for (i = 0; i <= QUOTIENT(number_search); ++i){       ptr++;}location = (*ptr) & (location | (0x01 << REMAINDER(number_search)));if(0 == location)printf("the number %d is not exist!\n", number_search);elseprintf("the number %d is exist!\n", number_search);}return 0;
}

四、程序的一点说明

程序的思路非常简单,就是把数对应到数组的某一位上,设置该位为1,查找是查看同样位置的该位是否为1,为1则说明该数存在于Bitmap中,否则不存在。

生成Bitmap和查找一个数之前那个判断非常重要即

if(MAX_SIZE <= QUOTIENT(number_in))if(MAX_SIZE <= QUOTIENT(number_search))

这个涉及到C语言的一个不安全因素,它可以越界访问/设置内存,所以这里要判断ptr设置的值实在定义的Bitmap数组的内存空间内,虽然这一步不加也不影响程序的运行,但是不建议这么做,因为这样做可能会把有用的内存空间设置值,可能会引起程序或系统崩溃。

五、参考资料

1. Big Endian 和 Little Endian:

http://ayazh.gjjblog.com/archives/1058846/

2. Bitmap的一些面试题, 十七道海量数据处理面试题与Bit-map详解:
http://blog.csdn.net/v_july_v/article/details/6685962

3. Bitmap的一些面试题,教你如何迅速秒杀掉:99%的海量数据处理面试题:
http://blog.csdn.net/v_july_v/article/details/7382693

说明:

如有错误还请各位指正,欢迎大家一起讨论给出指导。

上述程序完整代码及Big Endian 和 Little Endian的pdf的下载链接:
https://github.com/zeliliu/BlogPrograms/tree/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%26%E7%AE%97%E6%B3%95/bitmap

最后更新时间2013-07-02

Bitmap的一个简单实现相关推荐

  1. 4.9一个简单的多任务内核实例

    第四章第9节 本节描述了一个简单多任务内核的设计和实现方法,这个内核包括两个特权级3的用户任务和一个系统调用中断过程. 本节给出的内核实例由两个文件构成.一个是使用as86语言编制的引导启动程序boo ...

  2. 利用WCF的callback机制开发一个简单的多人游戏模型

    本文介绍了如何利用WCF和callback机制开发一个简单的多人在线游戏模型. 运行过程如下: 当game service 启动之后,若干个客户端便会自动连接到服务器.当某个客户端点击join gam ...

  3. redisdemo php,一个简单的用redis做秒杀支撑的demo (PHP版)

    用redis做秒杀的库存扣除, 限制每个账号只能抢购一次, 这个简单的demo使用了string, hash, list三种基本类型. 用string类型的int值来存储剩余库存, 并在抢购成功后减1 ...

  4. Android Compose——一个简单的Bilibili APP

    Bilibili移动端APP 简介 依赖 效果 登录 效果 WebView 自定义TobRow的Indicator大小 首页 推荐 LazyGridView使用Paging3 热门 排行榜 搜索 模糊 ...

  5. Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏。

    Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏. 这个例子中只有4个类,一个绘制大理石类Marble,一个绘制迷宫类Maze,一个Amazed视图类, ...

  6. Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏。...

    Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏. 这个例子中只有4个类,一个绘制大理石类Marble,一个绘制迷宫类Maze,一个Amazed视图类, ...

  7. 打造一个简单的万能适配器

    将优化后的BaseAdapter封装成一个通用的万能适配器,第一次的封装还不够完善,以后将改进和优化. package com.xspacing.commonadapter;import java.u ...

  8. 一个简单的智能停车APP——抽屉式侧边栏

    一个简单的智能停车APP 功能介绍 代码详解 总结 功能介绍 先展示效果图: 侧边栏由MaterialDesign(原质化设计)框架设计而成. 由DrawerLayout+NavigationView ...

  9. Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

    本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击 ...

最新文章

  1. O“.NET研究”bjective-C入门
  2. PHP_define和const的区别/获取所有常量get_defined_constant()
  3. ln函数怎么看奇偶性_Python中函数的参数应该怎么理解?看完这篇文章情不自禁的想收藏...
  4. 蚂蚁金服 AntV F2 3.6 发布,更强!更快!
  5. 东芝正式退出笔记本电脑业务!
  6. hdu 6092 Rikka with Subset 01背包 思维
  7. 十九、RF接口测试汇总(一)
  8. 支付设计白皮书:支付系统的概念与中国互联网支付清算体系
  9. 清华大学中文语音识别数据 THCHS30
  10. 打印机出现另存为xps_打印机打印文件显示另存为xps格式的文件 - 卡饭网
  11. 【gdgzezoi】Problem A: Fairy
  12. wegame 取消直播提醒
  13. 2021年上半年最接地气的Android面经,隔壁都馋哭了
  14. 中兴服务器400,中兴通讯高性能400G方案:攀登5G高峰
  15. 海量工业数据如何应用?能源企业率先做了这些尝试
  16. linux如何让命令是中文,linux centos 让man命令帮助显示简体中文
  17. 微信开发者工具git 删除项目
  18. R语言安装包出现 Error in loadNamespace(j - i[[1L]], c(lib.loc, .libPaths())错误
  19. 原生JS案例(面向对象)——按住鼠标实现左右拖动列表
  20. verypdf pdf editor ocx crack/最新热乎乎

热门文章

  1. [学习笔记]矩形面积并
  2. 第九次作业——测试报告与用户手册
  3. HandlerThread和IntentService源码解析
  4. 去年黑客用的未知软件漏洞数量增长一倍 创下纪录
  5. codeforces 700B Connecting Universities
  6. 情境感知技术是什么?
  7. 探索C#之布隆过滤器(Bloom filter)
  8. Tomcat 的数据库连接池设置与应用
  9. Nginx的upstream目前支持5种分配方式
  10. sed 每次只替换一行