cplusplus实现LZ78算法
时间: 2023-09-30 17:09:08 浏览: 97
以下是一个简单的 C++ 实现 LZ78 算法的示例代码:
```cpp
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
void lz78Encode(const string& s) {
unordered_map<string, int> dict;
int index = 0;
string w;
for (char c : s) {
string wc = w + c;
if (dict.find(wc) != dict.end()) {
w = wc;
} else {
dict[wc] = ++index;
cout << dict[w] << " ";
w = string(1, c);
}
}
if (!w.empty()) {
cout << dict[w];
}
}
void lz78Decode(const string& s) {
unordered_map<int, string> dict;
int index = 0;
string w;
for (char c : s) {
int k = c - '0';
if (dict.find(k) != dict.end()) {
w = dict[k];
} else if (k == index + 1) {
w += w[0];
} else {
cerr << "Invalid input" << endl;
return;
}
cout << w;
dict[++index] = w + w[0];
w = w.substr(1);
}
}
int main() {
string s = "abababcabababxyxyxyz";
cout << "Encoded: ";
lz78Encode(s);
cout << endl;
cout << "Decoded: ";
lz78Decode("1 2 3 4 5 2 6 7 8 9 10 11 12 13 14");
cout << endl;
return 0;
}
```
这段代码实现了 LZ78 编码和解码。`lz78Encode` 函数接收一个字符串,对其进行编码并输出编码后的结果,`lz78Decode` 函数接收编码后的字符串,对其进行解码并输出解码后的结果。
在编码时,我们使用一个哈希表 unordered_map 来维护字符串和其对应的编码编号。我们从左到右扫描输入字符串,对于当前的字符 c,我们将当前字符串加上 c 得到新的字符串 wc,如果 wc 已经在哈希表中出现过,则继续向右扩展字符串;否则,我们输出 w 的编码编号,并将 wc 加入哈希表中。
在解码时,我们使用一个哈希表 unordered_map 来维护编码编号和其对应的字符串。我们从左到右扫描编码后的字符串,对于当前的编码编号 k,我们根据哈希表中的值得到字符串 w,如果哈希表中不存在 k,则说明输入有误;否则,我们输出 w,并将 w + w[0] 加入哈希表中,同时将 w 的第一个字符删除。
以上是一个简单的 LZ78 算法的 C++ 实现,仅供参考。
阅读全文