文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

我们聊聊如何在两组10亿数据中查找重复数据?

2024-11-28 16:22

关注

本文分析下一个经典面试题:如何在两组10亿数据中查找重复数据?

这个问题一般会有一个前提和一个约束:

  1. 前提是内存或存储空间受限,不足以使用Map等数据结构,即无法完全加载数据后再做对比;
  2. 约束是重复数据的筛选粒度,是模糊筛选还是精确筛选,不同的约束需要使用不同的方式。

本文先讲解下模糊筛选约束下如何实现。

分析考点

一般来说,面试题和我们之前的考试是相似的,每个问题都会有一个考察点。

那本题的考察点是什么呢?作为面试官,我希望从这个问题中考察同学的知识的宽度和对位图的理解。

说实在的,随着Java栈发展越来越完善,面试中的问题也越来越难。

回想十年前,面试能够讲清楚JMM,就已经算是头部选手的。但是十年后的今天,如果不会JMM,估计连一面都过不了。所以很多时候,都已经跳过问这么简单问题了。

整个行业都是如此,入门门槛越来越高,对应届生要求越来越高,要求大家更加专业。大势如此,我们只能顺势而为。

第二个要考察的点是能够想到资源有限,并能够回答位图的优势是占用资源少。

如果能够答出这两个点,这个题就是90分,如果再有更深的理解,我甚至可以忽略面试者不懂JMM。

纸上与躬行

纸上得来终觉浅,觉知此事需躬行。

我们直接编写一下代码,结束Guava的布隆过滤器。

public class FuzzyFilter {
    static final int nums = 1_000_000_000;

    // 创建布隆过滤器
    static final BloomFilter bloomFilter = BloomFilter.create(Funnels.stringFunnel(UTF_8), nums, 0.0001);

    public void add(String key) {
        bloomFilter.put(key);
    }

    public boolean contains(String key) {
        return bloomFilter.mightContain(key);
    }

    public static void main(String[] args) {
        final FuzzyFilter fuzzyFilter = new FuzzyFilter();
        final Random random = new Random(Integer.MIN_VALUE);
        for (int i = 0; i < nums; i++) {
            final String key = random.nextInt() + "";
            fuzzyFilter.add(key);
        }

        int count = 0;
        for (int i = 0; i < nums; i++) {
            final String key = random.nextInt() + "";
            if (fuzzyFilter.contains(key)) {
                count++;
            }
        }
        System.out.println("重复key数量为:" + count);
    }
}

我们先借助Guava生成布隆过滤器BloomFilter,我们定义下期望数量是10亿,误差率是0.0001,此时布隆过滤器占用位数是 19,170,116,754 位,需要使用13个hash函数。

差不多2.2G的空间,就可以处理10亿的数据,相当节省空间了。

到这里,是不是发现很简单的一道题。很多时候,不是不会,而是没见过。见过之后,发现,不过如此。

总结

本文介绍了如何在两组10亿数据中模糊查找重复数据,通过布隆过滤器的能力,实现2G空间实现10亿个数据比对。

来源:看山的小屋内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯