【算法】阿里面试题-编码实现20亿个整数,找出某个数X是否存在其中

news2024/9/21 23:40:04

1.海量数据去重-BitMap位图解决方案

  • 需求(面试题)

    • 一个32位4G内存的操作系统,在20亿个整数,找出某个数X是否存在其中

    • 假如是java语言,int占4字节,1字节=8位(1 byte = 8 bit)

    • 方式一:每个数字是int类型存储,就是20亿个int需要的空间大小就是 7GB多

    • 方式二:不存储具体数据,而存储是否存在,如果存在则位上存储1,采用bit位存储20亿个数就是20亿位,空间是0.2GB多

  • 什么是BitMap位图

    • 本质上是哈希表的一种应用实现,原理简单,以 bit 为单位构建数组的方案,就叫作 Bitmap,翻译为位图。即bit 的集合
    • 使用一个bit表示状态, 两种状态 (0不存在和1存在) 使用最少字节的类型来定义数组,即最小的空间存储数据标识

在这里插入图片描述

  • 注意

    • 位图适合对【数值类型】的海量数据进行查询统计、排序、去重 和 对两个集合做交集、并集运算
    • bitmap在数据连续的时候,非常节省空间,但是在数据稀疏的时候,会有极大的浪费
  • 缺点

    • 数据碰撞:
      • 字符串映射到 bitmap会有碰撞问题,即可能映射到同个位置,即hash碰撞
    • 稀疏数据
      • 不连续的数据容易浪费空间,比如存入1和88两个数,需要构建长度89的数组
      • 表示索引从1到88,所以需要构建一个长度为89的数组,存放1到88的元素,但实际只存储2个数字
      • 如果用户的ID的数据类型是int32的话,那么最大值是2^32,需要用512MB的字节的位图来表示
        • 2^32bit=4294967296 比特(bit)=512 兆字节(MB)
        • 如果只往bitmap存储一个最大值,那边需要申请512 兆字节(MB),大大浪费空间
  • 业务应用:日活/月活UV统计、签到统计、用户点赞,用户签到,访问计数,在线用户数等

2.编码实现20亿个数据,找出某个数X是否存在其中

  • 题目需求

    • 20亿个数据,找出某个数X是否存在其中

    • 前提条件:使用java现有数据结构或自定义数据结构,要求高效和省空间

  • 位图在java里面的实现BitSet类

    • 是一个实现按需增长的位向量,位Set的每一个位置都有一个boolean值,默认初始值都是false

    • 底层实现是使用long数组作为内部存储结构的,所以BitSet的大小为long类型大小(64位)的整数倍

    • 如果指定了bitset的初始化大小,会规整到一个大于或者等于这个数字的64的整倍数(内存对齐)

      • 比如64位,bitset的大小是1个long,而65位时,bitset大小是2个long,即128位
  • 主要的API

void and(BitSet set) 对此目标位 set 和参数位 set 执行逻辑与操作。

void or(BitSet set) 对此目标位集执行逻辑或操作

void clear() 将此 BitSet 中的所有位设置为 false

void clear(int bitIndex):将指定索引处的位设置为 false

void set(int index) 将指定索引处的位设置为 true

boolean get(int index) 返回指定索引处的位值

int size():返回此 BitSet 中的位数(按逻辑大小)【表示位值时实际使用空间的位数,值是64的整数倍】

int length() 返回此 BitSet 的"逻辑大小",BitSet 中最高设置位的索引加 1

int cardinality() 返回此 BitSet 中设置为 true 的位数
  • 解答思路

    • 海量数据 里面查找是否存在,排序,交集,并集等,这类题目基本就是使用位图解决

    • 给定20亿个不重复的 int的整数,再给一个数,如何快速判断这个数是否在那X亿个数当中

    • 解法:遍历X亿个数字,映射到BitMap中,对于给出的数,直接判断指定的位上存在不存在即可

  • 编码实现

public class BitSetTest {

    public static void main(String[] args) {

        int targetNum = 39;

        boolean flag = seekNum(targetNum);

        System.out.println("当前数值是否在集合中:"+flag);
    }

    public static boolean seekNum(int targetNum){
        //定义数据生成范围
        int numLength = 2000000000;

        //定义位图
        BitSet bitSet = new BitSet(numLength);

        //随机生成数字
        for (int i = 1; i <= numLength; i++) {
            int random = (int) (Math.random() * numLength);
            bitSet.set(random);
        }

        //输出基本信息
        System.out.println("bitMap是1的个数:"+bitSet.cardinality());
        System.out.println("bitMap的size:"+bitSet.size());
        System.out.println("bitMap的length:"+bitSet.length());

        //判断数值是否存在
        return bitSet.get(targetNum);
    }

}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mockito 入门

目录1.什么是 Mock 测试&#xff1f;2.Mockito简介3.在 SpringBoot 单元测试中使用 Mockito3.1 Maven依赖&#xff1a;3.2 UserService.java3.3 User.java3.4 thenReturn系列方法&#xff08;测试桩&#xff09;3.5 thenThrow系列方法3.6 verify 系列方法4.Spring中mock任何容器…

计算机组成原理-动态链接库-笔记

Linux 下的 ELF 文件格式 Windows 的可执行文件格式是一种叫作PE&#xff08;Portable Executable Format&#xff09;的文件格式 动态链接库 这些机器码必须是“地址无关”的。也就是说&#xff0c;我们编译出来的共享库文件的指令代码&#xff0c;是地址无关码&#xff08;…

10个可以实现高效工作与在线赚钱的 AI 工具网站

自 2020 年以来&#xff0c;内容开发领域已经感受到人工智能工具的存在。 目前&#xff0c;营销人员和内容创作者正在利用这些工具来加快他们的工作流程。 如果您拥有最流行的 AI 工具之一&#xff0c;例如 CopyAI、Jasper AI 或 Content at Scale&#xff0c;您可能正在考虑…

申论套卷 | 要点杂、乱、碎的材料如何快速分类整理?

试卷来源&#xff1a;2020年全国联考上半年材料1A省C市Y区文化馆&#xff08;非物质文化遗产保护中心&#xff09;作为政府设立的公益性公共文化事业单位&#xff0c;始终坚持公益文化发展方向&#xff0c;面向基层、贴近百姓、服务大众&#xff0c;积极组织各种大型活动&#…

Ubuntu中安装matelab2020a

Ubuntu中安装matelab2020a1 matelab下载2 安装步骤3 激活matelab4 创建快捷方式我的Ubuntu版本是20.041 matelab下载 matelab官网https://www.mathworks.com/ 点击右上角的get matelab&#xff0c;进入下载页面 没有账号的同学可以先去注册一个&#xff0c;推荐使用教育邮箱&…

错误: tensorflow.python.framework.errors_impl.OutOfRangeError的解决方案

近日&#xff0c;在使用CascadeRCNN完成目标检测任务时&#xff0c;我在使用这个模型训练自己的数据集时出现了如下错误&#xff1a; tensorflow.python.framework.errors_impl.OutOfRangeError: PaddingFIFOQueue _1_get_batch/batch/padding_fifo_queue is closed and has in…

前端JS内存管理

JS内存管理 内存原理&#xff1a; 任何变成语言在执行的时候都需要操作系统来分配内存&#xff0c;只是有些语言需要手动管理分配的内存有些语言有专门来管理内存的方式 如 JVM 了解以上的概念之后&#xff0c;我们再来了解一下大致的内存周期 分配需要的内存使用内存在不使用…

Linux- 系统随你玩之--好用到炸裂的系统级监控、诊断工具

文章目录1、前言2、lsof介绍2.1、问题来了&#xff1a; 所有用户都可以采用该命令吗&#xff1f;3、 服务器安装lsof3.1、安装3.2、检查安装是否正常。4、lsof 命令4.1、常用功能选项4.2、输出内容4.2.1 、FD和 TYPE列5、 lsof 命令实操常见用法6 、常用组合命令7、 结语1、前言…

OpenHarmony 3.2 Beta Audio——音频渲染

一、简介Audio是多媒体子系统中的一个重要模块&#xff0c;其涉及的内容比较多&#xff0c;有音频的渲染、音频的采集、音频的策略管理等。本文主要针对音频渲染功能进行详细地分析&#xff0c;并通过源码中提供的例子&#xff0c;对音频渲染进行流程的梳理。二、目录foundatio…

无线WiFi安全渗透与攻防(一)之无线安全环境搭建

无线安全环境搭建 1.802.11标准 &#xff08;1&#xff09;.概念 802.11标准是1997年IEEE最初制定的一个WLAN标准&#xff0c;工作在2.4GHz开放频段&#xff0c;支持1Mbit/s和2Mbit/s的数据传输速率&#xff0c;定义了物理层和MAC层规范&#xff0c;允许无线局域网及无线设备…

Crack:LightningChart .NE​​T 10.4.1中的新功能

数据游标 Lightningchart .NET UWP 展示应用 在以前的版本中&#xff0c;LightningChart .NET 提供了不同的工具来实现数据跟踪功能&#xff0c;但都需要额外的用户编码。 现在可以使用 DataCursor 浏览 ViewXY 系列。系列数据值由这个新类/对象显示在鼠标位置或鼠标位置附近。…

【matplotlib】可视化解决方案——如何解决matplotlib中文乱码问题

问题概述 Matplotlib 默认不支持中文字体&#xff0c;这是因为 matplotlib 只支持 ASCII 字符&#xff0c;但是国人使用 matplotlib 肯定需要中文标注。如下图所示&#xff0c;当不对 Matplotlib 进行设置&#xff0c;而直接使用中文时&#xff0c;绘制的图像会出现中文乱码。…

为什么我选择收费的AdsPower指纹浏览器?

在决定开始用指纹浏览器之前&#xff0c;东哥我们团队找了市面上很多产品去测试。最后&#xff0c;还是决定用AdsPower。每个人的使用感受都不一样&#xff0c;我就说几个东哥和我们团队用得顺手的点&#xff0c;大家在选择指纹浏览器的时候也可以做一个参考。 一、指纹环境强大…

3月5日,加入线上对话,点燃科技行业女性影响力!

对话升级&#xff0c;点燃科技行业女性影响力&#xff01; &#x1f44b; 2022 年&#xff0c;Jina AI 联合 14 家合作伙伴&#xff0c;首次举办了「Impact Tech, She Can」线上对话&#xff0c;11 位嘉宾与 200 多位参会者分享了如何在科技行业内打造自身影响力。 &#x1f38…

html基础(h、p、br、hr、文本加粗倾斜下划线删除线、资源路径、音频、视频、超链接)

1标题<h><h1>1级标题</h1><h2>2级标题</h2><h3>3级标题</h3><h4>4级标题</h4><h5>5级标题</h5><h6>6级标题</h6>2段落<p>和换行<br><p>段落标签</p><p> fgghikg…

大数据技术——面向对象编程基础

类类的定义字段定义:用val或var关键字进行定义方法定义:使用new关键字创建一个类的实例类成员可见性Scala类中所有成员的默认可见性为公有&#xff0c;任何作用域内都能直接访问公有成员除了默认的公有可见性&#xff0c;Scala也提供private和protected其中&#xff0c;private…

真涨脸,我用 Python 为朋友自动化整理表格

今天&#xff0c;在工作的时候&#xff0c;我的美女同事问我有没有办法自动生成一个这样的表格&#xff1a; 第一列是院校科目&#xff0c;第二列是年份&#xff0c;第三列是数量。 这张表格是基于这一文件夹填充的&#xff0c;之前要一个文件夹一个文件夹打开然后手动填写年份…

测牛学堂:软件测试python之unittest框架总结(3)

python之unittest添加整个测试类执行 如果我们的测试用例比较多的话&#xff0c;测试套件对象通过addTest一个一个添加比较麻烦&#xff0c;可以通过添加一个类的方法&#xff0c; 去执行这个类里面的所有测试方法 套件对象.addTest(unittest.makeSuite(测试类名)) import un…

“终于我从字节离职了...“一个年薪50W的测试工程师的自白...

我递上了我的辞职信&#xff0c;不是因为公司给的不多&#xff0c;也不是因为公司待我不好&#xff0c;但是我觉得&#xff0c;我每天看中我憔悴的面容&#xff0c;每天晚上拖着疲惫的身体躺在床上&#xff0c;我都不知道人生的意义&#xff0c;是赚钱吗&#xff1f;是为了更好…

3.2滑动窗口

滑动窗口*** 题目链接 视频讲解 属于单调队列的模板题 如果每次移动窗口&#xff0c;然后在窗口中循环遍历查找最大值&#xff0c;时间复杂度太高 解决思路&#xff1a; 维护一个单调队列&#xff0c;其中head永远指的是当前窗口中最大的值&#xff0c;从head到tail元素递减。…