数据结构-位图

本系列为数据结构学习笔记(待汇总)。

位图

所谓bit-map就是用一个bit位来标记某个元素的value,而bit数组的下标是表示该元素,由于采用了bit为单位来存储数据,因此在存储空间方面,可以大大节省。
位图通过使用位数组来表示已知范围内的某些元素是否存在,可进行数据的快速查找、判重、删除

举例:假设我们要对0~7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复),可以采用bit-map的方法来达到排序的目的,要表示8个数,我们就只需要8个bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有bit位都置为0,如下图:
mark
然后遍历这五个元素,首先第一个是4,那么就把4对应的位置5(从0开始)置1:
mark
然后在处理第二个元素7,将第8个位置置1,接着在处理第三个元素,一直到最后一个元素,处理完的bit位状态:
mark
现在我们遍历一遍bit区域,将该位是1的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。

举例2:我们有1千万个整数,整数的范围在1到1亿之间。如何快速查找某个整数是否在这1千万个整数中呢?

使用位图。我们申请一个大小为1亿、数据类型为布尔类型(true或者false)的数组。我们将这1千万个整数作为数组下标,将对应的数组值设置成true。比如,整数5对应下标为5的数组值设置为true,也就是array[5]=true。

当我们查询某个整数K是否在这1千万个整数中的时候,我们只需要将对应的数组值array[K]取出来,看是否等于true。如果等于true,那说明1千万整数中包含这个整数K;相反,就表示不包含这个整数K。

问题实例:

  • 已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数
    8位最多99999999,大概需要99M个bit,大概10几M的内存即可,然后进行遍历将对应的位置1,统计位置上出现1的个数。

  • 2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
    将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置为0,则置1,如果是1,则置2,如果是2,则保持不变。最后统计位置上的值为1的个数。

  • 实现网页爬虫中的URL去重功能
    同一个网页链接有可能被包含在多个页面中,这就会导致爬虫在爬取的过程中,重复爬取相同的网页。如果你是一名负责爬虫的工程师,你会如何避免这些重复的爬取呢?
    假设需要判重的网页有10亿,那我们可以用一个10倍大小的位图来存储,也就是100亿个二进制位,换算成字节,那就是大约1.2GB。(即布隆过滤器,因为该位图无法覆盖所有的网页,会出现误判冲突,布隆过滤器利用K个哈希函数实现有误判的位图,降低存储空间,提高效率。点击查看布隆过滤器

应用

适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下
基本思想:使用bit数组表示某些元素是否存在。

Donate comment here
------------The End------------
0%