gpt4 book ai didi

c++ - LZW压缩生成文件比原来大

转载 作者:行者123 更新时间:2023-11-30 05:19:30 25 4
gpt4 key购买 nike

我有一个文本文件,我认为我正确地实现了 LZW 算法,但压缩文件比原始文件大。

我没有在文本的字节中运行 LZW,而是在字符串中运行。

我构建了一个字典 [string:int] 并运行它。我想知道我是否应该用字节而不是字符串来制作它。

它还会逐行运行文件,而不是只为整个文件构建一个字典。

这是我的LZW

map<string, int> D;                      //dictionary

int init(){ //init dictionary with all single chars
D.clear(); rD.clear();
f(i,,256){
D[string(1, char(i))] = i + 1;
}
return 257;
}

void encode(char* file){ //LZW encoding method
ifstream in(file);
if (!in.is_open()) {cout<<"Could not open file"<<endl; return;}
else {
ofstream out("compressed.txt");
for(string text; getline(in, text); ){

int value = init();
vector<int> idx;
string p = "", c = "", pc = "";

for(int i = 0; i < text.size(); i++){
c = text[i];
let s = p + c;
if(D.find(s) != D.end()){
p = p + c;


}
else{
idx.push_back(D[p]);
D[s] = value++;
p = c;
}
}
idx.push_back(D[p]);
int len = idx.size();
f(i,,len) {out<<idx[i]; if(i == len-1) out<<" 0"<<endl; else out<<" ";}
}
in.close();
out.close();
cout<<"File compressed successfully"<<endl;

}

它只是接收文件的地址并将其压缩为“compressed.txt”文件。

最佳答案

LZW 的核心是将重复的字节转换为符号,然后将符号写入比特流。您拥有的重复字节越多,您获得的压缩率就越高。打包位将节省很多空间。

当您以这种方式将符号作为 int 写入 ofstream 时,它可能会使用超过 4 个字节。但是对于打包位,它应该占用 9 位到 16 位,具体取决于您如何设置它。我认为这是您的输出大于预期的主要原因。

祝你好运。

关于c++ - LZW压缩生成文件比原来大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41082905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com