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, ...
随机推荐
- RSA签名
RSA签名: /** * RSA签名 * @param content 待签名数据 * @param privateKey 商户私钥 * @return 签名值 */public static ...
- Python图像处理库PIL从入门到精通
https://blog.csdn.net/column/details/pythonpil.html 示例: from PIL import Image import pytesseract pyt ...
- POJ 2411Mondriaan's Dream
题目: Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after prod ...
- 标准C程序设计七---102
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- 删除指定文件夹下所有的.svn文件夹
sudo find /目录 -name ".svn" -exec rm -r {} \;
- java通过代码控制线程状态,解决线程不安全的问题。
写两个类,Input,output 两个都是使用同步代码块的方式实现线程间的同步 input类,是为变量赋值 output类,是打印变量 由于线程争夺cpu造成数据的不匹配 通过,设立一个 flag ...
- js-在url后面添加时间戳清除浏览器打开页面的缓存
这个解决办法还是在网上搜出来的,我还没有测试呢: 我有想既然可以添加时间戳,那可以添加随机数吗?我感觉是可以的,尽管没有测试过. 2018-3-13 几天前我就这个问题询问过我们的后台,加时间戳能否真 ...
- bzero和memset
一. bzero和memset函数 1. bzero已不建议使用 原型:extern void bzero(void *s, int n); 2.memset void *memset(void *s ...
- Linux字符模式下如何设置/删除环境变量
Linux字符模式下设置/删除环境变量方法: bash下 设置:export 变量名=变量值 删除:unset 变量名 csh下 设置:setenv 变量名 变量值 删除:unsetenv 变量名 h ...
- Java并发编程实战 读书笔记(一)
最近在看多线程经典书籍Java并发变成实战,很多概念有疑惑,虽然工作中很少用到多线程,但觉得还是自己太弱了.加油.记一些随笔.下面简单介绍一下线程. 一 线程与进程 进程与线程的解释 个人觉 ...