bitmap进行个数统计
昨天看了编程珠玑第一章的内容, 发现bitmap对于统计某一个范围内的整数个数效率很高, 就自己实现了一下:
这是原始的bitmap, 用于统计0~maxSize是否出现, 也可以用于排序
public class BitMap
{
private int[] arr ;
private final int mask = 0X1F ; //用于表示偏移量
private final int shift = 5 ; //用于表示index处于arr的第几个 public BitMap(int maxSize)
{
arr = new int[(maxSize-1)/32+1] ;
} //将index置1
public void set(int index)
{
//index>>5表示index在int中的第几个
//由于mask为16进制的11111, 所以index&mask的结果就是index在int中的位置
//或运算表示置1 , 与0相与表示置0
arr[index>>5] |= (1<<(index&mask)) ;
} //将index清零
public void clear(int index)
{
arr[index>>5] &= (~(1<<(index&mask))) ;
} //测试index是否为1
public boolean test(int index)
{
return (arr[index>>5] &= (1<<(index&mask))) != 0 ;
}
}
如果每个数字可能出现10次, 那么一个int型就可以表示8个元素, bitmap如下:
/**
* 每个数字最多出现10次
*/
public class BitMap_FourBit
{
private int[] map ;
private int shift = 3 ;
private int mask = 0X7 ; public BitMap_FourBit(int N)
{
map = new int[(N-1)/4+1] ;
} //加1
public void add(int index)
{
int pos = index>>shift ;//除以8获取他在map中的位置
int offset = offset(index) ;//获取在int中的偏移量 int bit = get(pos , offset) ; clear(pos , offset);
//System.out.println(bit);
bit += (1<<offset) ; //加1 map[pos] |= bit ;
} //清0
public void clear(int index)
{
int pos = pos(index) ;//除以8获取他在map中的位置
int offset = offset(index) ;//获取偏移量 clear(pos , offset);
} //获取
public int get(int index)
{
int pos = pos(index) ;
int offset = offset(index) ;//获取偏移量 return count(get(pos , offset)) ;
} //除以4获取他在map中的位置
private int pos(int index)
{
return index>>shift ;
} //获取在int中位置
private int offset(int index)
{
return (index&mask)<<2 ;
} //统计个数
private int count(int num)
{
int result = 0XF ; if((num & result) != 0)
return result & num ; for(int i=1 ; i<=8 ; i++)
{
result <<= 4 ; if((num & result) != 0)
{
result &= num ;
return result >> (4*i) ;
}
} return 0 ;
} private int get(int pos , int offset)
{
int bit = 0XF<<offset ; return map[pos] & bit ;
} private void clear(int pos , int offset)
{
int bit = 0XF<<offset ;
map[pos] &= (~bit) ; //将原来的位置清0
} public static void main(String[] args) {
BitMap_FourBit bitMap_fourBit = new BitMap_FourBit(16) ; bitMap_fourBit.add(8) ;
bitMap_fourBit.add(8) ;
bitMap_fourBit.add(9) ;
bitMap_fourBit.add(9) ;
bitMap_fourBit.add(9) ;
bitMap_fourBit.add(8) ; bitMap_fourBit.clear(9); System.out.println(bitMap_fourBit.get(8)) ;
System.out.println(bitMap_fourBit.get(9)) ;
}
}
bitmap进行个数统计的更多相关文章
- 一步一步写算法(之n!中末尾零的个数统计)
原文:一步一步写算法(之n!中末尾零的个数统计) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在很多面试的题目中,求n!结果中零的个数也是 ...
- 华为oj之字符个数统计
题目:字符个数统计 热度指数:4720 时间限制:1秒 空间限制:32768K 本题知识点: 字符串 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127). ...
- php实现 字符个数统计
php实现 字符个数统计 一.总结 一句话总结: 1.php字符转ascii码函数? ord() 6 if(ord($input[$i]) < 128 and 0 < ord($input ...
- Java实现 蓝桥杯VIP 算法提高 不同单词个数统计
算法提高 不同单词个数统计 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数.例如:对于句子"one little t ...
- linux makefile字符串操作函数 替换subst、模式替换patsubst、去首尾空格strip、查找字符串findstring、过滤filter、反过滤filter-out、排序函数sort、取单词word、取单词串wordlist、个数统计words
1.1 字符操作函数使用 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函 ...
- Python2018-字符串中字符个数统计
1 编写程序,完成以下要求: 统计字符串中,各个字符的个数 比如:"hello world" 字符串统计的结果为: h:1 e:1 l:3 o:2 d:1 r:1 w:1 prin ...
- sqlserver 数据库 的数据库个数统计 表个数统计 表的数据量统计(转载)
http://www.cnblogs.com/qinche/archive/2012/08/09/app.html 由于今天要监控数据,急需统计实例中1有多少库2库里有多少表3每个表有多少数据 --将 ...
- OpenJudge计算概论-求字母的个数(统计元音字母个数)
/*======================================================================= 求字母的个数 总时间限制: 1000ms 内存限制: ...
- Java不同单词个数统计
描述 编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数.例如:对于句子“one little two little three little boys”,总共有5个不同的单词:one, ...
随机推荐
- BZOJ 4816 [Sdoi2017]数字表格 ——莫比乌斯反演
大力反演出奇迹. 然后xjb维护. 毕竟T1 #include <map> #include <ctime> #include <cmath> #include & ...
- jquery不同版本导致的checkbox设置了属性,但是没有选中效果
由于本人好久不做B/S了,今天同学问我个问题才发现了jquery版本还是存在差异的,今天写的就是关于获取checkbox属性的方式(可能不应该叫属性了其实,后面就知道了). 看下面的代码截图吧 < ...
- 一次向linux开源社区提交补丁的经历
背景 在开发过程中,偶然发现了spinand驱动的一个bug,满怀欣喜地往社区提补丁.这是怎么样的一个bug呢? static int spinand_mtd_read(struct mtd_info ...
- es6总结(七)--数据结构-Set & Map
- LeetCode OJ-- Simplify Path **
https://oj.leetcode.com/problems/simplify-path/ 对linux路径的规范化,属于字符串处理的题目.细节很多. #include <iostream& ...
- 推荐!手把手教你使用Git(转)
原文出处: 涂根华的博客 欢迎分享原创到伯乐头条 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放 ...
- 大文件LOG持续输出
作了两个版本,一是websocket输出,一是直接显示指定行数. class WebSocketHandler(tornado.websocket.WebSocketHandler): file_co ...
- AC日记——[CQOI2014]危桥 洛谷 P3163
题目描述 Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多只能通行两次.A ...
- tomcat7.0.55配置单向和双向HTTPS连接(二)
上一篇文章:tomcat7.0.55配置单向和双向HTTPS连接 只是简要的配置了一下HTTPS,还有许多问题没有解决,本篇来解决这些文件 首先按照这篇文章:Widows下利用OpenSSL生成证书来 ...
- SQLite的sqlite_sequence表
SQLite的sqlite_sequence表 sqlite_sequence表也是SQLite的系统表.该表用来保存其他表的RowID的最大值.数据库被创建时,sqlite_sequence表会 ...