学习过redis缓存穿透解决方案的可能知道布隆过滤器,关于布隆过滤器的知识这里不再多讲,它的底层使用的是bitmap实现的,bitmap就是一个二进制的bit位组成的数组,一个int类型为4个字节,则bit位为32位(1Byte=8bit),减去一个符号位,我们可用的位数为31位,也就可以用bit位对应的1来表示对应的十进制整数。
使用bitmap对整数数组排序时首先我们要分配这个bitmap的大小,获取数组中的最大整数 M,M//31+1 除以31向上取整,比如一个未排序数组最大数不超过60,那么得到结果为2,意思是我们需要两个int型数据大小的空间来存放这个数组。
bm=[a[0],a[1]] ,a[0]和a[1]就是我们申请到的资源,a[0]的0-31位分别表示整数的0-31,a[1]的0-31位分别表示整数的32-63,排序时只需将数组中元素对应bit位的0置为1即表示该整数存在,一趟下来每个数组中的元素都在对应的bit位被置为1.我们输出排序结果时只需按顺序输出为1的bit位的索引即可。比如a=[1,5,3,4,7,8,15,6,9] 我们只需用16位的bit即可表示全部整数,他们在bitmap中的位置应该是这样的“1000001111111010” 从左往右数为1的位置索引就是1,3,4,5,6,7,8,9,15这就是a的排序结果。
上面的方法是不是太复杂了,python中有没有更简便的方法呢?
一切从简,pip install bitmap ,我们只需下载第三方包bitmap。这个包直接为我们封装了一系列的bitmap用法,比自己写容易多了。
import bitmap
print(dir(bitmap))
#result:['BitMap', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'bitmap']
[Finished in 0.3s]
首先引引入bitmap模块,使用dir查看有哪些属性,BitMap这个应该就是类,我们可以使用它来创建一个bitmap对象。
from bitmap import BitMap
a=