首页 > 其他分享 >面试官:如何实现10亿数据判重?

面试官:如何实现10亿数据判重?

时间:2024-02-27 10:46:50浏览次数:22  
标签:10 面试官 判重 元素 bitmap BitSet 数据量 BitMap

From: https://mp.weixin.qq.com/s/l2yVtL5siHpxzNLuxJ3nkQ

当数据量比较大时,使用常规的方式来判重就不行了。

例如,使用 MySQL 数据库判重,或使用 List.contains() 或 Set.contains() 判重就不可行,因为 MySQL 在数据量大时查询就会非常慢,而数据库又是及其珍贵的全局数据库资源。

《阿里巴巴Java开发手册》上也说了,如果单表数据量超过 500 万或 2GB 时就建议分库分表了,如下图所示:

图片

所以数据库去重显然是不行的。而使用集合也是不合适的,因为数据量太大,使用集合会导致内存不够用或内存溢出和 Full GC 频繁等问题,所以此时我们的解决方案通常是采用布隆过滤器来实现判重。

知识扩展

除了布隆过滤器之外,我们还可以使用 BitMap(位图)的数据类型来实现判重。

位图(BitMap)是一种数据结构,用于表示一个特定范围内的元素是否存在或者某种状态,通常用二进制位来表示。在位图中,每一个位只能是 0 或 1,分别表示元素不存在或存在。位图通常用一个 bit 数组来实现,每个 bit 位对应一个元素,如下图所示:

图片

其中,上图中的 1 表示有值,上面 BitMap 描述的值是 1,3,5。

BitMap 优点分析

位图的优势包括:

  1. 空间效率优势:位图极大地节省了存储空间。对于大量稀疏数据,特别是当元素数量远大于实际存在的项时,相比于使用传统的列表、集合等数据结构,位图占用的空间极小。
  2. 查询速度:由于内存访问是按字节或字进行的,因此对单个元素的存在性检查时间复杂度为 O(1),即常量时间,非常快速。
  3. 批量操作高效:对于批量插入、删除和查询操作,尤其是统计某一范围内元素的数量,位图表现出优秀的性能。

BitMap VS int

以 Java 中的 int 为例,来对比观察 BitMap 的优势,在 Java 中,int 类型通常需要 32 位(4 字节*8),而 BitMap 使用 1 位就可以来标识此元素是否存在,所以可以认为 BitMap 占用的空间大小,只有 int 类型的 1/32,所以有大数据量判重时,使用 BitMap 也可以实现。

PS:布隆过滤器的底层就是基于 BitMap 数据结构实现的。

BitMap 在 Java 中的使用

BitMap 在 Java 中的具体实现是 java.util 中的 BitSet,BitSet 是一个可变大小的位向量,能够动态增长以容纳更多的位数据,以下是 BitSet 基本使用示例:

import java.util.BitSet;

public class BitmapExample {
    public static void main(String[] args) {
        // 创建一个BitSet实例
        BitSet bitmap = new BitSet();

        // 设置第5个位置为1,表示第5个元素存在
        bitmap.set(5);

        // 检查第5个位置是否已设置
        boolean exists = bitmap.get(5);
        System.out.println("Element at position 5 exists: " + exists);  // 输出: Element at position 5 exists: true

        // 设置从索引10到20的所有位置为1
        bitmap.set(10, 21);  // 参数是包含起始点和不包含终点的区间

        // 计算bitset中所有值为1的位的数量,相当于计算设置了的元素个数
        int count = bitmap.cardinality();
        System.out.println("Number of set bits: " + count);

        // 清除第5个位置
        bitmap.clear(5);

        // 判断位图是否为空
        boolean isEmpty = bitmap.isEmpty();
        System.out.println("Is the bitset empty after clearing some bits? " + isEmpty);
    }
}

课后思考

除了布隆过滤器和 BitMap 之外,还有哪些大数据量判重的实现方案呢?布隆过滤器实现判重的原理又是啥呢?

 

标签:10,面试官,判重,元素,bitmap,BitSet,数据量,BitMap
From: https://www.cnblogs.com/joeblackzqq/p/18036390

相关文章

  • Creo10.0安装
    来自:最新版Creo10.0详细安装教程(含安装包)-知乎(zhihu.com) 解压前:先关闭“所有杀毒软件(部分电脑自带的“迈克菲”也要关闭)、防火墙、WindowsDefender”,否则可能会被杀毒软件误杀无法运行。1,打开【PTC.Creo.10.0.0.0.Win64-SSQ\_SolidSQUAD_\PTC.LICENSE.WINDOWS.2023-04-......
  • P1110 (平衡树实现)
    难度1还是比较板的一道题,考的是对平衡树各功能的灵活使用。首先看要求的操作,发现操作三在每次插入时求下前驱后继即可,因为如果答案不是有这个更新的,那么这个答案必定在之前计算过,所以能保证正确性。然后看操作二,发现在每次插入时,有一个原来的差不能再对答案做出贡献,并且有两个新......
  • P10156(dp思想)
    难度2也是比较有意思的一道题。首先发现每个小团体独立,所以对于每个小团体分开直接暴力dp,dp[i][j]表示当前小团体做到第i人,走了j人,然后O(n)转移,加上部分分喜提50pts。为什么要O(n)转移呢,因为我要枚举匹配的两个人然后算贡献。但是对于这种带绝对值的贡献,我们一般都要把绝对值拆掉......
  • 【10.0】JavaScript之引入
    【一】JavaScript介绍【1】什么是jsjs也是一门编程语言,他可以写后端代码【2】什么是node.js前端由于非常受制于后端,所以有一些人异想天开想要通过js来编写后端代码一统江湖由此开发了一个叫nodejs的工具(支持js跑在后端服务器上)但是并不能完美的实现【3】JavaScript......
  • 10
    《程序是怎样跑起来的》第十章读后感第十章主要探讨了计算机中数据的表示方式,以及二进制数的基础知识。这一章详细解释了位和字节的关系,以及二进制数在计算机中的重要性。此外,还涉及了数据的存储、运算和编码等方面,这些都是理解计算机如何处理和存储数据的关键。读完这一章,我对......
  • Go 100 mistakes - #77: Common JSON-handling mistakes
       ......
  • 初中英语优秀范文100篇-090How to keep safe?-如何保持安全
    PDF格式公众号回复关键字:SHCZFW090记忆树1Asteenagers,weshouldalwayskeepsafetyinmind.翻译作为青少年,我们应该始终把安全牢记在心简化记忆青少年句子结构Asteenagers状语,描述主语的身份we作为青少年的人们情态动词should表示义务或建议。谓语alway......
  • TOP10漏洞原理
    1、sql注入:web应用程序对用户输入的数据没有进行过滤,或者过滤不严,就把sql语句拼接进数据库中执行,造成sql注入危害2、xss:前端页面代码过滤不严格,导致可以插入的恶意js代码并执行3、xxe:程序在解析XML文档输入时,没有禁止外部实体的加载,导致可引用恶意外部实体4、文件上传:上传文件......
  • Go 100 mistakes - #76: time.After and memory leaks
       ......
  • P6492 [COCI2010-2011#6] STEP
    原题链接题解单点修改线段树,向上更新,再注意下转移方程就行了code#include<bits/stdc++.h>usingnamespacestd;inttree[800005]={0};intlen[800005][2][2]={0};//代表第几个节点,0/1在左/右边的最大有效长度inta[200005];voidpushup(intnode,intl,intr,intmid){......