数据结构中很特别的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)