BitMap介绍

简介: BitMap介绍

问题引出:从亿万级数据中存储查找某个数据是否存在?

什么是Bitmap算法?百度给了一个简单易懂的讲解:http://baijiahao.baidu.com/s?id=1575038901090600&wfr=spider&for=pc

我们在判断一个数据是否存在,基本思路是读出来然后遍历一遍,判断Boolean

 

判断是否存在

 
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
 
public class IsNumberExist {
  private int[] bitmap;
  private int size;
  private int SHIFT = 5;// 2的5次方是32
 
  public boolean isNumberExist(int number) {
    int bit = number >> SHIFT;
    int index = number & ((1 << SHIFT) - 1);
    return ((1 << index) & bitmap[bit]) != 0;
  }
 
  public IsNumberExist(int size) {
    this.size = size;
    bitmap = new int[(size >> SHIFT) + 1];
  }
 
  public void insertDate(int number) {
    int bit = number >> SHIFT;
    int index = number & ((1 << SHIFT) - 1);
    bitmap[bit] = bitmap[bit] | (1 << index);
  }
 
  public void insertFromTxt(String filename) {
    try {
      BufferedReader br = new BufferedReader(new FileReader(filename));
      String str = null;
      while ((str = br.readLine()) != null) {
        insertDate(Integer.valueOf(str));
      }
      br.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
 
  public static void main(String[] args) {
    Runtime rt = Runtime.getRuntime();
    System.out.println("当前JVM所占内存:" + (rt.totalMemory() - rt.freeMemory())
        / 1024 / 1024 + "M");
    IsNumberExist tool = new IsNumberExist(1000000000);
    System.out.println("当前JVM所占内存:" + (rt.totalMemory() - rt.freeMemory())
        / 1024 / 1024 + "M");
    // Date.makeNumbers(100000000);//生成一亿个数到number.txt
    tool.insertFromTxt("numbers.txt");// 使用这个一亿个数初始化bitmap的状态
    System.out.println(tool.isNumberExist(88888888));// 判断88888888是否在这个文件中
    System.out.println(tool.isNumberExist(99999999));// 判断99999999是否在这个文件中
    System.out.println(tool.isNumberExist(91725151));// 判断91725151是否在这个文件中
 
  }
}

生成数据class

 
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
 
public class Date {
  public static boolean makeNumbers(int size) {
    boolean flag = true;
    Random random = new Random();
    try {
      BufferedWriter bw = new BufferedWriter(
          new FileWriter("numbers.txt"));
      for (int i = 0; i < size; i++) {
        bw.write(String.valueOf(Math.abs(random.nextInt(size))));
        bw.newLine();
      }
      bw.close();
    } catch (IOException e) {
      flag = false;
      e.printStackTrace();
    }
    return flag;
  }
 
  public static void main(String[] args) {
    System.out.println(makeNumbers(100000000));
  }
}

利用位映射原理对大数据排重 --- Java代码实现:https://blog.csdn.net/a3192048/article/details/80261699

目录
相关文章
|
22天前
|
存储 Java
Bitmap位图(Java实现)
本文介绍了使用Java实现一个简单的Bitmap,通过自定义byte数组存储数据,提供put和exist方法分别用于插入数据和查询数据是否存在。Bitmap利用位操作高效地管理大量布尔值,适用于空间优化的场景。代码中详细解释了位图的核心原理、方法实现及边界检查。后续计划探讨位图在海量数据去重中的应用及JDK BitSet源码分析。
55 7
|
2月前
|
存储 监控
Bitmap
【10月更文挑战第7天】
35 1
|
6月前
|
开发框架 .NET C#
详细解读Bitmap的优化
详细解读Bitmap的优化
41 0
|
6月前
|
API Android开发
55. 【Android教程】位图:Bitmap
55. 【Android教程】位图:Bitmap
77 0
使用Bitmap.createBitmap遇到的问题
使用Bitmap.createBitmap遇到的问题
463 0
|
Java Android开发
Bitmap详解
Bitmap的分析与使用 Bitmap的创建 创建Bitmap的时候,Java不提供new Bitmap()的形式去创建,而是通过BitmapFactory中的静态方法去创建,如:BitmapFactory.
2107 0
|
存储 编解码 API
|
存储 算法 程序员
Bitmap 算法
位图算法,内存中连续的二进制位bit,用于对大量整型数据做去重和查询。 举个例子,给定一块长度是10bit的内存空间,依次插入4,3,2,1,怎么存储? 1. 给定长度是10的bitmap,每一个bit位分别对应着从0到9的10个整型数。
1537 0