1. 程式人生 > >搜尋引擎倒排索引表壓縮:gamma編碼、Golomb編碼

搜尋引擎倒排索引表壓縮:gamma編碼、Golomb編碼

搜尋引擎的倒排索引表所佔的空間很大,對倒排索引表進行壓縮顯得非常必要。由於倒排索引表中儲存的全部都是數字,對其進行壓縮有著專門的方法,Gamma編碼就是其中之一。

當你每天開啟電腦,在百度搜索框中輸入你要搜尋的內容,按下回車之後,你可能不會意識到,有無數臺主機在飛速運轉,對比了數百萬條記錄,經過初步結果集生成、相關度打分、結果排序、摘要生成之後,才最終在你的螢幕上打出了你想要的結果。這一切僅僅發生在幾毫秒之間。
是什麼保證瞭如此迅速的檢索速度呢?良好的索引構建是其中的要素之一。通常情況下,搜尋引擎內部會為每個網頁或文章分配一個數字id,用這個id代表這個網頁或者文章。構建索引的時候,採用分詞工具將這些網頁或者文章分成一個個詞,併網頁id儲存在稱為倒排索引表的資料結構中。


由於網路空間巨大,對應的倒排索引表所佔的空間也很大,對倒排索引表進行壓縮顯得非常必要。由於倒排索引表中儲存的全部都是數字,對其進行壓縮有著專門的方法,Gamma和Golomb編碼就是其中的兩種。
1、Gamma編碼
Gamma編碼是一種基於位的變長編碼,介紹它之前先說一下一元編碼。
一元編碼:將 n 表示成 n 個1和最後一個0,,
比如: 3的一元碼是 1110
40的一元碼是 11111111111111111111111111111111111111110

Gamma將數G字表示成長度(length)和偏移(offset)兩部分;
offset部分對應G的二進位制編碼,只不過將首部的1去掉。
例如 13 → 1101 → 101 = 偏移;
length部分採用一元編碼,表示偏移部分的位數。
例如G=13(偏移101),偏移長度為3,一元編碼1110
G的編碼就是將長度部分和偏移部分兩者聯接起來得到的結果。


2、Golomb編碼
使用Golomb編碼對整數x(x≥0)進行編碼時,通過引數m(m≥1)將x分解為:

x=q*m+r

其中,q為x除以m的商,r為餘數。Golomb編碼即有q和r兩部分組成,q用上面提到的一元編碼表示,如,3表示為1110;如果用b=log2(m),對b向上取整;t=2^b-m,r的表示分兩種情況:
(1)當0≤ r< t時,用b-1位二進位制編碼表示r;
(2)當t≤ r< m時,用b位二進位制編碼表示r+t;
例如:取整數18,m=5,18=3*5+3;q=3,r=3
b=log2(5),向上取整為3,t=2^3-m=3=r,選第二種情況編碼r,
故x可編碼為1110:110.