Bitmap的一个简单实现
一、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的一个简单实现相关推荐
- 4.9一个简单的多任务内核实例
第四章第9节 本节描述了一个简单多任务内核的设计和实现方法,这个内核包括两个特权级3的用户任务和一个系统调用中断过程. 本节给出的内核实例由两个文件构成.一个是使用as86语言编制的引导启动程序boo ...
- 利用WCF的callback机制开发一个简单的多人游戏模型
本文介绍了如何利用WCF和callback机制开发一个简单的多人在线游戏模型. 运行过程如下: 当game service 启动之后,若干个客户端便会自动连接到服务器.当某个客户端点击join gam ...
- redisdemo php,一个简单的用redis做秒杀支撑的demo (PHP版)
用redis做秒杀的库存扣除, 限制每个账号只能抢购一次, 这个简单的demo使用了string, hash, list三种基本类型. 用string类型的int值来存储剩余库存, 并在抢购成功后减1 ...
- Android Compose——一个简单的Bilibili APP
Bilibili移动端APP 简介 依赖 效果 登录 效果 WebView 自定义TobRow的Indicator大小 首页 推荐 LazyGridView使用Paging3 热门 排行榜 搜索 模糊 ...
- Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏。
Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏. 这个例子中只有4个类,一个绘制大理石类Marble,一个绘制迷宫类Maze,一个Amazed视图类, ...
- Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏。...
Android apps浅析01-Amazed:一个简单但令人上瘾的加速度为基础的大理石指导游戏. 这个例子中只有4个类,一个绘制大理石类Marble,一个绘制迷宫类Maze,一个Amazed视图类, ...
- 打造一个简单的万能适配器
将优化后的BaseAdapter封装成一个通用的万能适配器,第一次的封装还不够完善,以后将改进和优化. package com.xspacing.commonadapter;import java.u ...
- 一个简单的智能停车APP——抽屉式侧边栏
一个简单的智能停车APP 功能介绍 代码详解 总结 功能介绍 先展示效果图: 侧边栏由MaterialDesign(原质化设计)框架设计而成. 由DrawerLayout+NavigationView ...
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击 ...
最新文章
- O“.NET研究”bjective-C入门
- PHP_define和const的区别/获取所有常量get_defined_constant()
- ln函数怎么看奇偶性_Python中函数的参数应该怎么理解?看完这篇文章情不自禁的想收藏...
- 蚂蚁金服 AntV F2 3.6 发布,更强!更快!
- 东芝正式退出笔记本电脑业务!
- hdu 6092 Rikka with Subset 01背包 思维
- 十九、RF接口测试汇总(一)
- 支付设计白皮书:支付系统的概念与中国互联网支付清算体系
- 清华大学中文语音识别数据 THCHS30
- 打印机出现另存为xps_打印机打印文件显示另存为xps格式的文件 - 卡饭网
- 【gdgzezoi】Problem A: Fairy
- wegame 取消直播提醒
- 2021年上半年最接地气的Android面经,隔壁都馋哭了
- 中兴服务器400,中兴通讯高性能400G方案:攀登5G高峰
- 海量工业数据如何应用?能源企业率先做了这些尝试
- linux如何让命令是中文,linux centos 让man命令帮助显示简体中文
- 微信开发者工具git 删除项目
- R语言安装包出现 Error in loadNamespace(j - i[[1L]], c(lib.loc, .libPaths())错误
- 原生JS案例(面向对象)——按住鼠标实现左右拖动列表
- verypdf pdf editor ocx crack/最新热乎乎