行业知识
【位图(Bitmap)】数据结构:高效存储与处理大量数据
2026-11-02 05:27:14
来源:互联网转载
���录
一、位图概念
1.面试题
2.位图的概念
二、位图的实现
三、位图的应用
使用位图进行排序
一、位图概念
1.面试题
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】对于这个问题,在前面学习到的知识中,我们有两种方案进行解决:
- 遍历,时间复杂度O(N)
- 排序 + 二分查找,时间复杂度O(NlogN) + O(logN)
而对于40亿的无符号整数来说,我们计算一下将这些数组放在内存中需要多大的空间:
10亿个字节换算后需要0.93GB的内存(近似看作1GB) -->
10亿个整型则需要4GB的内存 -->
40亿个整型就需要16GB的内存!!!
我们16GB的电脑内存刚开机就已经占用了20%以上的内存,因此对于这种场景,上述两种方案明显不可取。此时就需要用到位图解决。
2.位图的概念
位图是一种数据结构,是用每一位来存放某种状态,适用于海量数据,整数,数据无重复的场景。通常是用来判断某个数据存不存在的。 数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比 特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:如上例子,10个整数本应该存放需要40个字节,此时用位图只需要3个字节。而此时处理40亿个整型数据的问题也就迎刃而解了。
二、位图的实现
注意:模拟实现的位图只处理0和正整数数据
思路:一个字节有8个比特位,每个比特位只表示0和1。位图的关键就在于,对于每个字节,将其所有比特位用来表示对应的某些数存不存在。例如:一个byte类型占一个字节,也就是8个比特位,则第一个byte用来表示0-7,第一个表示8-15,以此类推。
下面,我用byte数组的方式模拟实现了一个位图(Java中BitSet集合类中用的是long数组,为什么?)
import java.util.Arrays;public class MyBitSet { byte[] elem; int usedSize; public MyBitSet() { elem = new byte[4]; } //bits:elem数组需要存入的最大位数 public MyBitSet(int bits) { elem = new byte[bits / 8 + 1]; } //存入集合 -> 等价于将数据的对应位置为1 public void set(int val) { if (val = elem.length * 8) { elem = Arrays.copyOf(elem, val / 8 + 1); } int arrayIndex = val / 8; //该数字在数组中应存入的位置 int bitIndex = val % 8; //该数字在数组位置中应存入的比特位位置 elem[arrayIndex] |= (byte) (1 等价于检查数据的对应位置是否为1 public boolean get(int val) { if (val = elem.length) { return false; } int bitIndex = val % 8; //逻辑& 如果结果不为0,说明当前bitIndex位置为1,否则为0 return (elem[arrayIndex] & (1 = elem.length) { return; } int bitIndex = val % 8; // 1
上一篇:haveacake英语怎么读?
下一篇:服务器怎么放开?