【场景】大数据常考场景题 - Bitmap

2023-10-27

  大数据开发面试通常会问场景题,主要考察大数据中常用的数据结构,比如 Bitmap、Bloom Filter 等等。今天就说一个工作中碰到的。

比如昨天说到的问题,用户要在自定义时间区间内查询,就需要快速响应,可能用到 ClickHouse。可以先看昨天的文章。欢迎关注公众号。

大数据开发全流程

那么为什么 ClickHouse 为什么快呢?这要归因于底层的数据结构。考虑这样一个场景:

场景1

用户画像将消费者分为很多类,比如按购买力分为购买力低、购买力中、购买力高,按粉丝的忠实程度分为路人、普通粉丝、忠实粉丝等等,这里就不考虑举例意义了,就分为 A、B、C 三类好了。

  • 问题 1:考虑 t1 和 t2 两个时间点,在 t1 是 A 类的人中,t2 还是 A 类的有多少?
    • 例如 t1 A 类成员是 [0, 1, 2, 3],t2 A 类成员是 [2, 3, 4],那么结果就是 2(即 [2, 3] 这两个人)。
  • 问题2:考虑 t1 和 t2 两个时间点,在 t1 是 A 类的人中,t2 变成 B 类的有多少?
    • 例如 t1 A 类成员是 [0, 1, 2, 3],t2 B 类成员是 [1, 5],那么结果就是 1(即 [1] 这一个人)。

分析

用户数据量很大,又需要快速计算,所以这里可以用 ClickHouse 实现的 Bitmap 来解决。

  • 问题1:
    • t1 A 类成员编码为二进制数 num1 = 0000 1111,表示 [0, 1, 2, 3] 这 4 个人;
    • t2 A 类成员编码为二进制数 num2 = 0001 1100,表示 [2, 3, 4] 这 3 个人;
    • num1 & num2 = 0000 1100 ,所以答案是 2。
  • 问题 2 同理。

场景 2

20 亿个整数中找出不重复的整数的个数,内存不足以容纳这 20 亿个整数。

分析

  • 一个数字的状态只有三种,分别为不存在,只有一个,有重复。因此,我们只需要 2 bit 就可以对一个数字的状态进行存储了,假设我们设定一个数字不存在为 00,存在一次 01,存在两次及其以上为 11。那我们大概需要存储空间 2G 左右。

  • 接下来的任务就是把这 20 亿个数字放进去(存储),如果对应的状态位为 00,则将其变为 01,表示存在一次;如果对应的状态位为 01,则将其变为 11,表示出现多次;如果为 11,则对应的状态位保持不变,仍表示出现多次。

  • 最后,统计状态位为01的个数,就得到了不重复的数字个数,两次遍历,时间复杂度为O(n)。

附: Bitmap

基本原理及要点:

  • 原理:Bitmap 的基本思想就是用一个 bit 位来标记某个元素对应的 Value,而 Key 即是该元素。由于采用了 Bit 为单位来存储数据,因此在存储空间方面,可以大大节省。

  • 特点:节约空间。并且位运算速度快。假设有这样一个需求:在 20 亿个随机整数中找出某个数 m 是否存在其中,并假设 32 位操作系统,4G 内存,那么:

    • 在 Java 中,int 占 4 字节,1 字节 = 8 位(1 byte = 8 bit)

    • 如果每个数字用 int 存储,那就是 20 亿个 int,因而占用的空间约为 2000000000*4/1024/1024/1024 ≈ 7.45G

    • 如果按位存储,那么 20 亿个数就是 20 亿位,占用空间约为 2000000000/8/1024/1024/1024 ≈ 0.233G

  • 实现:每一位表示一个数,0 表示不存在,1 表示存在,这正符合二进制。因此可以很容易用下图表示 {1,2,4,6} 这几个数:

在这里插入图片描述

  • 例子:

    • 已知某个文件内包含一些电话号码,每个号码为 8 位数字,统计不同号码的个数。8 位最多 99 999 999,大概需要 99m 个 bit,大概 10 几 M 字节的内存即可。

    • 2.5 亿个整数中找出不重复的整数的个数,内存空间不足以容纳这 2.5 亿个整数。将 Bitmap扩展一下,用 2 bit 表示一个数即可,0 表示未出现,1 表示出现一次,2 表示出现 2 次及以上。或者不用 2 bit 来进行表示,用两个 Bitmap 实现这个。

适用范围:

  • 快速查找

  • 判重

  • 删除

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【场景】大数据常考场景题 - Bitmap 的相关文章

  • Spark Streaming实现WordCount

    利用Spark Streaming实现WordCount 需求 监听某个端口上的网络数据 实时统计出现的不同单词个数 1 需要安装一个nc工具 sudo yum install y nc 2 执行指令 nc lk 9999 v import
  • 纯JS实现购物车&jQuery实现购物车

    目录 案例 纯JS实现购物车 主要功能 案例 jQuery实现购物车 主要功能 案例 纯JS实现购物车 主要功能 全选 全不选 单个删除 批量删除 数量的增减 合计
  • 机器学习 day33(误差分析、添加数据、迁移学习)

    误差分析 我们可以手动查看分类错误的子集样本 通常为100个 并统计他们的错误类型 在所有错误类型中 选择一种或几种最常见的错误 进行改进 这可以最高效的改进你的模型 误差分析的一个限制是 它只能很好的解决人类擅长的问题 添加数据 添加数据
  • 2.6 内核 tasklet 和workqueue 的区别

    work queue 跟tasklet 不同 1 work queue 运行环境的是内核线程 所以可以休眠 可以分配内存 获得信号量 执行阻塞I O 2 tasklet 的运行环境是软中断 所以不能休眠 3 tasklet的使用跟timer

随机推荐

  • 串口异步通信——时序宽度测试

    一般情况下串口 bit 1 与 bit 0 宽度能基本维持对等 脉宽接近 把串口 0x55 理解为一个占空比为50 的方波 在占空比接近50 的情况下 通信一般不会出现错误 但是 在一些脉宽有损失的场景中 则非常需要注意脉冲宽度要求 使用波
  • Unity中射线Ray和RaycastHit的简单介绍

    射线是在三维世界中从一个点沿一个方向发射的一条无限长的线 在射线的轨迹上 一旦与添加了碰撞器的模型发生碰撞 将停止发射 我们可以利用射线实现子弹击中目标的检测 鼠标点击拾取物体等功能 1 Physics Raycast public sta
  • pycharm修改快捷键

    pycharm修改快捷键 很多使用使用pythcharm的同学 如果想运行程序 通常需要 第一步右键 第二步 选择运行或者直接点击运行 但是往往厉害的程序员 一般直接键盘操作 如果你使用pycharm自带的快捷键 需要按下 Ctrl Shi
  • Python3 使用 selenium 获取 JS 代码里边的变量值

    from selenium import webdriver driver webdriver Ie r IEDriverServer exe 找一个合适版本的IEDriver js var hello hello world return
  • C语言实验——大小写转换oj1168

    C语言实验 大小写转换 Time Limit 1000ms Memory limit 65536K 有疑问 点这里 题目描述 把一个字符串里所有的大写字母换成小写字母 小写字母换成大写字母 其他字符保持不变 输入 输入为一行字符串 其中不含
  • 数据结构与算法 -- 基础篇

    本文主要用于记录学习过程中的一些总结 适用于一些刚学习数据结构和算法的同学 能够给予一些概括性认识 而且从下面的一些算法题中能够获得一些对于算法题目常用解题思路 如果能够对你有些帮助 是我之幸 接下来 将一共分为三部分来介绍如下内容 1 基
  • ElasticSearch 数据迁移方案

    一个人不论赋有什么样的棋 他如果不知道自己有这种棋 并且不形成适合于自己棋的计划 那种棋对他便完全无用 休漠 ElasticSearch 常用api ElasticSearch 版本说明 name node 3 cluster name t
  • python3 题解(10)打印金字塔1

    打印金字塔1 问题 用星号在控制台上输出一个金字塔的形状 可以看出 它的第n行的星号的个数是 2 n 1 这个问题的思路可以很多 比如 先造出指定数目的星号 再计算出前后补的空格数 这里采用如下的思路 已知了n 最后一行的星号的数目就固定了
  • 杭电ACM-A+B problem

    topic Calculate A B Input Each line will contain two integers A and B Process to end of file Output For each case output
  • QT QDockWidget 重叠方法

    主要通过如下红色代码的方法实现 效果图片如下 代码如下 void MainWindow createDockWindows QDockWidget dock new QDockWidget tr Customers this dock gt
  • curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443

    MacOS系统使用 Homebrew 官方地址时 报错 Mac安装homebrew的时候报错 Mac bin bash c curl fsSL https raw githubusercontent com Homebrew install
  • 自定义openwrt的配置界面:luci进阶之路

    5 20 晴 今天的太阳挺大的 晒得我进园区直接37 3警告 于是我百度搜索微信朋友圈怎么关闭 才把温度稳定下来 算了算了 上班说事 由于公司部门调动 逐渐接触到新的知识 新的模块 还听说这玩意比较冷门 没办法 该搞还是得搞 又不是搞不了
  • 渗透测试技术----常见web漏洞--命令执行原理及防御

    一 命令执行漏洞介绍 1 命令执行漏洞简介 命令执行漏洞时指服务器没有对执行的命令进行过滤 用户可以随意执行系统命令 命令执行漏洞属于高危漏洞之一 也属于代码执行的范围内 2 命令执行漏洞的原理 应用程序有时需要调用一些执行系统命令的函数
  • 嵌入式AI助力当代商业的发展

    数字化转型的业务影响是广泛的 但购买者应寻求嵌入式AI在以下领域具有最大的影响力 1 业务流程和任务的自动化 当买家搜索购买包含AI的软件时 他们应该研究该解决方案为员工自动执行日常任务的方式 嵌入式AI应该节省员工的时间和精力 以便他们可
  • 华为文稿演示服务器操作异常修复,修复服务器

    修复服务器 内容精选 换一换 安装Agent插件后 修复插件配置为用户提供了一键配置AK SK RegionID ProjectId的功能 省去了繁琐的手动配置步骤 提升配置效率 目前大部分区域已上线一键式授予该区域插件权限功能 即自动修复
  • java编码 第一次

    这是java的快速入门 演示java的开发步骤 对代码的相关说明 1 public class Hello 表示Hello是一个类 是一个public公有的类 2 Hello 表示一个类的开始和结束 3 public static void
  • java循环while之等差数列均值_java基础_while 循环语句的定义及用法

    一 while 循环语句的定义 在 C 语言中 while 循环是除了 for 循环外最常用的循环语句 相对于 for 循环而言 while 循环更多地应用于循环次数未定的循环控制中 while 循环的一般表达形式为 while 表达式 循
  • 色温

    色温是表示光线中包含颜色成分的一个计量单位 从理论上说 黑体温度指绝对黑体从绝对零度 273 开始加温后所呈现的颜色 黑体在受热后 逐渐由黑变红 转黄 发白 最后发出蓝色光 当加热到一定的温度 黑体发出的光所含的光谱成分 就称为这一温度下的
  • 线程池OOM错误

    1 LinkedBlockingQueue报错 package com spring pro threadpool completableFuture youhua test import java util concurrent Exec
  • 【场景】大数据常考场景题 - Bitmap

    大数据开发面试通常会问场景题 主要考察大数据中常用的数据结构 比如 Bitmap Bloom Filter 等等 今天就说一个工作中碰到的 比如昨天说到的问题 用户要在自定义时间区间内查询 就需要快速响应 可能用到 ClickHouse 可