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

目录
相关文章
|
消息中间件 监控 API
在Python中如何实现微服务架构,及相关的服务间通信方案?
Python微服务架构涉及服务划分、注册发现、通信协议选择(如HTTP、gRPC、消息队列)及服务间通信实现。每个服务应自治,有独立数据库和部署流程,并需考虑容错(如分布式事务、重试、熔断)和监控日志。API网关用于请求管理和路由。实际操作需根据需求和技术栈调整,并关注服务拆分和数据一致性。
654 5
|
存储 缓存 Oracle
常识四堆外内存
常识系列,作为一名互联网门外汉的科普系列 堆外内存除了在像netty开源框架中,在平常项目中使用的比较少,在现前的项目中,QPS要求高的系统中,堆外内存作为其中一级缓存是相当有成效的。所以来学习一下,文中主要涉及到这三分部内容 1. 堆外内存是什么?与堆内内存的区别 2. 怎么分配,与GC的影响 3. 开源框架使用 这篇文章写到最后,发现还只是回答了开源框架OHC的Why not use ByteBuffer.allocateDirect()?
1821 1
常识四堆外内存
|
Web App开发 安全 Ubuntu
在Linux中,如何安装新软件?
在Linux中,如何安装新软件?
|
机器学习/深度学习 人工智能 自然语言处理
人工智能技术在金融领域的应用有哪些?
【10月更文挑战第16天】人工智能技术在金融领域的应用有哪些?
4731 1
|
消息中间件 Kafka 数据库
深入理解Kafka的数据一致性原理及其与传统数据库的对比
【8月更文挑战第24天】在分布式系统中,确保数据一致性至关重要。传统数据库利用ACID原则保障事务完整性;相比之下,Kafka作为高性能消息队列,采用副本机制与日志结构确保数据一致性。通过同步所有副本上的数据、维护消息顺序以及支持生产者的幂等性操作,Kafka在不牺牲性能的前提下实现了高可用性和数据可靠性。这些特性使Kafka成为处理大规模数据流的理想工具。
441 6
|
数据采集 存储 自然语言处理
快速构建企业智能门户,销售额倍增,人才触手可及 - 爬虫 + RAG + LLM
本文介绍了一款基于大模型的智能企业门户接待系统,旨在通过先进的AI技术,实现企业网站信息的自动化处理与响应,提高客户支持、产品推荐和人才招聘的效率。系统利用爬虫技术自动提取公司官网信息,结合语音识别、大模型生成等技术,支持语音和文本输入,通过RAG(检索增强生成)方式生成精准回答,并支持语音播报,提供类似真人的接待体验。项目涵盖了环境准备、数据构建、代码实现、测试调优、部署等多个阶段,详细记录了开发过程中遇到的问题及解决方案,展示了系统在咨询公司信息、产品询问及招聘岗位咨询等场景下的应用潜力。未来计划在数据类型支持、会话记忆、并发处理、语音合成等方面进一步优化,以提升用户体验和服务质量。
444 0
|
弹性计算 安全 Linux
阿里云ECS Linux系统漏洞修复详细教程
阿里云ECS Linux系统漏洞修复详细教程
|
敏捷开发 测试技术 持续交付
团队如何选择合适的Git分支策略
选择合适的分支模型 Git代码分支管理模型各具特点,流程只是一个辅助工具,没有最好,只有最合适。 • 如果开发团队规模较小又比较分散,产品发布周期较短(例如:初创公司,或者开发的是一个网站或 Web 应用程序,在一天内可能需要发布多个版本),可以选择GitHub flow或者GitLab flow; • 如果开发团队规模较大,产品发布周期较长(例如:团队超过20人,采用了月度或季度发布周期,并且由一个团队负责并行开发多个项目),可以选择Git flow,发布周期较短可以选择TBD flow; • 如果开发团队规模大,产品发布周期长,同时对敏捷的要求比较高,可以考虑TBD++ flow。每个组织
15495 27
团队如何选择合适的Git分支策略
|
消息中间件 分布式计算 Kafka
深度分析:Apache Flink及其在大数据处理中的应用
Apache Flink是低延迟、高吞吐量的流处理框架,以其状态管理和事件时间处理能力脱颖而出。与Apache Spark Streaming相比,Flink在实时性上更强,但Spark生态系统更丰富。Apache Storm在低延迟上有优势,而Kafka Streams适合轻量级流处理。选型考虑延迟、状态管理、生态系统和运维成本。Flink适用于实时数据分析、复杂事件处理等场景,使用时注意资源配置、状态管理和窗口操作的优化。
|
Java
Direct buffer OutOfMemoryError
Direct buffer OutOfMemoryError
262 0