ホームページ > バックエンド開発 > C++ > C++ でデータ圧縮および解凍アルゴリズムを実装するにはどうすればよいですか?

C++ でデータ圧縮および解凍アルゴリズムを実装するにはどうすればよいですか?

WBOY
リリース: 2023-08-25 18:54:40
オリジナル
1974 人が閲覧しました

C++ でデータ圧縮および解凍アルゴリズムを実装するにはどうすればよいですか?

データ圧縮および解凍アルゴリズムを C で実装するにはどうすればよいですか?

要約: データの圧縮と解凍は、コンピュータ分野で最も重要なテクノロジの 1 つです。この記事では、C を使用してデータ圧縮および解凍アルゴリズムを実装する方法を紹介し、読者の参考となるコード例を示します。

1. データ圧縮アルゴリズム

データ圧縮アルゴリズムは、大量のデータをエンコードして、ストレージ容量と送信帯域幅の占有を削減できます。 C では、ハフマン コーディングと LZ77 アルゴリズムを使用してデータ圧縮を実現できます。

1.1 ハフマン符号化

ハフマン符号化は、周波数ベースのデータ圧縮アルゴリズムです。データ圧縮の目的を達成するために、データの出現頻度に基づいて各文字に短いコードを割り当てます。

サンプル コードは次のとおりです。

#include<iostream>
#include<queue>
#include<string>
#include<unordered_map>
using namespace std;

// Huffman树的节点
struct Node {
    char ch;
    int freq;
    Node* left;
    Node* right;
};

// 用于比较树节点的优先队列
class Compare {
public:
    bool operator() (Node* a, Node* b) {
        return a->freq > b->freq;
    }
};

// 生成Huffman树
Node* generateHuffmanTree(string text) {
    // 统计每个字符出现的频率
    unordered_map<char, int> freqTable;
    for (char ch : text) {
        freqTable[ch]++;
    }

    // 将频率和字符转换为Huffman树节点
    priority_queue<Node*, vector<Node*>, Compare> pq;
    for (auto it = freqTable.begin(); it != freqTable.end(); it++) {
        Node* node = new Node();
        node->ch = it->first;
        node->freq = it->second;
        node->left = nullptr;
        node->right = nullptr;
        pq.push(node);
    }

    // 构建Huffman树
    while (pq.size() > 1) {
        Node* left = pq.top();
        pq.pop();
        Node* right = pq.top();
        pq.pop();
        Node* parent = new Node();
        parent->ch = '';
        parent->freq = left->freq + right->freq;
        parent->left = left;
        parent->right = right;
        pq.push(parent);
    }

    return pq.top();
}

// 生成Huffman编码表
void generateHuffmanCodeTable(Node* root, string code, unordered_map<char, string>& codeTable) {
    if (root == nullptr) {
        return;
    }

    if (root->ch != '') {
        codeTable[root->ch] = code;
    }

    generateHuffmanCodeTable(root->left, code + "0", codeTable);
    generateHuffmanCodeTable(root->right, code + "1", codeTable);
}

// 压缩数据
string compressData(string text, unordered_map<char, string>& codeTable) {
    string compressedData;

    for (char ch : text) {
        compressedData += codeTable[ch];
    }

    return compressedData;
}


int main() {
    string text = "Hello, World!";
    Node* root = generateHuffmanTree(text);
    unordered_map<char, string> codeTable;
    generateHuffmanCodeTable(root, "", codeTable);
    string compressedData = compressData(text, codeTable);

    cout << "Compressed Data: " << compressedData << endl;

    return 0;
}
ログイン後にコピー

1.2 LZ77 アルゴリズム

LZ77 アルゴリズムは、辞書ベースのデータ圧縮アルゴリズムです。繰り返し発生するデータの断片を古いデータへのポインタに置き換えて、データのストレージ容量を削減します。

サンプル コードは次のとおりです:

#include<iostream>
#include<string>
#include<vector>
using namespace std;

// 压缩数据
string compressData(string text) {
    string compressedData;
    int i = 0;

    while (i < text.length()) {
        int len = 0;
        int offset = 0;

        for (int j = 0; j < i; j++) {
            int k = 0;
            while (i + k < text.length() && text[j + k] == text[i + k]) {
                k++;
            }

            if (k > len) {
                len = k;
                offset = i - j;
            }
        }

        if (len > 0) {
            compressedData += "(" + to_string(offset) + "," + to_string(len) + ")";
            i += len;
        } else {
            compressedData += text[i];
            i++;
        }
    }

    return compressedData;
}


int main() {
    string text = "ababaabababbbb";
    string compressedData = compressData(text);

    cout << "Compressed Data: " << compressedData << endl;

    return 0;
}
ログイン後にコピー

2. データ解凍アルゴリズム

データ解凍アルゴリズムは、圧縮されたデータを復元するために使用されます。 C では、対応する解凍アルゴリズムを使用してデータを復元できます。

2.1 ハフマン解凍

サンプルコードは次のとおりです:

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;

// 解压缩数据
string decompressData(string compressedData, unordered_map<string, char>& codeTable) {
    string decompressedData;
    string code;

    for (char ch : compressedData) {
        code += ch;

        if (codeTable.count(code) > 0) {
            decompressedData += codeTable[code];
            code = "";
        }
    }

    return decompressedData;
}

int main() {
    string compressedData = "010101001111011001";
    unordered_map<string, char> codeTable = { {"0", 'a'}, {"10", 'b'}, {"110", 'c'}, {"1110", 'd'}, {"1111", 'e'} };
    string decompressedData = decompressData(compressedData, codeTable);

    cout << "Decompressed Data: " << decompressedData << endl;

    return 0;
}
ログイン後にコピー

2.2 LZ77 解凍

サンプルコードは次のとおりです:

#include<iostream>
#include<string>
#include<vector>
using namespace std;

// 解压缩数据
string decompressData(string compressedData) {
    string decompressedData;
    int i = 0;

    while (i < compressedData.length()) {
        if (compressedData[i] == '(') {
            int j = i + 1;

            while (compressedData[j] != ',') {
                j++;
            }

            int offset = stoi(compressedData.substr(i + 1, j - i - 1));
            int k = j + 1;

            while (compressedData[k] != ')') {
                k++;
            }

            int len = stoi(compressedData.substr(j + 1, k - j - 1));

            for (int l = 0; l < len; l++) {
                decompressedData += decompressedData[decompressedData.length() - offset];
            }

            i = k + 1;
        } else {
            decompressedData += compressedData[i];
            i++;
        }
    }

    return decompressedData;
}

int main() {
    string compressedData = "a(1,1)ab(3,3)b(9,2)";
    string decompressedData = decompressData(compressedData);

    cout << "Decompressed Data: " << decompressedData << endl;

    return 0;
}
ログイン後にコピー

結論:

この記事では、C を使用してデータ圧縮および解凍アルゴリズムを実装する方法を紹介します。ハフマン符号化と LZ77 アルゴリズムにより、データを効率的に圧縮および解凍できます。読者は、ニーズに応じて自分に合ったアルゴリズムを選択し、サンプルコードに基づいて練習および最適化することができます。

以上がC++ でデータ圧縮および解凍アルゴリズムを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート