信息检索——可变字节码编码与解码

实验目的:通过实验,使学生掌握索引压缩的可变字节码VB的编码和解码算法。
实验内容:检索系统中的倒排记录表所占空间巨大,因此索引压缩非常关键,可变字节码VB编码利用整数个字节对间距编码和解码,能够在时间和空间上达到一个非常好的平衡点。本实验通过编程实现这个VB的编码和解码过程。
实验要求:
1.VB编码:
输入:倒排记录表
输出:倒排记录表的VB编码
2.VB解码
输入:倒排记录表的VB编码
输出:倒排记录表
编程语言:python
信息检索——可变字节码编码与解码_第1张图片信息检索——可变字节码编码与解码_第2张图片

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)

信息检索——可变字节码编码与解码_第3张图片

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))

信息检索——可变字节码编码与解码_第4张图片

你可能感兴趣的:(python)