bitmap算法思想

Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面可以大大节省。
假设这样一个需求:在20亿个不重复的随机整数进行排序,并假设32位操作系统,4G内存
先看占用内存
在Java中,int占4字节,1字节=8位(1 byte = 8 bit)
如果每个数字用int存储,那就是20亿个int,因而占用的空间约为 (2000000000*4/1024/1024/1024)≈7.45G
如果按位存储就不一样了,20亿个数就是20亿位,占用空间约为 (2000000000/8/1024/1024/1024)≈0.233G
高下立判,无需多言
至于它的排序原理, 当我们把这些数用bit位来标记。
然后遍历一遍 , 取出标记为1的key, 就得到了一个有序序列。

而且, 可以看出, 如果是一大堆重复的随机整数, 这样操作, 还会起到一上去重的巧妙操作。
还是, 就是可以快速查找某一个数, 看它是否存在。比如:int数组中的一个元素是4字节占32位,那么除以32就知道元素的下标,对32求余数(%32)就知道它在哪一位,如果该位是1,则表示存在。

STL标准库中的bitset的底层实现原理也是内似:
bitset,中文叫位图,类似于每一个元素都是0或者1的数组,但位图的空间利用率比数组高很多。在Linux系统中,位图广泛应用于进程id的分配和文件描述符(file describer)的分配。并且,位图可以用于排序。位图的基本原理是用一个bit位代表一个整数,如果位图中的第N为1,那么就表示整数N存在。在c++的STL中实现了位图,包含在头文件中。bitset与vector很相似,都是位的集合,并且提供常数时间的特定位访问。他们之间的差别来自于主要体现在两个方面。首先,bitset的大小是不可变的,它的大小由模板参数N确定,N是整数常量。而vector的大小是可变的;其次,bitset并不是一个序列式容器,更准确地说,bitset并不是标准的STL容器。bitset并没有iterator,也没有begin()和end()。这样设计的理由是bitset中的元素就是bit位,不能容纳任何其他元素,并且bitset中bit位有特定的操作都需要实现,例如与、或、非以及异或。因此,不能够也不需要把bitset设计成STL标准容器

END

你可能感兴趣的:(Like,算法)