Bitmap简介

bitmap是很常用的数据结构,比如用于Bloom Filter中、用于无重复整数的排序等等。bitmap通常基于数组来实现,数组中每个元素可以看成是一系列二进制数,所有元素组成更大的二进制集合。对于Python来说,整数类型默认是有符号类型,所以一个整数的可用位数为31位。

Bitmap的实现和使用

bitmap实现思路

bitmap是用于对每一位进行操作。举例来说,一个Python数组包含4个32位有符号整型,则总共可用位为4 * 31 = 124位。如果要在第90个二进制位上操作,则要先获取到操作数组的第几个元素,再获取相应的位索引,然后执行操作。

# encoding: utf-8
@author: JYFelt
@contact: JYFelt@163.com
@site: www.JYFelt.com
@version: 1.0
@license: Apache Licence
@file: bitmap_demo.py
@time: 2018/1/13 13:46
这一行开始写关于本文件的说明与解释
# 初始化bitmap
class Bitmap():
    def __init__(self, max):
        """确定数组个数"""
        self.size = int((max + 31 - 1) / 31)
        # max需要传入的为要排序的最大数
        self.array = [0 for i in range(self.size)]
    def bitindex(self, num):
        """确定数组中元素的位索引"""
        return num % 31
    def set_1(self, num):
        """将元素所在的位——置1"""
        elemindex = (num // 31)  # 整除,否则为浮点值
        byteindex = self.bitindex(num)
        ele = self.array[elemindex]
        self.array[elemindex] = ele | (1 << byteindex)
    def test_1(self, i):
        elemindex = (i // 31)  # 整除,否则为浮点值
        byteindex = self.bitindex(i)
        if self.array[elemindex] & (1 << byteindex):
            return True
        return False
if __name__ == '__main__':
    Max = ord('z')  # ord('*')返回单字符在ASCII中对应的整数
    shuffle_array = [x for x in 'qwelajkda']
    ret = []
    bitmap = Bitmap(Max)
    for c in shuffle_array:
        bitmap.set_1(ord(c))
    for i in range(Max + 1):
        if bitmap.test_1(i):
            ret.append(chr(i))
    print(u'原始数组是:%s' % shuffle_array)
    print(u'排序以后的数组是:%s' % ret)
                    [Python]数据结构–Bitmap 位图  ‘Festinatione facit vastum’Bitmap简介Bitmap的实现和使用Bitmap简介bitmap是很常用的数据结构,比如用于Bloom Filter中、用于无重复整数的排序等等。bitmap通常基于数组来实现,数组中每个元素可以看成是一系列二进制数,所有元素组成更大的二进制集合。对于Pyth
				
最近重温了一下位分割的相关内容,发现网络上位分割原理讲得已经很清楚了,但是代码多为C++实现或者Matlab实现,因为需要Python的版本,于是出现了这篇博客。 想要了解位分割的原理的同学,可以参考下面这篇博客。 https://www.cnblogs.com/qinguoyi/p/7601179.html 话不多说,直接来代码。 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('Fig3
学习过redis缓存穿透解决方案的可能知道布隆过滤器,关于布隆过滤器的知识这里不再多讲,它的底层使用的是bitmap实现的,bitmap就是一个二进制的bit位组成的数组,一个int类型为4个字节,则bit位为32位(1Byte=8bit),减去一个符号位,我们可用的位数为31位,也就可以用bit位对应的1来表示对应的十进制整数。 使用bitmap对整数数组排序时首先我们要分配这个bitmap的大小,获取数组中的最大整数 M,M//31+1 除以31向上取整,比如一个未排序数组最大数不超过60,那么得到结
@像处理之读取bmp(1/4/8/16/24位) 像处理之读取bmp(1/4/8/16/24位) 之前做像处理作业,要求用read读取bmp,但是网上好像都没有找到能够读取各种位python程序。。。实属无奈 首先要获得1bit,4bit,8bit,16bit和24bit的像。首先用Photoshop打开一张正常的jpg片,接着在储存中选择bmp格式,分别选择24位和16位,但是1,4,8位无法选择,此时新建一张画布,在创建时选择8位,然后将上述片导入画布,点击像-模式-位,并且按照上述
我想用bitmap的原因是因为我写了一个B站用户的爬虫,是通过关系网进行爬取的,所以我需要确定一个ID是否已经被爬取过。B站ID的规则是从1开始递增的数字,现在最大的ID接近4亿了。 Python2有一个bitmap的库,但是并不好用,感兴趣的可以用一下,安装方法和使用方法如下: pip install bitmap from bitmap import BitMap bm = BitMa...
Python bitmap转Mat 我相信能发现这个问题的都是在玩pythonnet,并尝试把Bitmap转成OpenCV使用。 C#的话,OpenCV用的是Mat,Bitmap转成CV::Mat后,OpenCV可以直接使用。 Python的话,cv2虽说用的是UMat,但是可以用np.ndarray类型,因此可以通过byte[]来进行转换。 目前我用的最快做法是第一种,但我相信还有更快的做法: import clr from System import Byte from System.IO import
漫画:什么是Bitmap算法? [外链片转存失败,源站可能有防盗链机制,建议将片保存下来直接上传(img-HGWtABd8-1607085499820)(https://upload-images.jianshu.io/upload_images/12504508-7f7d88d46fa22fe9.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)] 两个月之前—— 所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 本文使用python实现bitmap算法。 由于算法储存数据的粒度到了位,因此代码中使用了很多位运算,先回顾一下python中的位运算操作。 # 或运算 >>> bin(10), bin(8) ('0b1010', '0b1000') >>> bin(10 | 8) '0b1010' # 与预算 CSDN-Ada助手: 非常感谢您的分享,解决 ERROR: Failed building wheel for pycryptodome 这个问题对很多开发者来说都是非常有帮助的。我觉得接下来您可以考虑写一篇关于Python中常见报错的解决方法的博客,这样的技术文章对其他用户也会非常有帮助。相信会有更多读者受益于您的分享! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 [Python]WEB编程--个人日记网站搭建(一) JYFelt: 域名注销了表情包 [Python]WEB编程--个人日记网站搭建(一) 叫我可可: 你重新访问一下这个域名试试表情包 [Python]WEB编程--个人日记网站搭建(一) m0_73875850: <a href="https://anymud.com/">更多精彩</a> MacOS 访达 查看隐藏文件&隐藏文件夹 bugbigBug: 卧槽,好屌的哦