python 32bit数据结构_python实现bitmap数据结构详解

本文详细介绍了如何在Python中实现32位Bitmap数据结构,包括复位、计算数组索引、置1、清0和检测位是否为1的操作。通过使用32位有符号整数,并考虑Python的数组和位操作,该实现适用于Bloom Filter等算法设计场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bitmap是很常见的算法设计,例如用以Bloom Filter中;用以无反复整数金额的排列这些。bitmap一般根据数组来完成,数组中每一个原素能够当做是一系列二进制数,全部元素组成更高的二进制结合。针对Python而言,整数金额种类默认设置是有标记种类,因此 一个整数金额的能用十位数为31位。

bitmap完成构思

bitmap是用以对每一位开展实际操作。举例来说,一个Python数组包括4个32位系统有标记整形,则一共能用位为4 * 31 = 124位。假如要在第90个二进制位上实际操作,则要先获得到实际操作数组的第几个原素,再获得相对的位数据库索引,随后实行实际操作。

图中所显示为一个32位系统整形,在Python中默认设置是有标记种类,最大位为标记位,bitmap不可以应用它。左侧是上位,右侧是底位,最少位为第0位。

bitmap是用以对每一位开展实际操作。举例来说,一个Python数组包括4个32位系统有标记整形,则一共能用位为4 * 31 = 124位。假如要在第90个二进制位上实际操作,则要先获得到实际操作数组的第几个原素,再获得相对的位数据库索引,随后实行实际操作。

复位bitmap

最先必须复位bitmap。拿90这一整数金额而言,由于单独整形只有应用31位,因此 90除于31并向上取整则可获知必须好多个数组原素。编码以下:

编码以下:

#!/usr/bin/env python

#coding: utf8

class Bitmap(object):

def __init__(self, max):

self.size = int((max 31 – 1) / 31) #向上取整

if __name__ == ‘__main__’:

bitmap = Bitmap(90)

print ‘必须 %d 个原素。’ % bitmap.size

编码以下:

$ python bitmap.py

必须 3 个原素。

测算在数组中的数据库索引

测算在数组中的数据库索引实际上是跟以前测算数组尺寸是一样的。只不过是以前是对最大值测算,如今换为任一必须储存的整数金额。可是有一点不一样,测算在数组中的数据库索引是向下取整,因此 必须改动calcElemIndex方式的完成。编码改成以下:

编码以下:

#!/usr/bin/env python

#coding: utf8

class Bitmap(object):

def __init__(self, max):

self.size = self.calcElemIndex(max, True)

self.array = [0 for i in range(self.size)]

def calcElemIndex(self, num, up=False):

”’up为True则为向上取整, 不然为向下取整”’

if up:

return int((num 31 – 1) / 31) #向上取整

return num / 31

if __name__ == ‘__main__’:

bitmap = Bitmap(90)

print ‘数组必须 %d 个原素。’ % bitmap.size

print ’47 应储存在第 %d 个数组原素上。’ % bitmap.calcElemIndex(47)

编码以下:

$ python bitmap.py

数组必须 3 个原素。

47 应储存在第 1 个数组原素上。

因此 获得较大 整数金额很重要,不然有可能建立的数组容下下不来一些数据信息。

测算在数组原素中的位数据库索引

数组原素中的位数据库索引能够根据取模运算来获得。令需储存的整数金额跟31牙模型就可以获得位数据库索引。编码改成以下:

编码以下:

#!/usr/bin/env python

#coding: utf8

class Bitmap(object):

def __init__(self, max):

self.size = self.calcElemIndex(max, True)

self.array = [0 for i in range(self.size)]

def calcElemIndex(self, num, up=False):

”’up为True则为向上取整, 不然为向下取整”’

if up:

return int((num 31 – 1) / 31) #向上取整

return num / 31

def calcBitIndex(self, num):

return num % 31

if __name__ == ‘__main__’:

bitmap = Bitmap(90)

print ‘数组必须 %d 个原素。’ % bitmap.size

print ’47 应储存在第 %d 个数组原素上。’ % bitmap.calcElemIndex(47)

print ’47 应储存在第 %d 个数组原素的第 %d 位上。’ % (bitmap.calcElemIndex(47), bitmap.calcBitIndex(47),)

别忘记是以第0位算起哦。

置1实际操作

二进制位默认设置是0,将某部位1则表明在这里位储存了数据信息。编码改成以下:

编码以下:

#!/usr/bin/env python

#coding: utf8

class Bitmap(object):

def __init__(self, max):

self.size = self.calcElemIndex(max, True)

self.array = [0 for i in range(self.size)]

def calcElemIndex(self, num, up=False):

”’up为True则为向上取整, 不然为向下取整”’

if up:

return int((num 31 – 1) / 31) #向上取整

return num / 31

def calcBitIndex(self, num):

return num % 31

def set(self, num):

elemIndex = self.calcElemIndex(num)

byteIndex = self.calcBitIndex(num)

elem = self.array[elemIndex]

self.array[elemIndex] = elem | (1 byteIndex)

if __name__ == ‘__main__’:

bitmap = Bitmap(90)

bitmap.set(0)

print bitmap.array

由于从第0位算起,因此 如必须储存0,则必须把第0部位1。

清0实际操作

将某部位0,也即丢掉已储存的数据信息。编码以下:

编码以下:

#!/usr/bin/env python

#coding: utf8

class Bitmap(object):

def __init__(self, max):

self.size = self.calcElemIndex(max, True)

self.array = [0 for i in range(self.size)]

def calcElemIndex(self, num, up=False):

”’up为True则为向上取整, 不然为向下取整”’

if up:

return int((num 31 – 1) / 31) #向上取整

return num / 31

def calcBitIndex(self, num):

return num % 31

def set(self, num):

elemIndex = self.calcElemIndex(num)

byteIndex = self.calcBitIndex(num)

elem = self.array[elemIndex]

self.array[elemIndex] = elem | (1 byteIndex)

def clean(self, i):

elemIndex = self.calcElemIndex(i)

byteIndex = self.calcBitIndex(i)

elem = self.array[elemIndex]

self.array[elemIndex] = elem (~(1 byteIndex))

if __name__ == ‘__main__’:

bitmap = Bitmap(87)

bitmap.set(0)

bitmap.set(34)

print bitmap.array

bitmap.clean(0)

print bitmap.array

bitmap.clean(34)

print bitmap.array

清0和置1是互反实际操作。

检测一位是不是为1

分辨一位是不是为1是为了更好地取下以前所储存的数据信息。编码以下:

编码以下:

#!/usr/bin/env python

#coding: utf8

class Bitmap(object):

def __init__(self, max):

self.size = self.calcElemIndex(max, True)

self.array = [0 for i in range(self.size)]

def calcElemIndex(self, num, up=False):

”’up为True则为向上取整, 不然为向下取整”’

if up:

return int((num 31 – 1) / 31) #向上取整

return num / 31

def calcBitIndex(self, num):

return num % 31

def set(self, num):

elemIndex = self.calcElemIndex(num)

byteIndex = self.calcBitIndex(num)

elem = self.array[elemIndex]

self.array[elemIndex] = elem | (1 byteIndex)

def clean(self, i):

elemIndex = self.calcElemIndex(i)

byteIndex = self.calcBitIndex(i)

elem = self.array[elemIndex]

self.array[elemIndex] = elem (~(1 byteIndex))

def test(self, i):

elemIndex = self.calcElemIndex(i)

byteIndex = self.calcBitIndex(i)

if self.array[elemIndex] (1 byteIndex):

return True

return False文章内容来源于:www.seo-7.comwww.sEo-6.comhttp://www.seo-6.com/seoyh/seojichurm/118357.html

(编辑:部分内容来互联网)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值