bitmap之py实现

数据结构中很特别的bitmap,bitmap原理:python3中一个带符号的整数是8位,第一位是符号位,剩下63位可以按位操作。
用于不重复整数的排序,排序原理是:从文件读取数组,按照数字大小在对应bit位置操作置1,时间复杂度是O(n)。遍历对应位置,为1就证明有数,以此排序。
参考原文,我是64位系统,python2和3的有符号整数都是8字节。所以略有修改。

如有错误,欢迎留言指导。

#!/home/wjl/anaconda3/bin/python
#coding:utf-8
import sys

byte= sys.getsizeof([1]) - sys.getsizeof([])
print("带符号整数的字节数", byte)

class Bitmap(object):
    """带符号的整数可以操作后63位"""
    num_of_bit = byte * 8 - 1
    def __init__(self, max):
        self.size  = self.calcElemIndex(max, True)
        self.array = [0 for i in range(self.size)]

    # cal the num of block element(8byte, 63bit to use)
    def calcElemIndex(self, num, up=False):
        '''up为True则为向上取整, 否则为向下取整'''
        if up:
            return int((num + 63- 1) / 63) #向上取整
        return num // 63

    # cal the index of block element
    def calcBitIndex(self, num):
        return num % 63

    # set 1
    def set(self, num):
        elemIndex = self.calcElemIndex(num)
        byteIndex = self.calcBitIndex(num)
        print(elemIndex, byteIndex)
        elem      = self.array[elemIndex]
        # 位操作
        self.array[elemIndex] = elem | (1 << byteIndex)

    # set 0
    def clean(self, i):
        elemIndex = self.calcElemIndex(i)
        byteIndex = self.calcBitIndex(i)
        print(elemIndex, byteIndex)
        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


if __name__ == '__main__':
    MAX = 879
    suffle_array = [45, 2, 78, 35, 67, 90, 879, 0, 340, 123, 46]
    result = []
    bitmap = Bitmap(MAX)
    for num in suffle_array:
        bitmap.set(num)

    for i in range(MAX + 1):
        if bitmap.test(i):
            result.append(i)

    print('原始数组为:    %s' % suffle_array)
    print('排序后的数组为: %s' % result)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章