Kannst du ein C/C++ Programm für RLE-Kompression bauen?
RLE steht für Run-Length Encoding und ist sicher mit Abstand der einfachste Algorithmus um Daten zu komprimieren. Wie er funktioniert, erklärt man am einfachsten mit einem Beispiel:
Eingabe: aaaaabbcddddddd
Ausgabe: 5a2bc7d
Wenn es also mehrere gleiche Zeichen hintereinander gibt, wird einfach die Anzahl und das Zeichen nur einmal geschrieben. Die Ausgabe wäre also praktisch so wie man es lesen würde (also anstatt "a-a-a-a-a" würde man sagen "fünf a").
Bedingung ist, dass nur die Standard-Lib (also alles was mit "std::" anfängt) benutzt werden darf, und es alles mit einer foreach-Schleife gemacht werden muss (der Einfachheit halber weil mein Anwendungsfall für hier zu komplex wäre :D) und keine regulären Ausdrücke verwendet werden können (weil der String auch nur eine Vereinfachung ist).
std::string eingabe{"aaaaabbcddddddd"};
std::string ausgabe{};
for (const char& ch : eingabe) {
//ausgabe += // ...
}
Das ist keine Hausaufgabe oder so etwas sondern für ein kleines Hobbyprojekt. Also wenn ihr Ahnung habt, bitte nicht einfach nicht antworten, weil ihr denkt ihr macht damit meine Hausaufgaben weil das nicht der Fall ist 😂
1 Antwort
#include <iostream>
using namespace std;
int main()
{
std::string eingabe{"aaaaabbcddddddd"};
std::string ausgabe{};
int rle_count = 1;
int iteration = 0;
char found = 0;
for(const char& ch : eingabe)
{
// geschuldet der Bedingung "muss eine for each-Schleife sein",
// die für einen look ahead-ähnlichen Algorithmus Blödsinn ist:
// Die allererste Iteration wird mehr oder weniger übersprungen,
// um somit eine Art do{} while() hinzubekommen.
if(iteration == 0)
{
found = ch;
iteration = 1;
continue;
}
if(ch != found)
{
if(rle_count > 1)
{
ausgabe = ausgabe + std::to_string(rle_count);
}
ausgabe = ausgabe + found;
found = ch;
rle_count = 1;
}
else
{
rle_count++;
}
}
// Die Coderedundanz kann dann in eine Methode ausgelagert werden.
if(rle_count > 1)
{
ausgabe = ausgabe + std::to_string(rle_count);
}
ausgabe = ausgabe + found;
std::cout << "Ergebnis: " << ausgabe << "\n";
return 0;
}
Bitte sehr. Been there, done that. War seinerzeit auch Teil der PCX-Kompresssionen.
Deine Bedingungen waren aber nicht das Gelbe vom Ei. Eine For-each ergibt dann Sinn, wenn du die RLE-Anzahl nachstellst. Sonst ist in jedem Fall eine do while() besser, weil du ja eh mindestens das allererste Zeichen brauchst und somit minimal eine Iteration hast.