bitmap 是索引最长常见的一种实现方式。就是bit位的每一位,来作为表示要索引的对象。通常位图索引通常表达取值维度取值较少的数据.,最好是布尔值 比如
男 |
1 |
婚否 |
0 |
是否有房 |
0 |
是否有车 |
0
|
比如上表中,对一个人描述,就可以用1000 表示在取值较多(高基数)情况,也可以应用位图,一是方便查询,便于应用 OR AND 等操作,而是可以将bit位编成整数,这样大大减少了存贮和传输的空间。
比如这样讲吧,对于一个广告位来讲吧,可以对应很多个广告合同。如果后端有个rpc服务,可以为广告位选择最合适的合同。如果广告位和广告合同都很多,那么这个数据传输量是很大的。为了解决这个问题就是可以将广告的合同编号,通过位图索引来压缩传输数据。
对于一个广告位而言。可以我讲他对应所有的广告位放入一个list中。通过遍历list中的每一位,来构建该广告位,对应投放合同的位图索引(bitmap),下面的算法就是如何来够构建这个位图索引
bitmap 是可以想象为一串大二级制。从低位到高位的每一个位置表示是表示从1到n的连续十进制数。如果list中最大数为max。那么我们可以用max位的二进制串表示list中所有数。
java中32 (2的5次方)位表示一个整型。我们可以将这个大二进制串拆散,用多个整型表示。如果list中最大数为max,那么需要整型的数目,就可以用
int size = (max >> 5)+1 ;
这个公式很好理解,左移5位,是除以2的5次方(32)。
通过size我们就能确定位图的大小, 同理对list 中的一个数我们也可以通过这种方式找到它编码后所在的整型(编码后整型数字都是,按从低位到高排列)
int buket = bitIndexList.get(i) >>5;
不难想出 这个数字在整型中的位置,就是对32求余,
int index = bitIndexList.get(i) & 0x1F;
对32求余,可以用公式 n & (32-1) 表达 ,其实就是对低于32位数,其实低五位中1 保留,高于5位置全部设置为0
另外一个方法是 2 n - (n>>5)<<5,这里就不做详细解释了
最后将这个广告位设置为1 就可以 int intBitSet = bitList.get(buket) | 1 << index;
遍历list 中所有值,就构建出广告位对应的bitmap,
这个方法应用很广, 可以用它替代hashmap , 如果数据太大,hashmap 因为频繁冲突,就会向链表退化。使用位图,就不存在,最好最坏的情况。当然你也可以使用布隆过滤器,但是要付出精确率的代价。这个方法也可以用在排序中,也就是《编程珠玑》中前言的内容。
相关推荐
位图索引的结构是一个位图数组,每个元素对应一个索引列值。每个位图元素是一个位图,表示该索引列值是否存在于某个记录中。位图索引可以快速定位满足条件的记录,因为它可以通过扫描位图索引,并执行位运算,从而...
总的来说,位图索引是Oracle数据库的一个强大工具,尤其在特定场景下,它能提供高效的查询性能。通过正确地选择使用场景,适当地调整数据类型,以及充分了解其限制,我们可以最大化位图索引的优势,从而提高整体的...
位图索引是由多个长度为 n 的位向量所组成的一个集合,每一个位向量对应一个字段 F 中可能出现的值。例如,假设字段 F 为表 T 的索引列,字段 F 的集势即不同值的个数为 m,表 T 的记录数为 n,那么字段 F 的位图...
综上所述,位图索引在Oracle数据库中的应用能够有效优化低基数字段的查询性能,减少存储需求,特别是在需要高效处理复杂查询和统计分析的场景下。通过合理地结合使用B树索引和位图索引,可以平衡查询速度和存储成本...
编码位图索引的基本思想是将每个元组的值编码成一个比特串,然后将这些比特串组合成一个大型的比特图。这样,在查询时,可以快速地对比特图进行逻辑操作,从而提高查询性能。 编码位图索引的维护方法也很重要。在...
位图索引利用二进制位来表示数据,每个位对应一个特定的值或对象,0表示不存在,1表示存在。由于位操作的高效性,这种索引方法在处理大量数据时可以显著提高查询速度。 在位图索引中,1的个数通常表示某个属性或者...
例如,如果表中有100万行,有三个不同的颜色值(红、蓝、绿),位图索引将为每种颜色分配一个32位的位图,其中1表示存在,0表示不存在。位图索引特别适用于处理具有较少唯一值和大量重复值的列,如性别、星座等。 ...
除了在网络安全和网络取证中的应用之外,具有更快的按位逻辑运算和减少的搜索空间的位图索引压缩还广泛用于基因组数据,地理信息系统,图形数据库,图像检索,物联网等的分析中。期望自1980年代以来,位图索引压缩...
"Go-PiCon" 是一个基于 Go 语言实现的工具,它与 "Pilosa" 高性能分布式位图索引系统相结合,提供了简单的控制台交互方式。Pilosa 是一个开源的数据库,其核心特性是快速的位图索引,适用于大数据分析和数据查询优化...
在大内存分析处理应用场景下,位图连接索引不仅需要权衡索引的内存和CPU开销,还需要进一步考虑处理器平台所带来的性能收益和数据访问延迟。提出了基于服务的位图连接索引管理机制,其主要特点体现在三个方面:独立...
- **位图索引**:位图索引只能是本地分区索引。 ##### 2. 创建示例 以创建有前缀的本地索引为例: ```sql CREATE TABLE test (id NUMBER, data VARCHAR2(100)) PARTITION BY RANGE (id) ( PARTITION p1 VALUES ...
位图索引将每个可能的值映射为一个位,1表示存在,0表示不存在,因此对于大量记录但值种类较少的情况,位图索引可以大大减少存储空间并加速查询。 描述中提到的“位图文件存入数据库”,意味着我们将探讨如何将实际...
这是因为位图索引会为索引列的每个取值创建一个位图,相同的值在位图上以相同的数字表示,从而在查询时只需筛选出位图中数字相同的内容即可。 - **特殊查询条件**:在WHERE子句中使用AND或OR运算符时,位图索引也...
在创建菜单项时,我们可以指定一个图像索引来关联位图。在`OnInitMenuPopup`函数中,我们可以设置每个菜单项的图像。例如,如果位图文件包含四个图标,索引从0开始,我们有: ```cpp for (int i = 0; i (); i++) ...
位图索引利用位图表示数据,每个位对应一行中的一个值,1表示存在,0表示不存在。这种索引结构在决策支持系统或静态数据中特别有效,因为它们占用的存储空间小,并且在处理多列连接查询时效率高。位图索引不支持行级...
2. **位图索引**:在位图索引中,一个索引条目使用位图标记多个行。这种索引适用于具有高度重复值的列,且通常用于只读查询。由于位图索引节省空间,尤其适合于低基数(相对表行数而言,列值数量较少)的列,但不...
位图联接索引(Bitmap Join Index):位图联接索引是针对多表联接查询优化的,它在一个表上创建位图索引,并将另一个表的值映射到这个位图索引上。在执行联接查询时,可以直接利用位图之间的运算来定位结果集,...
4. **动画逻辑**: 定义一个变量来跟踪当前显示的位图索引,并设置定时器。每当定时器触发时,更新当前位图索引(确保其在位图数组范围内),并重绘窗口。重绘时,调用CDC类的BitBlt()函数,将选中的位图绘制到窗口上...