- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
详细介绍位图索引的压缩编码规则
目标:会写位图索引和压缩位图索引
1.1.1、位图索引
概念和可行性不说,越说越糊涂,我们直接看位图索引的例子:
? 设某首饰店客户信息表示为关系R(年龄, 薪水)。如下是编号从1到12的记录:
1: (25 , 60) 2: (45 , 60) 3: (50 , 75) 4: (50 , 100) 5: (50 , 120) 6: (70 , 110)
7: (85,140) 8: (30,260) 9: (25,400) 10: (45, 350) 11: (50, 275) 12: (60, 260)
? 属性“年龄”有7个不同值。它的位图索引有7个向量:
位图索引示例(注意:有多少条记录,位图索引的二进制位数的长度就有多长!)
25: 100000001000 30: 000000010000 45: 010000000100 50: 001110000010
60: 000000000001 70: 000001000000 85: 000000100000
?属性“薪水”有10个不同值。它的位图索引有10个向量:
60: 110000000000 75: 001000000000 100: 000100000000 110: 000001000000
120: 000010000000 140: 000000100000 260: 000000010001 275: 000000000010
350: 000000000100 400: 000000001000
看看位图索引的优点吧:找出年龄范围在45~55且薪水范围在100~200的所有首饰购买者?
011110000110 AND 000111100000 = 000110000000
一个AND操作就找到了,很爽吧!不过大家也看到了,这些超长索引存储起来很头痛吧!
没关系,看下一节4.1.2,我们怎样压缩压缩再压缩,呵呵!
1.1.2、压缩位图索引
大家看到了,这些位图索引的“0”好多,占用好多空间,我们的目标就是压缩这些“0”
利用分段长度编码来压缩位图向量中的“0”(下面是定义,看完糊涂就继续看)
? 设i 是位向量中某个“1”之前“0”的个数
? 首先确定i 的二进制表示位数j,j ≈ log2i
? i 可以表示为j ? 1个“1”和一个“0”并在其后加上i 的二进制数。
如果i = 0 或1,则j = 1。编码由一个“0”开始且“0” 后加上表示i 的一位二进制数:即i = 1的编码为01,而i = 0 的编码为00。
上面看着有点乱,其实很简单,解释一下(当然我解释的更乱,大家快刀斩乱麻吧):
其实我们就是想将所有“1”前面的一串“0”用少量的二进制数字记录下来。
我们找到所有的“1”(因为“1”很少),查这个1前面的0的个数,然后存储起来,存储方法如下:先写出这个代表“0个数”的数字需要占几位,占几位就写几减一个“1”,然后用一个“0”做分隔符,后面再写出这个代表“0个数”的数字。
下面,我用从后向前写的方式来讲解!(这样好理解)举例:(简单起见,先考虑只有一个“1”的情况,复杂情况一会再讲)
假如有一个位图索引为 00000000000001 (不用数了,前面共13个“0”)
那么咱要告诉人家有13个“0”,我们就先写上1101(二进制的13),然后在前面写上一个分隔符“0”,则变成了01101,我们再看一下,“1101”这个数需要至少4个二进制位(log213≈4)才能表示出来,那么我们就在前面写3个“1”(4-1=3,这是此编码的规定,其实我看他们就是能省则省,哈哈,不过规定了就要遵守,否则不通用),(注意:这3个“1”并不是一个二进制数字, 而是简单的“1”的个数,你就当成火柴棍(小学生数数法)即可!)最后就变成
再解释:这个压缩的编码由三部分组成 111 0 1101 ,前面的3个“1”是说明后面的数字1101占4位,中间的“0”就是一个分隔符号,后面的1101才是我们真正要用到的数字,它是说明我们的这个位图索引是一个“1”前面的“0”的个数!!当然本例是一个“1”的情况,多个“1”的情况,就把多个“0的个数”和一个“1”的组合按先后顺序串在一起就构成了一个位图索引!!
此外:还有特殊情况是一个“1”前有0个“0”和1个“0”的情况,分别用00和01表示。
做练习吧:
位图索引:1100000010000000001 请写出压缩码
首先注意到这个索引中共有4个“1”,那么我们就写出这4个“子压缩码”,然后串一块。
第一个“1”前面没有“0”,那就是有0个“0”呗,这就简单了:压缩码就是00 (特殊情况)
第二个“1”前面也是有0个“0”,那么压缩码还是 00
第三个“1”
文档评论(0)