VB编码python实现(信息检索)

实验三:可变字节码的编码和解码算法实现

实验目的:

通过实验,使学生掌握索引压缩的可变字节码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
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值