[从头学数学] 第253节 Python实现数据结构:比特集(BitSet)

这篇博客介绍了如何从头开始使用Python实现数据结构比特集(BitSet),重点讲解了其在计算几何中的应用,并通过实例展示了其用法。
摘要由CSDN通过智能技术生成
剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。


正剧开始:
星历2016年08月01日 10:17:09, 银河系厄尔斯星球中华帝国江南行省。

[工程师阿伟]正在和[机器小伟]一起研究[计算几何]]。





Python的实现:

<span style="font-size:18px;">###
# @usage   比特集
# @author  mw
# @date    2016年08月01日  星期一  08:06:58 
# @param
# @return
#
###
class BitSet(object):
    # from low to high "00000001 00000010 00000011", the array is [1, 2, 3]
    def __init__(self, capacity = 64):        
        #"B"类型相当于 C 语言的 unsigned char, 即占用1byte(8位),所以size大小设置为8
        self.unit_size = 8
        self.unit_count = abs(math.floor((capacity + self.unit_size - 1) / self.unit_size));
        self.capacity = capacity
        self.arr = array.array("B", [0] * self.unit_count)
 
    def any(self):
        #是否存在置为 1 的位
        for a in self.arr:
            if a != 0:
                return True
        return False
 
    def all(self):
        #是否所有位都为 1, 即是否存在置为 0 的位
        t = (1 << self.unit_size) - 1
        for a in self.arr:
            if (a & t) != t:
                return False
        return True     
 
    def none(self):
        #是否所有位都为 0,即是否不存在置为 1 的位
        for a in self.arr:
            if a != 0:
                return False
        return True

    #所有位为零为真
    def isEmpty(self):
        return self.none();

    #至少一位为1,返回真
    def intersects(self):
        return self.any();

    #位的数量
    def length():
        return self.size();

    def __len__():
        return self.size();

    def size(self):
        #所有位的个数
        return self.unit_count * self.unit_size        
 
    def count(self):
        #置为 1 的位的个数
        c = 0
        for a in self.arr:
            while a > 0:
                if a & 1:
                    c += 1
                a = a>>1
        return c 
 
    def get(self, pos):
        #获取第 pos 位的值
        index = int(pos / self.unit_size)
        offset = (self.unit_size - (pos - index * self.unit_size) - 1) % self.unit_size
        return (sel
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值