博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
位图bitbucket
阅读量:5256 次
发布时间:2019-06-14

本文共 1839 字,大约阅读时间需要 6 分钟。

问题:假设有500w条数据,数据是在2^32-1的范围内,数据重复,如何减少内存对数字进行统计呢?

  如果用字典来标记数字是否已经统计过来,数字做为key, value仅为0 or1,那么这样需要消耗

内存32*500w+32*500w,key和value占用内存相加。

  但如果我们用value的位来标记数据是否统计过,32bit可以存32个不同的数字,这样可以减少

为500w/32+500w/32.这就是bit bucket的魅力所在。

#!/usr/bin/env python#-*- coding:utf-8 -*-SHIFT = 5  # 如果计算机为32位,SHIFT为5;如果计算机为64位,SHIFT为6MASK = 0x1F  # 如果计算机为32位,MASK为0x1F;如果计算机为64位,MASK为0x3Fclass BitBucket(object):    def __init__(self):        self._unique_key_count = 0   # 唯一的key有多少个        self._total_key_count = 0    # 加入的key有多少个        self._bit = {}     def set(self, value):        """return last bit"""        self._total_key_count += 1        if not self._has_key(value):            self._unique_key_count += 1            key = value >> SHIFT            self._bit[key] = self._bit.get(key, 0) | (1 << (value & MASK))            return 0        return 1    def exist(self, value):        if self._has_key(value):            return True        return False    def clear(self, value):        if self._has_key(value):            self._unique_key_count -= 1            self._total_key_count -= 1            key = value >> SHIFT            self._bit[key] = self._bit[key] & (~(1 << (value & MASK)))            return True        return False    def get_total_count(self):        return self._total_key_count    def get_bit_count(self):        return self._unique_key_count    def _has_key(self, value):        key = value >> SHIFT        return self._bit.get(key, 0) & (1 << (value & MASK))if __name__ == '__main__':    bitBucket = BitBucket()    for i in range(1, 27):        bitBucket.set(i)    print bitBucket.get_total_count()     print bitBucket.get_bit_count()    count = 0    for i in range(1, 30):        if bitBucket.exist(i):            count += 1    assert count == bitBucket.get_bit_count()

转载于:https://www.cnblogs.com/zhuangzebo/p/3849592.html

你可能感兴趣的文章
电子眼抓拍大解密
查看>>
poj 1331 Multiply
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
P1107 最大整数
查看>>
多进程与多线程的区别
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
java 常用命令
查看>>
CodeForces Round #545 Div.2
查看>>
卷积中的参数
查看>>
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
深入浅出JavaScript(2)—ECMAScript
查看>>
STEP2——《数据分析:企业的贤内助》重点摘要笔记(六)——数据描述
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>