BitSet位图进行去重海量数据

问题

怎么在40亿个整数中找到唯一重复的数字?

1.Set的不可重复性

 if(set.contains(x))
      System.out.println("重复的数字是"+x);
 else{
     set.add(x);
 }
  

但是,contains()方法消耗的时间,消耗的空间很大,毕竟有约40亿的数据,所以觉得HashSet是不可取的。

2.位图

BitSet就是位图,它的值只有1和0。内部是基于long[]实现的,long是8字节(64位),所以Bitset最小是64位,每次扩大一次扩大64位,即内部大小是64的倍数。每次BitSet新增加一个数字时,就将该位置为1。

也就是说BitSet并不直接存储每个数据,而是存储数字是否存在过(1表示存在,0表示不存在)。

数字范围 [0,63] [64,127] [128,191]
long数组索引 0 1 2

若添加一个数字 10 ,那么将long[0]的二进制位中从左往右第十个数置为1,

若添加一个数字 64 ,那么将long[1]的二进制位中从左往右第一个数置为1,没有添加的数字所在位数是0,用此方法就可记录一个数字是否在BitSet中。

牛客题目

在这里插入图片描述
凡是涉及到去重统计都可以用位图实现。因为每一个不同的数据只需要用二进制的一位存储即可,大大减小了统计所使用的存储空

import java.util.Scanner;
import java.util.BitSet;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.next();
        //总共有128个字符。字需要用128位
        BitSet bitSet = new BitSet(128);
        for (char c : line.toCharArray()) {
            //判断字符c是否已出现
            if (!bitSet.get(c)) {
                //未出现就设置为已出现
                bitSet.set(c);
            }
        }
        //统计有多少字符已出现过
        System.out.println(bitSet.cardinality());
    }
}

参考:Java BitSet解决海量数据去重

相关推荐

  1. Python 字典组成的数组怎么进行?

    2024-06-12 08:50:04       16 阅读
  2. python进行字典

    2024-06-12 08:50:04       9 阅读
  3. js 数组

    2024-06-12 08:50:04       39 阅读
  4. ArrayList数组

    2024-06-12 08:50:04       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 08:50:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 08:50:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 08:50:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 08:50:04       18 阅读

热门阅读

  1. 简单聊聊Vue

    2024-06-12 08:50:04       9 阅读
  2. 微信小程序·审核

    2024-06-12 08:50:04       8 阅读
  3. Hive的存储格式和压缩算法的特点和选择

    2024-06-12 08:50:04       7 阅读
  4. React和Vue有什么区别

    2024-06-12 08:50:04       7 阅读
  5. ubuntu22.04禁止自动休眠的几种方式

    2024-06-12 08:50:04       8 阅读
  6. 算法训练营day53

    2024-06-12 08:50:04       7 阅读
  7. 代码随想录算法训练营day44

    2024-06-12 08:50:04       8 阅读
  8. 【环境搭建】3.阿里云ECS服务器 安装Redis

    2024-06-12 08:50:04       7 阅读