实验三:可变字节码的编码和解码算法实现
实验目的:
通过实验,使学生掌握索引压缩的可变字节码VB的编码和解码算法。
实验内容:
检索系统中的倒排记录表所占空间巨大,因此索引压缩非常关键,可变字节码VB编码利用整数个字节对间距编码和解码,能够在时间和空间上达到一个非常好的平衡点。本实验通过编程实现这个VB的编码和解码过程。P68
举例
写出倒排记录表(777, 17743, 294068, 31251336)的可变字节编码在可能的情况下对间距而不是文档ID编码。请以8位二进制串的方式写出这些编码。
解答:倒排记录表的间隔序列为(777,16966,276325,30957268)
它们的二进制分别是:(1100001001, 100001001000110, 1000011011101100101, 1110110000101111011010100)
可变字节码:(00000110 10001001 , 00000001 00000100 11000110, 00010000 01101110 11100101, 00001110 01100001 00111101 11010100)
要求
1.VB编码:
输入:倒排记录表
输出:倒排记录表的VB编码
2.VB解码
输入:倒排记录表的VB编码
输出:倒排记录表
编程语言:python
VB编码代码
#输入倒排记录表,输出VB编码
#输入VB编码,输出倒排记录表
########### VB编码 #############
dp = []
count = 0
while 1:
tem = input("请输入倒排记录表的第{}项并按下回车,结束请直接回车: ".format(count))
count += 1
if(tem == ''):
break
else:
dp.append(bin(int(tem))[2:])
for i in range(len(dp)):
dp[i] = (7-len(dp[i]) % 7)*'0' + dp[i] # 先补齐0
#print(len(dp[i]) // 7)
tem = list(dp[i])
#print(tem)
count = 0
for j in range(len(dp[i]) // 7):
if j == len(dp[i]) // 7 - 1:
tem.insert(7 * j+count, '1')
#print(tem)
else:
tem.insert(7 * j+count, '0')
count += 1
#print(tem)
tem = ''.join(tem)
#print(tem)
dp[i] = tem
print(dp)
VB解码代码
dp = []
count = 0
while 1:
tem = input("请输入倒排记录表的VB编码第{}项并按下回车,结束请直接回车: ".format(count))
tem = tem.replace(" ", "")
count += 1
if(tem == ''):
break
else:
dp.append(tem)
for i in range(len(dp)):
tem_list = []
for j in range(len(dp[i])//8):
tem_list.append(dp[i][j*8: (j+1)*8])
tem_list = [tem_list[i][1:] for i in range(len(tem_list))]
for k in range(len(tem_list[0])):#处理一下前面的几位数字0
if tem_list[0][k] != '0':
tem_list[0] = tem_list[0][k:]
break
tem = ''.join(tem_list)
# print(tem_list)
# print(tem)
# print(int(tem, 2))
dp[i] = int(tem, 2)
print("解码结果:")
print(dp)
#['00001110', '01100001', '00111101', '11010100']
#00001110 01100001 00111101 11010100