小量壓縮簡單演算法

2021-06-03 17:01:47 字數 3388 閱讀 1136

本方介紹一種簡單的資料壓縮演算法:sb (****** block)

在對文件進行倒排的時候經常涉及到對倒排文件的壓縮,例如假設有單詞instance 出現的文件有<1,3 ,4 , 6 ,9 ,10,... >,即倒排表以公升充排列,這樣我們就可以在倒排檔案中只儲存前後兩個文件位置的差量,即轉變之後結果為<1 ,2 , 1 , 2 , 3 , 1 , ...>,因此在遍歷的時候可以累積得到每個文件位置。分析轉變後的倒排檔案我們可知 (不失一般性)儲存了更多的小量。如果在記憶體中我們以乙個int型別來儲存更多類似於1-10這樣的小量就會造成更多的浪費,這是因為1-10可以不超過 4bit的空間來進行儲存,而int占用32bit,因此會造成大量浪費。如何壓縮資料來節約更多的儲存空間有待我們解決。

目前已經有各種各樣的演算法來解決不量問題:

全域性方法:unary , binary , r ...

區域性方法:bernoulli , ...其它

縱觀各種各樣的方法實現起來都是相當的困難,並且具有較高的時間複雜度。

下面我來介紹一種我自己開發,相當簡單的乙個演算法,思想簡單,實現簡單,執行高效,並且具有相當好的壓縮效果,當然不是最後,畢竟簡單的背後肯定會 做出一定的犧牲。

演算法思想:

首先說明該演算法採用不定長編碼,設編碼的基本塊長度為bit,則每個數字的編碼長度為bit的整數倍。

每個基本塊的最後一位為標誌位,當最後一位為0時說明編碼結束,此時我們可以得到乙個整數,相反當最後一位不為0時,則要與後面的基本塊一起構成一 個更大的整數。

例如:設bit = 5;則基本塊所能表示的最大值為15,下面給出一些例子

15:-> 11110

7 : -> 01110

現在你可能會問,如果要表示的數大於15怎麼辦,那我們就使用多個基本塊來表示乙個資料,此時前面(非最後)基本塊的最後一位必須為1,設基本塊的 數量為b , 那麼最大可以表示的資料為2^(b*(bit-1))-1,這就是說所有基本塊的位除了標誌位之外都參與資料的二進位制表示。如此:

255:-> 11111 11110

2099: ->10001 00111  00110

解碼的時候只需要順序讀入每個基本塊就可以確定能否得到乙個資料。

本**高亮顯示

#include

#include

#include

using namespacestd;

#define max 0xffffff

#define bit 4

intbuff[max];//儲存差量資料

inttemp[max];//儲存解碼後的結果

charcode[max];//儲存壓縮後的結果

intcmp(const void* a ,const void* b)

//編碼,壓縮 

//data,待壓縮資料,len侍壓縮資料個數

//返回值:壓縮後所佔位數

intencode(int* data ,intlen);

//解碼

//code ,壓縮後的資料 , len:壓縮後占用的位數

//data:儲存解碼後的資料,返回值:解碼後資料個數

intdecode(char* code ,intlen ,int* data);

//測試資料data需要要多少位可以表示

intbsize(intdata);

//將data轉換成基本塊,b表示data需要b位方可表示出

//return :轉換後的資料

intblock(intdata ,intb);

//將乙個資料以二進位制的形式列印

intprint(unsigned intdata);

intmain()

qsort(buff ,max ,sizeof(int) , cmp);

intnum(0) , i(0);

while(!buff[i])i++;

buff[num++] = buff[i++]; 

for(;i1];

//init 上部分只是得到差量資料

intsum = encode(buff , num);

//測試平均所需位數

cout<1.0 / numfor(inti=0;i"error:\t"

<"\t"

<"\t

\t"<0;

}//計算data需要的位元組數

intbsize(intdata)

intblock(intdata ,intb)

for(inti=b-1;i>0;i--)

res |= (1

<<(bit*i));

res <<= (32 - bit * b);

returnres;      

}intencode(int* data ,intlen)

sum += l * bit;      

}else

sum += l * bit;}}

returnsum;

}intdecode(char* code ,intsum ,int* data)}}

returnnum;

}intprint(unsigned intdata)

小量壓縮簡單演算法

小量壓縮簡單演算法 在對文件進行倒排的時候經常涉及到對倒排文件的壓縮,例如假設有單詞instance 出現的文件有 1,3 4 6 9 10,即倒排表以公升充排列,這樣我們就可以在倒排檔案中只儲存前後兩個文件位置的差量,即轉變之後結果為 1 2 1 2 3 1 因此在遍歷的時候可以累積得到每個文件位...

深度學習網路壓縮簡單介紹

我課題組做基於深度學習的影象處理主要分兩條線 我的方向是網路壓縮,為了以後方便展開,下邊先簡要介紹幾種網路壓縮的方式,1 網路修剪 網路修剪,採用當網路權重非常小的時候 小於某個設定的閾值 把它置0,就像二值網路一般 然後遮蔽被設定為0的權重更新,繼續進行訓練 以此迴圈,每隔訓練幾輪過後,繼續進行修...

簡單實現LZ77壓縮演算法

因為哈弗曼編碼對於大檔案的壓縮有很大的侷限性 且壓縮比十分有限 所以決定根據lz77演算法寫乙個簡單的壓縮庫 組成因為時間較為緊張 目前完成了最基礎的zip演算法的編寫 即根據lz77演算法 滑動視窗壓縮 先對壓縮檔案得到乙個資料三元組 然後針對數字出現的頻率再進行哈弗曼演算法 為了更好的壓縮比 我...