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, ...
随机推荐
- [luoguP3355] 骑士共存问题(二分图最大独立集)
传送门 模型 二分图最大独立集,转化为二分图最大匹配,从而用最大流解决. 实现 首先把棋盘黑白染色,使相邻格子颜色不同. 把所有可用的黑色格子看做二分图X集合中顶点,可用的白色格子看做Y集合顶点. 建 ...
- BZOJ1226 [SDOI2009]学校食堂Dining 【状压dp】
题目 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数表示 ...
- Qtree
Qtree Ⅰ 题意:https://vjudge.net/problem/SPOJ-QTREE 带修路径查询最大边权 sol :树链剖分,之后每条重链就是一个连续的区间,拿线段树维护即可 简单讲讲 ...
- 刷题总结——开车旅行(NOIP2012 set+倍增)
题目: 题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城 ...
- [暑假集训--数位dp]hdu3555 Bomb
The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the ti ...
- poj 3168 Barn Expansion
Barn Expansion Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2465 Accepted: 666 Des ...
- FZOJ Problem 2107 Hua Rong Dao
...
- 学习javascript设计模式之单例模式
1.单例模式的核心是确保只有一个实例,并提供全局访问. 2.惰性单例 指的是在需要的时候才创建对象实例. 如在页面中创建唯一div 普通做法 var createDiv = (function(){ ...
- 34深入理解C指针之---通过字符串传递函数
一.通过字符串传递函数 1.定义:可以使用函数名(字符串)调用函数,也可以使用函数指针调用函数,将两者结合 2.特征: 1).在函数声明时使用函数指针 2).调用函数时使用函数名称(字符串) 3).可 ...
- js 去掉以逗号分割的字符串中头尾和中间多余的逗号
let permission = ",,,106,105,108,,,109,110,107,,101,,," let permission = "106,105,108 ...