`
ansjsun
  • 浏览: 199532 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

BitMap 用于查重..只能查数字

阅读更多
package ansj.sun.util;
public class BitMap {

	private static final byte MAX = 127;

	public static void main(String[] args) throws InterruptedException {
		int m = 1578015112 ;
		
		BitMap hm = new BitMap() ;
		
		hm.add(m) ;
		
		System.out.println(hm.contains(m));
	}

	public BitMap() {
		bytes = new byte[12500000];
	}

	public BitMap(int size) {
		bytes = new byte[size];
	}

	private byte[] bytes = null;

	public void add(int i) {
		int r = i / 8;
		int c = i % 8;
		bytes[r] = (byte) (bytes[r] | (1 << c));
	}

	public boolean contains(int i) {
		int r = i / 8;
		int c = i % 8;
		if (((byte) ((bytes[r] >>> c)) & 1) == 1) {
			return true;
		}
		return false;
	}

	public void remove(int i) {
		int r = i / 8;
		int c = i % 8;
		bytes[r] = (byte) (bytes[r] & (((1 << (c + 1)) - 1) ^ MAX));
	}

}
分享到:
评论
3 楼 ansjsun 2012-01-06  
chenyinle 写道
当整型数值小于1亿时,你的算法才有用,大于一亿的话,你的byte数组不够用了

 public BitMap() {   
        bytes = new byte[12500000];   
   } 


12500000  * 8 = 100000000  ;
你修改byte数组的初始大小就可以...
我试过50亿..其实只要内存储足够大 ....多大都不是问题..这只是一种压缩策略....
不是算法..就是个小技巧
2 楼 chenyinle 2012-01-06  
当整型数值小于1亿时,你的算法才有用,大于一亿的话,你的byte数组不够用了
1 楼 huqilong 2011-09-20  
呵呵,学习了.

相关推荐

Global site tag (gtag.js) - Google Analytics