位图bitbucket
2024-10-11 01:50:14
问题:假设有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为6
MASK = 0x1F # 如果计算机为32位,MASK为0x1F;如果计算机为64位,MASK为0x3F class 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()
最新文章
- C++如何调用C#开发的dll
- Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法
- Liferay 6.2 改造系列之一:源码编译和服务启动
- [原创]CI持续集成系统环境---部署Gitlab环境完整记录
- 开源搜索引擎Iveely 0.7.0发布,不一样,那就让他不一样!
- 任务栏窗口和状态图标的闪动 z
- iOS开发UI篇—UITabBarController生命周期(使用storyoard搭建)
- Code Review中应该关注的点
- 【转】opencv-在图像上显示字符(不包括中文)
- libmad编译
- linux 安装与启动nginx
- 也许是目前实现最好的js模拟滚动插件
- Java 密码学算法
- Windows Internals 笔记——线程优先级
- 多线程深入:乐观锁与悲观锁以及乐观锁的一种实现方式-CAS(转)
- day19 python之re模块正则练习
- php源码笔记
- elasticsearch 5.1 别的机器无法访问9200端口
- js 函数中形参与实参的关系
- Excel长数字防止转换为科学计数法
热门文章
- Vue v-if 和 v-show
- 2Y - sort
- c10k C10M
- 文档根元素 ";mapper"; 必须匹配 DOCTYPE 根 ";configuration";
- LaTeX数学公式大全
- imaplib.error: command: SEARCH =>; got more than 10000 bytes
- JSP属性的四种保存范围(page request session application)
- Linux产生序列数字
- Ubuntu 配置双网卡的问题
- Valid Mountain Array LT941