C/C++知识点之哈希表—位图
顾宇峰 2019-04-10 来源 : 阅读 1413 评论 0

摘要:本文主要向大家介绍了C/C++知识点之哈希表—位图,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之哈希表—位图,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之哈希表—位图

[1.什么是位图?<br/>2.位图的用处?<br/>3.位图的结构<br/>4.位图题目操练<br/>5.总结(优缺点分析)]
1.什么是位图?
位图就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。在STL中有一个bitset容器,其实就是位图。

所以我们可以了解到,位图就是一个只用每一位来保存数的状态的结构。

2.位图的用处?
位图主要用于海量数据处理,索引,数据压缩等方面有广泛应用
3.位图的结构
关于位图的结构,类似于哈希,位图就是一个用每一位的0,1来表示一个数的状态。

比如,我们现在有一个文件,这个文件中有数 1,5,4294967295。我们就把第1位,第5位,第4294967295位改为状态1。

C/C++知识点之哈希表—位图

4.位图题目操练
给4 0 亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这4 0 亿个数中。

题目分析:这是一道关于海量数据查找的题,其实这道题,我们就可以和哈希表联系在一起,为何说是海量数据呢,对于一个40亿整数,我们如果要存的话,按照无符号整数来存储,那么下来,大概就需要40亿*4这么些字节,下来大概就是16G的 内存。

对于现在的64位机,普遍标配内存也就是4-8G的内存,显而易见,16G是没有办法一次性处理的。那么我们如何是好?进行拆分?这样显然也是不好的,怎么拆,还有效率问题。
所以在这里我们采取一种新的思路,这种思路就是位图。
位图结构定义

typedef struct BitMap{    size_t* _bits;    size_t _range;
}BitMap;

位图相关接口

void BitMapInit(BitMap *bm,size_t range) //初始化{
    assert(bm);
    bm->_bits = NULL;
    bm->_range = range;
    bm->_bits = (size_t *)malloc(sizeof(char)*bm->_range/8);
    assert(bm->_bits);    memset(bm->_bits,0,sizeof(char)*bm->_range/8);
}void BitMapSet(BitMap *bm,size_t x)//标记相应位{    size_t num = x>>5;    size_t bit = x%32;

    bm->_bits[num] |=(1<<bit);
}void BitMapReset(BitMap *bm,size_t x)//恢复相应位{    size_t num = x>>5;    size_t bit = x%32;

    bm->_bits[num] &= (~(1<<bit));
}int BitMapTest(BitMap *bm,size_t x){    size_t num = x>>5;    size_t bit = x%32;    if ((1<<bit)&bm->_bits[num])        return 0;    return -1;
}

测试案例及结果截图:

void TestBitMap()
{
    BitMap bm;
    BitMapInit(&bm,-1);
    BitMapSet(&bm,5);
    BitMapSet(&bm,6);
    BitMapSet(&bm,7);
    BitMapSet(&bm,8);
    BitMapSet(&bm,-1);    printf(""%d\n"",BitMapTest(&bm,4));    printf(""%d\n"",BitMapTest(&bm,5));    printf(""%d\n"",BitMapTest(&bm,6));    printf(""%d\n"",BitMapTest(&bm,7));    printf(""%d\n"",BitMapTest(&bm,8));    printf(""%d\n"",BitMapTest(&bm,-1));
}

C/C++知识点之哈希表—位图

这道题中位图结构代码不难,注意理解思路,必须熟练掌握位运算。

5.总结
优缺点:
(1)可读性差
(2)位图存储的元素个数虽然比一般做法多,但是存储的元素大小受限于存储空间的大小。位图存储性质:存储的元素个数等于元素的最大值。比如, 1K 字节内存,能存储 8K 个值大小上限为 8K 的元素。(元素值上限为 8K ,这个局限性很大!)比如,要存储值为 65535 的数,就必须要 65535/8=8K 字节的内存。要就导致了位图法根本不适合存 unsigned int 类型的数(大约需要 2^32/8=5 亿字节的内存)。
(3)位图对有符号类型数据的存储,需要 2 位来表示一个有符号元素。这会让位图能存储的元素个数,元素值大小上限减半。 比如 8K 字节内存空间存储 short 类型数据只能存 8K*4=32K 个,元素值大小范围为 -32K~32K 。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @职坐标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论
本文作者 联系TA

2年研发与教育经验

  • 10
    文章
  • 2519
    人气
  • 0%
    受欢迎度

已有0人表明态度,0%喜欢该老师!

进入TA的空间
求职秘籍 直通车
  • 索取资料 索取资料 索取资料
  • 答疑解惑 答疑解惑 答疑解惑
  • 技术交流 技术交流 技术交流
  • 职业测评 职业测评 职业测评
  • 面试技巧 面试技巧 面试技巧
  • 高薪秘笈 高薪秘笈 高薪秘笈
TA的其他文章 更多>>
C/C++知识点之哈希表详解
经验技巧 0% 的用户喜欢
C/C++知识点之container_of 和 offsetof宏
经验技巧 0% 的用户喜欢
C/C++知识点之平衡二叉树
经验技巧 0% 的用户喜欢
C/C++知识点之c++ 6种排序算法 源代码
经验技巧 0% 的用户喜欢
C/C++知识点之mac 下xcode配置opencv
经验技巧 0% 的用户喜欢
其他海同师资 更多>>
吕益平
吕益平 联系TA
熟悉企业软件开发的产品设计及开发
孔庆琦
孔庆琦 联系TA
对MVC模式和三层架构有深入的研究
周鸣君
周鸣君 联系TA
擅长Hadoop/Spark大数据技术
范佺菁
范佺菁 联系TA
擅长Java语言,只有合理的安排和管理时间你才能做得更多,行得更远!
金延鑫
金延鑫 联系TA
擅长与学生或家长及时有效沟通
经验技巧30天热搜词 更多>>

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程