本發(fā)明涉及數(shù)據(jù)壓縮技術(shù)領(lǐng)域,尤其涉及一種基于LZ77的編碼方法。
背景技術(shù):
LZ77編碼是一種開源的字典壓縮算法,屬于無損壓縮,廣泛應(yīng)用于gzip、LZMA等常用壓縮工具。字典壓縮的原理是構(gòu)建一個字典,存儲已編碼窗口中出現(xiàn)的重復(fù)字符串,然后用相應(yīng)的編碼代替文件中與字典內(nèi)字符串相匹配的字符串。其中,字典存儲的重復(fù)字符串最大長度是字典容量與壓縮質(zhì)量的重要影響因素之一。字典內(nèi)重復(fù)字符串的最大長度越大,字典容量越大,耗內(nèi)存越多,搜索匹配過程越長,壓縮速度越慢,壓縮質(zhì)量越高。
當(dāng)前,隨著互聯(lián)網(wǎng)、物聯(lián)網(wǎng)的飛速發(fā)展,數(shù)據(jù)文件規(guī)模越來越大,壓縮文件所需的壓縮時間越來越長,占用的CPU資源也越來越多,需要采用FPGA等硬件加速手段,以降低CPU占用率,減少數(shù)據(jù)中心功耗。但是,F(xiàn)PGA內(nèi)存資源有限,不能構(gòu)建大容量的壓縮字典,壓縮質(zhì)量受限。
因此,對于本領(lǐng)域技術(shù)人員而言,如何在不增加字典容量的基礎(chǔ)上提升壓縮質(zhì)量為亟需解決的技術(shù)問題。
技術(shù)實現(xiàn)要素:
為了便于理解,對本申請文件中出現(xiàn)的部分詞語,澄清如下:
LZ77:基于字典的、“滑動窗”的無損壓縮算法,在本申請文件中為具有一種編碼理論的算法集合,其中所述編碼理論的特征為:總會包含一個動態(tài)窗口和預(yù)讀緩沖器,并在動態(tài)窗口中尋找與預(yù)讀緩沖器中最匹配的數(shù)據(jù),如果匹配的數(shù)據(jù)長度大于最小匹配長度,那么就輸出一對(長度(length),距離(distance))數(shù)組,長度(length)是匹配的數(shù)據(jù)長度,距離(distance)說明了在輸入流中向后多少字節(jié)這個匹配數(shù)據(jù)可以被找到;
重復(fù)字符串編碼:在LZ77中輸出的(長度(length),距離(distance))數(shù)組,其中長度(length)為重復(fù)字符串長度編碼,距離(distance)為重復(fù)字符串偏移量編碼。
基于背景技術(shù)存在的技術(shù)問題,本發(fā)明提出了一種基于LZ77的編碼方法,包括以下步驟:
對字符進(jìn)行LZ77編碼;
讀入LZ77編碼;
判斷當(dāng)前字符編碼結(jié)果,若當(dāng)前字符編碼結(jié)果為重復(fù)字符串編碼,則判斷相鄰之前的字符編碼結(jié)果,若相鄰之前的字符編碼結(jié)果為重復(fù)字符串編碼,則判斷當(dāng)前字符編碼結(jié)果與相鄰之前的字符編碼結(jié)果的距離是否相同,若相同,則將當(dāng)前字符編碼結(jié)果與相鄰之前的字符編碼結(jié)果進(jìn)行合并。
優(yōu)選地,包括以下步驟:
S1:初始化編碼位置;
S2:對當(dāng)前位置字符進(jìn)行LZ77編碼;
S3:讀入上述LZ77編碼;
S4:若當(dāng)前位置編碼結(jié)果為字符,編碼位置右移1位,轉(zhuǎn)入S2;若當(dāng)前位置編碼結(jié)果為重復(fù)字符串編碼(length[n],distance[n]),轉(zhuǎn)入S5;
S5:判斷上次編碼結(jié)果,若上次編碼結(jié)果為字符,編碼位置右移length[n]位,轉(zhuǎn)入S2;若上次編碼結(jié)果為重復(fù)字符串編碼(length[n-1],distance[n-1]),轉(zhuǎn)入S6;
S6:比較distance[n-1]與distance[n],若distance[n-1]與distance[n]不相等,則編碼位置右移length[n]位,轉(zhuǎn)入S2;若distance[n-1]與distance[n]相等,則將重復(fù)字符串編碼(length[n],distance[n])和重復(fù)字符串編碼(length[n-1],distance[n-1])合并為(length[n]+length[n-1],distance[n]),編碼位置右移length[n]位,轉(zhuǎn)入S2。
優(yōu)選地,包括以下步驟:判斷編碼位置是否為文件尾,當(dāng)編碼位置為文件尾時,編碼結(jié)束。
優(yōu)選地,包括以下步驟:
S1:對所有字符進(jìn)行LZ77編碼;
S2:初始化編碼結(jié)果位置;
S3:讀入當(dāng)前位置LZ77編碼結(jié)果;
S4:若當(dāng)前位置編碼結(jié)果為字符,編碼結(jié)果位置右移一位,轉(zhuǎn)入S3;若當(dāng)前位置編碼結(jié)果為重復(fù)字符串編碼(length[n],distance[n]),轉(zhuǎn)入S5;
S5:判斷上次位置編碼結(jié)果,若上次位置編碼結(jié)果為字符,編碼結(jié)果位置右移length[n]位,轉(zhuǎn)入S3;若上次位置編碼結(jié)果為重復(fù)字符串編碼(length[n-1],distance[n-1]),轉(zhuǎn)入S6;
S6:比較distance[n-1]與distance[n],若distance[n-1]與distance[n]不相等,則編碼結(jié)果位置右移length[n]位,轉(zhuǎn)入S3;若distance[n-1]與distance[n]相等,則將重復(fù)字符串編碼(length[n],distance[n])和重復(fù)字符串編碼(length[n-1],distance[n-1])合并為(length[n]+length[n-1],distance[n]),編碼結(jié)果位置右移length[n]位,轉(zhuǎn)入S3。
優(yōu)選地,包括以下步驟:判斷編碼結(jié)果是否為文件尾,當(dāng)編碼結(jié)果位置為文件尾時,編碼結(jié)束。
本發(fā)明中提供的一種基于LZ77的編碼方法,在對字符進(jìn)行LZ77編碼后,對相鄰匹配串編碼進(jìn)行合并,具體為相鄰的重復(fù)字符串編碼,若是偏移量編碼相同,則進(jìn)行合并;上述方法至少具有以下優(yōu)點:
1、通過對相鄰匹配串編碼的合并,在不增加字典存儲的字符串長度,不增加字典內(nèi)字符串搜索匹配的復(fù)雜度的前提下,可以降低壓縮文本容量,提升壓縮質(zhì)量,并能保持較快的壓縮速率;
2、既可以在LZ77編碼過程中將符合要求的相鄰匹配串編碼進(jìn)行合并,也可以完成整個文本完成LZ77編碼后將符合要求的相鄰匹配串編碼進(jìn)行合并,同時,可以將符合要求的相鄰匹配串編碼均進(jìn)行合并從而最大限度的提升壓縮質(zhì)量,也可以限定相鄰匹配串編碼的合并次數(shù)或限定合并后匹配串編碼的最大長度,因此,具有良好的靈活性。
附圖說明
圖1為本發(fā)明提出的一種基于LZ77的編碼方法中一種實施例的流程示意圖;
圖2為本發(fā)明提出的一種基于LZ77的編碼方法中另一種實施例的流程示意圖。
具體實施方式
如圖1-2所示,圖1為本發(fā)明提出的一種基于LZ77的編碼方法中一種實施例的流程示意圖;圖2為本發(fā)明提出的一種基于LZ77的編碼方法中另一種實施例的流程示意圖。
下面結(jié)合附圖和實施例對本發(fā)明進(jìn)行詳細(xì)的描述。
實施例1
參考圖1,假設(shè)待壓縮字符串為:ABCDEFGHIJKABCDEFGHIJK,重復(fù)字符串最大長度為4,本發(fā)明所公開的一種基于LZ77的編碼方法,包括以下步驟:
S1:初始化,pos=1;
S2:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:A,pos=2;
S3:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:AB,pos=3;
S4:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:ABC,pos=4;
S5:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:ABCD,pos=5;
S6:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:ABCDE,pos=6;
S7:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:ABCDEF,pos=7;
S8:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:ABCDEFG,pos=8;
S9:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:ABCDEFGH,pos=9;
S10:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:ABCDEFGHI,pos=10;
S11:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:ABCDEFGHIJ,pos=11;
S12:當(dāng)前位置編碼結(jié)果為字符,無重復(fù)字符串,編碼結(jié)果為:ABCDEFGHIJK,pos=12;
S13:當(dāng)前位置發(fā)現(xiàn)與已編碼窗口相匹配的最大長度重復(fù)字符串“ABCD”,編碼結(jié)果為:ABCDEFGHIJK(4,11);
S14:判斷上次編碼結(jié)果,上次編碼結(jié)果為字符,無需合并,編碼位置右移4位,pos=16;
S15:當(dāng)前位置發(fā)現(xiàn)與已編碼窗口相匹配的最大長度重復(fù)字符串“EFGH”,編碼結(jié)果為:ABCDEFGHIJK(4,11)(4,11);
S16:判斷上次編碼結(jié)果,上次編碼結(jié)果為重復(fù)字符串編碼(4,11),本次編碼結(jié)果為重復(fù)字符串編碼(4,11),判斷兩者的偏移量編碼均為11,進(jìn)行編碼合并,得到編碼結(jié)果為:ABCDEFGHIJK(8,11),編碼位置右移4位,pos=20;
S17:當(dāng)前位置發(fā)現(xiàn)與已編碼窗口相匹配的最大長度重復(fù)字符串“IJK”,編碼結(jié)果為:ABCDEFGHIJK(8,11)(3,11);
S18:判斷上次編碼結(jié)果,上次編碼結(jié)果為重復(fù)字符串編碼(8,11),本次編碼結(jié)果為重復(fù)字符串編碼(3,11),判斷兩者的偏移量編碼均為11,進(jìn)行編碼合并,得到編碼結(jié)果為:ABCDEFGHIJK(11,11),編碼位置右移3位,pos=23;
S19:pos為文件尾,編碼結(jié)束,最終編碼結(jié)果為ABCDEFGHIJK(11,11)。
在上述實施例1中,我們可以獲知,實施例1采用的在LZ77編碼過程中將符合要求的相鄰匹配串編碼進(jìn)行合并,并將將符合要求的相鄰匹配串編碼均進(jìn)行合并從而最大限度的提升壓縮質(zhì)量;在實施例1中,假設(shè)待壓縮字符串為:ABCDEFGHIJKABCDEFGHIJK,重復(fù)字符串最大長度為4,得到的編碼結(jié)果為ABCDEFGHIJK(11,11),而若采用LZ77進(jìn)行編碼,獲得的編碼結(jié)果為ABCDEFGHIJK(4,11)(4,11)(3,11),通過對比可知,通過對相鄰匹配串編碼的合并,在不增加字典存儲的字符串長度,不增加字典內(nèi)字符串搜索匹配的復(fù)雜度的前提下,可以降低壓縮文本容量,提升壓縮質(zhì)量,并能保持較快的壓縮速率。
實施例2
參考圖2,假設(shè)待壓縮字符串為:ABCDEFGHIJKABCDEFGHIJK,重復(fù)字符串最大長度為4,本發(fā)明所公開的一種基于LZ77的編碼方法,包括以下步驟:
S1:對待壓縮字符串ABCDEFGHIJKABCDEFGHIJK進(jìn)行LZ77編碼,編碼結(jié)果為:ABCDEFGHIJK(4,11)(4,11)(3,11);
S2:讀入編碼“A”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S3:讀入編碼“B”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S4:讀入編碼“C”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S5:讀入編碼“D”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S6:讀入編碼“E”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S7:讀入編碼“F”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S8:讀入編碼“G”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S9:讀入編碼“H”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S10:讀入編碼“I”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S11:讀入編碼“J”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S12:讀入編碼“K”,其為字符編碼,無需合并,繼續(xù)讀入編碼;
S13:讀入編碼“(4,11)”,其為重復(fù)字符串編碼,判斷上次位置編碼結(jié)果為字符編碼,無需合并,繼續(xù)讀入編碼;
S14:讀入編碼“(4,11)”,其為重復(fù)字符串編碼,判斷上次位置編碼結(jié)果為重復(fù)字符串編碼(4,11),判斷兩者的偏移量編碼均為11,將編碼(4,11)和(4,11)合并為(8,11),繼續(xù)讀入編碼;
S15:讀入編碼“(3,11)”,其為重復(fù)字符串編碼,判斷上次位置編碼結(jié)果為重復(fù)字符串編碼(8,11),判斷兩者的偏移量編碼均為11,將編碼(8,11)和(3,11)合并為(11,11),繼續(xù)讀入編碼;
S16:處于編碼結(jié)果尾端,結(jié)束合并,獲得最終編碼結(jié)果為ABCDEFGHIJK(11,11)。
在上述實施例2中,我們可以獲知,實施例2采用的是完成整個文本完成LZ77編碼后將符合要求的相鄰匹配串編碼進(jìn)行合并,并將將符合要求的相鄰匹配串編碼均進(jìn)行合并從而最大限度的提升壓縮質(zhì)量;在實施例2中,假設(shè)待壓縮字符串為:ABCDEFGHIJKABCDEFGHIJK,重復(fù)字符串最大長度為4,將采用LZ77進(jìn)行編碼,獲得的編碼結(jié)果為ABCDEFGHIJK(4,11)(4,11)(3,11)最終合并為ABCDEFGHIJK(11,11),通過對比可知,通過對相鄰匹配串編碼的合并,在不增加字典存儲的字符串長度,不增加字典內(nèi)字符串搜索匹配的復(fù)雜度的前提下,可以降低壓縮文本容量,提升壓縮質(zhì)量,并能保持較快的壓縮速率。
以上所述,僅為本發(fā)明較佳的具體實施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),根據(jù)本發(fā)明的技術(shù)方案及其發(fā)明構(gòu)思加以等同替換或改變,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。