Heim Backend-Entwicklung C++ Wie implementiert man Datenkomprimierungs- und Dekomprimierungsalgorithmen in C++?

Wie implementiert man Datenkomprimierungs- und Dekomprimierungsalgorithmen in C++?

Aug 25, 2023 pm 06:54 PM
压缩算法 c++编程 解压缩算法

Wie implementiert man Datenkomprimierungs- und Dekomprimierungsalgorithmen in C++?

Wie implementiert man Datenkomprimierungs- und Dekomprimierungsalgorithmen in C++?

Zusammenfassung: Datenkomprimierung und -dekomprimierung ist eine der wichtigsten Technologien im Computerbereich. In diesem Artikel wird die Verwendung von C++ zum Implementieren von Datenkomprimierungs- und Dekomprimierungsalgorithmen vorgestellt und Codebeispiele als Referenz für die Leser bereitgestellt.

1. Datenkomprimierungsalgorithmus

Der Datenkomprimierungsalgorithmus kann eine große Datenmenge kodieren, um die Belegung von Speicherplatz und Übertragungsbandbreite zu reduzieren. In C++ können wir die Huffman-Codierung und den LZ77-Algorithmus verwenden, um eine Datenkomprimierung zu erreichen.

1.1 Huffman-Codierung

Huffman-Codierung ist ein frequenzbasierter Datenkomprimierungsalgorithmus. Es weist jedem Zeichen basierend auf der Häufigkeit des Datenvorkommens einen kürzeren Code zu, um den Zweck der Datenkomprimierung zu erreichen.

Der Beispielcode lautet wie folgt:

#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;
}
Nach dem Login kopieren

1.2 LZ77-Algorithmus

Der LZ77-Algorithmus ist ein wörterbuchbasierter Datenkomprimierungsalgorithmus. Es ersetzt wiederkehrende Datenfragmente durch Zeiger auf alte Daten, um den Speicherplatz der Daten zu reduzieren.

Der Beispielcode lautet wie folgt:

#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;
}
Nach dem Login kopieren

2. Datendekomprimierungsalgorithmus

Der Datendekomprimierungsalgorithmus wird zum Wiederherstellen komprimierter Daten verwendet. In C++ können wir den entsprechenden Dekomprimierungsalgorithmus verwenden, um die Daten wiederherzustellen.

2.1 Huffman-Dekomprimierung

Der Beispielcode lautet wie folgt:

#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;
}
Nach dem Login kopieren

2.2 LZ77-Dekomprimierung

Der Beispielcode lautet wie folgt:

#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;
}
Nach dem Login kopieren

Fazit:

In diesem Artikel wird erläutert, wie Sie mit C++ Datenkomprimierungs- und Dekomprimierungsalgorithmen implementieren . Mit der Huffman-Codierung und dem LZ77-Algorithmus sind wir in der Lage, Daten effizient zu komprimieren und zu dekomprimieren. Leser können je nach Bedarf den für sie passenden Algorithmus auswählen und ihn anhand des Beispielcodes üben und optimieren.

Das obige ist der detaillierte Inhalt vonWie implementiert man Datenkomprimierungs- und Dekomprimierungsalgorithmen in C++?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie implementiert man Robotersteuerung und Roboternavigation in C++? Wie implementiert man Robotersteuerung und Roboternavigation in C++? Aug 25, 2023 pm 09:12 PM

Wie implementiert man Robotersteuerung und Roboternavigation in C++? Robotersteuerung und -navigation sind sehr wichtige Bestandteile der Robotertechnologie. In der Programmiersprache C++ können wir verschiedene Bibliotheken und Frameworks verwenden, um Robotersteuerung und -navigation zu implementieren. In diesem Artikel wird erläutert, wie Sie mit C++ Codebeispiele zur Steuerung von Robotern und zur Implementierung von Navigationsfunktionen schreiben. 1. Robotersteuerung In C++ können wir serielle Kommunikation oder Netzwerkkommunikation verwenden, um die Robotersteuerung zu realisieren. Das Folgende ist ein Beispielcode, der serielle Kommunikation zur Steuerung der Roboterbewegung verwendet: inkl

Hinweise zur C++-Entwicklung: Vermeiden Sie Nullzeigerausnahmen in C++-Code Hinweise zur C++-Entwicklung: Vermeiden Sie Nullzeigerausnahmen in C++-Code Nov 22, 2023 pm 02:38 PM

In der C++-Entwicklung ist die Nullzeigerausnahme ein häufiger Fehler, der häufig auftritt, wenn der Zeiger nicht initialisiert wird oder nach der Freigabe weiterhin verwendet wird. Nullzeigerausnahmen verursachen nicht nur Programmabstürze, sondern können auch Sicherheitslücken verursachen, weshalb besondere Aufmerksamkeit erforderlich ist. In diesem Artikel wird erläutert, wie Sie Nullzeigerausnahmen in C++-Code vermeiden. Zeigervariablen initialisieren Zeiger in C++ müssen vor der Verwendung initialisiert werden. Wenn der Zeiger nicht initialisiert ist, zeigt er auf eine zufällige Speicheradresse, was zu einer Nullzeigerausnahme führen kann. Um einen Zeiger zu initialisieren, zeigen Sie ihn auf einen

Wie schreibe ich ein einfaches Dateiverschlüsselungsprogramm in C++? Wie schreibe ich ein einfaches Dateiverschlüsselungsprogramm in C++? Nov 03, 2023 pm 03:40 PM

Wie schreibe ich ein einfaches Dateiverschlüsselungsprogramm in C++? Einleitung: Mit der Entwicklung des Internets und der Popularität intelligenter Geräte ist der Schutz personenbezogener Daten und sensibler Informationen immer wichtiger geworden. Um die Sicherheit von Dateien zu gewährleisten, ist es häufig erforderlich, diese zu verschlüsseln. In diesem Artikel erfahren Sie, wie Sie mit C++ ein einfaches Dateiverschlüsselungsprogramm schreiben, um Ihre Dateien vor unbefugtem Zugriff zu schützen. Anforderungsanalyse: Bevor wir mit dem Schreiben eines Dateiverschlüsselungsprogramms beginnen, müssen wir die Grundfunktionen und Anforderungen des Programms klären. In diesem einfachen Programm verwenden wir Symmetrie

Wie schreibe ich ein einfaches Musikempfehlungssystem in C++? Wie schreibe ich ein einfaches Musikempfehlungssystem in C++? Nov 03, 2023 pm 06:45 PM

Wie schreibe ich ein einfaches Musikempfehlungssystem in C++? Einleitung: Das Musikempfehlungssystem ist ein Forschungs-Hotspot in der modernen Informationstechnologie. Es kann Benutzern Songs basierend auf ihren Musikpräferenzen und Verhaltensgewohnheiten empfehlen. In diesem Artikel wird erläutert, wie Sie mit C++ ein einfaches Musikempfehlungssystem schreiben. 1. Benutzerdaten sammeln Zuerst müssen wir die Musikpräferenzdaten der Benutzer sammeln. Durch Online-Umfragen, Fragebögen etc. können die Vorlieben der Nutzer für verschiedene Musikrichtungen ermittelt werden. Speichern Sie Daten in einer Textdatei oder Datenbank

So verwenden Sie den Fibonacci-Sequenzalgorithmus in C++ So verwenden Sie den Fibonacci-Sequenzalgorithmus in C++ Sep 19, 2023 am 10:15 AM

So verwenden Sie den Fibonacci-Folgenalgorithmus in C++. Die Fibonacci-Folge ist eine sehr klassische Folge und ihre Definition besteht darin, dass jede Zahl die Summe der beiden vorherigen Zahlen ist. In der Informatik ist die Verwendung der Programmiersprache C++ zur Implementierung des Fibonacci-Sequenzalgorithmus eine grundlegende und wichtige Fähigkeit. In diesem Artikel wird erläutert, wie Sie mit C++ den Fibonacci-Sequenzalgorithmus schreiben, und es werden spezifische Codebeispiele bereitgestellt. 1. Rekursive Methode Rekursion ist eine gängige Methode des Fibonacci-Sequenzalgorithmus. In C++ kann der Fibonacci-Sequenzalgorithmus mithilfe der Rekursion prägnant implementiert werden. unter

Forschung zu Methoden zur Lösung von Datenkomprimierungsproblemen, die bei der Entwicklung der MongoDB-Technologie auftreten Forschung zu Methoden zur Lösung von Datenkomprimierungsproblemen, die bei der Entwicklung der MongoDB-Technologie auftreten Oct 10, 2023 am 10:16 AM

Forschungszusammenfassung der Methoden zur Lösung von Datenkomprimierungsproblemen, die bei der Entwicklung der MongoDB-Technologie auftreten: Da die Datenmenge weiter wächst und sich die Anwendungsszenarien weiter erweitern, wird die Effizienz der Datenspeicherung und -übertragung immer wichtiger. Insbesondere für nicht relationale Datenbanken wie MongoDB ist die effektive Komprimierung von Daten zur Reduzierung der Speicher- und Übertragungskosten zu einer herausfordernden Aufgabe geworden. Ziel dieses Artikels ist es, Methoden zur Lösung von Datenkomprimierungsproblemen zu untersuchen, die bei der Entwicklung der MongoDB-Technologie auftreten, und spezifische Codebeispiele bereitzustellen. Einführung in die Datenspeicherung und -verarbeitung

Nutzen Sie C++-Programmierkenntnisse effektiv, um robuste eingebettete Systemfunktionen aufzubauen Nutzen Sie C++-Programmierkenntnisse effektiv, um robuste eingebettete Systemfunktionen aufzubauen Aug 27, 2023 am 08:07 AM

Nutzen Sie C++-Programmierkenntnisse effizient, um robuste eingebettete Systemfunktionen zu erstellen. Mit der kontinuierlichen Weiterentwicklung der Technologie spielen eingebettete Systeme eine immer wichtigere Rolle in unserem Leben. Als höhere Programmiersprache ist C++ flexibel und skalierbar und wird häufig in der Entwicklung eingebetteter Systeme eingesetzt. In diesem Artikel stellen wir einige C++-Programmiertechniken vor, um Entwicklern dabei zu helfen, C++ effizient zu nutzen, um robuste eingebettete Systemfunktionen zu erstellen. 1. Verwenden Sie objektorientiertes Design. Objektorientiertes Design ist eine der Kernfunktionen der C++-Sprache. Im eingebetteten System

Wie schreibe ich ein einfaches Bilderkennungsprogramm mit C++? Wie schreibe ich ein einfaches Bilderkennungsprogramm mit C++? Nov 03, 2023 pm 06:30 PM

Wie schreibe ich ein einfaches Bilderkennungsprogramm mit C++? Bei der Entwicklung moderner Wissenschaft und Technik spielt die Bilderkennungstechnologie eine immer wichtigere Rolle. Ob Gesichtserkennung, Objekterkennung oder autonomes Fahren, die Bilderkennung spielt eine Schlüsselrolle. In diesem Artikel wird erläutert, wie Sie mit C++ ein einfaches Bilderkennungsprogramm schreiben, um den Lesern das Verständnis der Grundprinzipien und des Implementierungsprozesses der Bilderkennung zu erleichtern. Zuerst müssen wir OpenCV (Open-Source-Computer-Vision-Bibliothek) installieren und konfigurieren. OpenCV ist eine weit verbreitete Computer-Vision-Bibliothek für

See all articles