实验目的:通过实验,使学生掌握索引压缩的可变字节码VB的编码和解码算法。
实验内容:检索系统中的倒排记录表所占空间巨大,因此索引压缩非常关键,可变字节码VB编码利用整数个字节对间距编码和解码,能够在时间和空间上达到一个非常好的平衡点。本实验通过编程实现这个VB的编码和解码过程。
实验要求:
1.VB编码:
输入:倒排记录表
输出:倒排记录表的VB编码
2.VB解码
输入:倒排记录表的VB编码
输出:倒排记录表
编程语言:python
def code(n):#编码
dp=[bin(n[0])[2:]]
for c in range(1,len(n)):
dp.append(bin(n[c]-n[c-1])[2:])
for i in range(len(dp)):
dp[i] = (7-len(dp[i]) % 7)*'0' + dp[i]
tem = list(dp[i])
count = 0
for j in range(len(dp[i]) // 7):
if j == len(dp[i]) // 7 - 1:
tem.insert(7 * j+count, '1')
else:
tem.insert(7 * j+count, '0')
count += 1
tem = ''.join(tem)
dp[i] = tem
#print("VB编码结果:\n",dp)
return dp
n=[777,17743,294068,31251336]
code(n)
def uncode(dp):#解码
n=[]
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)
n.append(int(tem, 2))
if i>0:
n[i]+=n[i-1]
print("解码后的倒排记录表:\n",n)
return n
n=[777,17743,294068,31251336]
uncode(code(n))