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碼編碼方法很多,通常採用...