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

目录
相关文章
|
11月前
|
存储 Java Nacos
Spring Cloud+Nacos+KMS 动态配置最佳实践
本文讲述了 Spring Cloud 应用中结合 Nacos 实现了运行期配置动态更新的功能,以及在此基础上结合 KMS 在不改动代码的情况下对应用使用的敏感配置进行保护,解决将配置迁移到 Nacos 中可能存在的数据安全顾虑,并对其底层工作原理做了简单介绍。
1280 155
|
小程序 JavaScript
Taro@3.x+Vue@3.x+TS开发微信小程序,使用轮播图
本文介绍了使用 Taro 和 Vue 创建轮播组件的两种方法:一是通过 `&lt;swiper&gt;` 实现,二是利用 Nut UI 的 `&lt;nut-swiper&gt;` 组件实现。
399 2
Taro@3.x+Vue@3.x+TS开发微信小程序,使用轮播图
|
11月前
|
API
使用京东API接口进行支付结算有哪些注意事项?
使用京东API接口进行支付结算时,需遵守京东开放平台规定,保护用户隐私,关注API接口变化,确保应用合法、完整、可靠,正确使用API对接信息,保持API接口调用成功率,及时整改程序缺陷,结算依据以商家后台系统为准。如需帮助,请私信或评论联系。
|
12月前
ThreeJs给物体添加贴图
这篇文章详细说明了在Three.js中如何给3D物体添加贴图,并展示了实现局部贴图的技术和方法。
526 1
ThreeJs给物体添加贴图
|
12月前
|
存储 JavaScript 前端开发
什么是循环引用现象呢
【10月更文挑战第13天】什么是循环引用现象呢
256 0
|
监控 算法 安全
基于颜色模型和边缘检测的火焰识别FPGA实现,包含testbench和matlab验证程序
本项目展示了基于FPGA的火焰识别算法,可在多种应用场景中实时检测火焰。通过颜色模型与边缘检测技术,结合HSV和YCbCr颜色空间,高效提取火焰特征。使用Vivado 2019.2和Matlab 2022a实现算法,并提供仿真结果与测试样本。FPGA平台充分发挥并行处理优势,实现低延迟高吞吐量的火焰检测。项目包含完整代码及操作视频说明。
|
12月前
|
存储 安全 物联网
|
Oracle 关系型数据库 数据挖掘
|
开发框架 .NET 数据库连接
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
234 0