智慧型資訊檢索 可變位元組碼的編碼和解碼演算法實現

2021-10-05 15:08:44 字數 3783 閱讀 4536

4.實驗成果

5.程式除錯過程

《資訊檢索導論》部分實驗python實現彙總請進入此部落格檢視。

通過實驗,掌握索引壓縮的可變位元組碼vb的編碼和解碼演算法。

檢索系統中的倒排記錄表所佔空間巨大,因此索引壓縮非常關鍵,可變位元組碼vb編碼利用整數個位元組對間距編碼和解碼,能夠在時間和空間上達到乙個非常好的平衡點。本實驗通過程式設計實現這個vb的編碼和解碼過程。

通過編寫編碼輔助函式、編碼函式、解碼函式、間距計算函式和計算倒排記錄表函式實現vb的編碼和解碼過程。當使用者輸入原始倒排記錄表後,系統可以計算輸出間距記錄表、可變位元組碼,並通過解碼函式對可變位元組碼進行解碼得到原始倒排記錄表。

分為編碼模組與解碼模組兩個功能模組。

vbencodenumber是編碼輔助函式,主要用於倒排記錄表的切分與二進位制的轉換,通過bin函式實現十進位製到二進位制轉換,然後通過字串的replace函式實現可變位元組碼末位字首與其它位的不同。

def

vbencodenumber

(n):

by, byte ='',

while

true

: byte.insert(

0, n %

128+

128)

if n <

128:

break

n = n //

128for i in

range

(len

(byte)):

if i <

len(byte)-1

: by +=

bin(byte[i]

).replace(

'0b1'

,'0')+

' 'else

: by +=

bin(byte[i]

).replace(

'0b',''

)return by

vbencode實現倒排記錄表的迴圈與vbencodenumber的呼叫。

def

vbencode

(numbers)

: bytestream =

for n in numbers:

byte = vbencodenumber(n)

return bytestream

vbdecode是解碼模組。用於通過可變位元組碼計算間距表,計算過程中需注意可變位元組碼末尾字首的不同,計算結束後通過countdaopai函式得到原始倒排記錄表。

def

vbdecode

(bytestream)

: numbers =

n =0for i in

range

(len

(bytestream)):

byte = bytestream[i]

.split(

' ')

l =len(byte)

for j in

range

(l):

if j <1-

1:by =

int(

'0b1'

+ byte[j][1

:len

(byte[j])]

,2)else

: by =

int(

'0b'

+ byte[j],2

) n =

128*n + by if by <

128else

128*

(n -1)

+ by

n =0return numbers

countdaopaidis是倒排記錄表間距函式,用於計算原始倒排記錄表的間距表。

def

countdaopaidis

(daopai)

: daopaidis = daopai.copy(

)for i in

range

(len

(daopai)):

if i ==0:

daopaidis[i]

= daopai[i]

else

: daopaidis[i]

= daopai[i]

- daopai[i -1]

return daopaidis

countdaopai為計算倒排記錄表函式,用於通過間距表計算得到倒排記錄表。

def

countdaopai

(daopaidis)

: daopai = daopaidis.copy(

)for i in

range

(len

(daopaidis)):

daopai[i]

=sum

(daopaidis[

0: i +1]

)return daopai

daopai =

[777

,17743

,294068

,31251336

]print

('原始倒排記錄表為:\n'

, daopai,

'\n'

)daopaidis = countdaopaidis(daopai)

print

('間距記錄表為:\n'

, daopaidis,

'\n'

)bytestream = vbencode(daopaidis)

print

('可變位元組碼為:\n'

, bytestream,

'\n'

)daopaidis = vbdecode(bytestream)

daopai = countdaopai(daopaidis)

print

('解碼得到的倒排記錄表為:\n'

, daopai,

'\n'

)

執行程式,原始倒排記錄表為[777,17743,294068,31251336],得到結果如下圖。

通過結果圖可以看出解碼得到的倒排記錄表與原始倒排記錄表相同,觀察可變位元組碼,最後一位首位數字為1,其它位首位數字為0。

在程式除錯過程中,設定原始倒排記錄表為[121, 456, 728, 879]。

無法檢索資料和目標資料的列資訊 2 檢索資料

select語句應該是 sql 最常用的語句了,用來從乙個表中或者多個表中檢索資料。對於 sql 語句來說,必須至少要給出 2 條資訊 注 作為 sql 組成部分的保留字,關鍵字不能用作表或者列的名字 我們用來示例的表叫 products。select prod name from products...

IO流中位元組碼編碼的問題(亂碼原因分析)

先列幾個概念 1.各種位元組io流 bytearrayoutputstream,fileoutputstream 都是繼承的inputstream,和outputstream。2.記憶體中執行的各種物件的位元組編碼格式都是unicode 3.我們將字串 string 轉為位元組陣列 byte 或者將...

關於BCD碼的編碼和解碼

1 bcd 碼 binary coded decimal 二到十進位制編碼 計算機內部多採用二進位制表示和處理數值資料,因此在計算機輸入和輸出資料時,就要進行進製的轉換處理。用 4位二進位制數來表示 1位十進位制數中的 0 9這 10個數碼,簡稱 bcd碼,即 bcd bcd碼編碼方法很多,通常採用...