LZW壓縮(沒有解壓部分)

2021-08-11 05:56:25 字數 1592 閱讀 1892

一種對資料進行了等級劃分的資料結構。級別越高,包含的數對越少。

在跳表的資料結構中,乙個資料節點中應該包含本身的資料,和指向下乙個節點的指標,還應該包括該節點的上一級結構(該級包含更多資料,該級間隔更小)的前面乙個節點段和後面乙個節點段。就像二分查詢一樣,到了這個位置上,我需要知道比較之後下一次我在前面一段資料和後面一段資料應該從哪兒開始

解釋為什麼沒有寫跳表與雜湊的模板類的原因!

寫乙個壓縮演算法,算是對map的字典的應用。lzw compress

#include

#include

#include

void compress(char* arr, int n)

else

/字典中不存在pc的內容,那麼就應該把pc的內容存入字典中,同時壓縮p字串的內容,還要將c中的內容給p

}else

字典中不存在存在p字串,存入字典中唄,這種情況應該是不會存在的(因為前面的步驟會保證p是字典中的)

}}void compress1(char* arr, int n)

}c = arr[0];

p = "";

p.push_back(c);

for(int ii = 1; ii < n; ii++)

else

/字典中不存在pc的內容,那麼就應該把pc的內容存入字典中,同時壓縮p字串的內容,還要將c中的內容給p

}else

字典中不存在存在p字串,存入字典中,這種情況應該是不會存在的(因為前面的步驟會保證p是字典中的)

}if (dict.end() == dict.find(p))

it = dict.find(p);

out[out_cnt] = it->second;

std::cout

}void main(void)

壓縮結果是「0214537」

對該字串的壓縮編碼結果和那本書本上面的是一樣的。

但是在編寫**的過程中,能夠感覺到,問題的關鍵其實並不是在這個壓縮的演算法上面。

壓縮演算法追求的幾個點(從我的理解上面)無外乎:1、壓縮率要高;2、壓縮要快;3、還要準。

在這篇部落格中,不討論這三樣東西,在實際操作中,還有很多現實的問題,比如,你的字典要怎麼組織,怎麼跟隨你的壓縮結果一起隨意移動到別的地方,然後你再利用這個字典把你的編碼結果重新解碼成原來的內容,這是需要好好考慮的。

同時還有個問題,就是編碼結果的多樣性,這個應該不是演算法的問題,而是我在實際編寫過程中,調整個別的先後,會導致出來的結果不一樣。

比如,compress1函式中先將所有的字母都新增到字典中,這樣的結果就和書本中的結果一樣;但是如果想compress函式中的流程,上來就直接新增到字典和壓縮同步進行,出來的結果就不一樣。

但是也是7個數字的。

但是他們的壓縮率就一定是一樣的嗎?

其實,不是。因為現在看到的是以十進位制結果展現,如果以二進位制的形式展示,會發現,應該採取compress1的方式,因為這樣,將出現頻率搞得短字段的分配的二進位制短一點(數字小一點),在被壓縮字元長的時候能夠保證壓縮後結果較短,保證高的壓縮率。

另外,預告,最近會把二叉樹的資料結構寫上來。可能兩天之後的週六晚上吧!

LZW字典壓縮

首先談談我對壓縮這個詞的理解吧。在我看來,壓縮 協議。而這二者中,我認為協議比 更重要,協議是整個壓縮的靈魂。就拿哈夫曼壓縮法來說,它的協議簡單來說就是為待壓縮檔案中出現過的每個字元設定乙個編碼,標頭檔案中儲存了每個編碼對應的字元資訊。顯然,哈夫曼壓縮中的標頭檔案就是我們定下的壓縮協議。今天主要談l...

LZW壓縮演算法

lzw演算法和lz78演算法在編碼方式上的不同 步驟1 開始時的詞典包含所有可能的根 root 當前字首p為空 步驟3 判斷綴 符串p char是否在詞典中 1 如果 是 p p char 用char擴充套件p 2 如果 否 把代表當前字首p的碼字輸出到碼字流 把綴 符串p char新增到詞典 令p...

lzw壓縮演算法 VBScript中的LZW壓縮演算法

lzw壓縮演算法 介紹本文向您展示如何在vbscript中實現lzw無失真壓縮演算法。它也可以按原樣或幾乎按原樣在vba中使用。lzw演算法lzw演算法是一種壓縮技術,不會導致資料丟失。它構建了動態壓縮中使用的 和值的字典。該詞典不與壓縮檔案一起儲存,並且在壓縮後將被丟棄。在解壓縮期間,將從壓縮的資...