Entwicklung eines Pseudocodes zur Komprimierung von Bildatein

#1
Hallo Leute,
wie setze ich die Folgende Aufgabe um ?

Beispiel: Rohdaten
QQQQRRRRRRTTTTTTTTTTLLLLLLLLLLMNNNVVVVVVVVVVVAAAAAAAAAAAAA
Nach der Komprimierung (§ ist das Sonderzeichen,das die Wiederholung einleitet)
§4Q§6R§10T§11LMNNN§11V§13A

Ich darf folgende Funktionen und Variablen benutzen
Bilddaten [ ] : enthält die Daten in Form eines Arrays (Typ Zeichen)
Bilddaten.GetLength() :liefert die Größe des Arrrays
Bilddaten[indes] :liefert ein Zeichen an der Stelle index(nullbasiert)
KomprimierteDaten [ ] :Array für Speicherung der Komprimierung
KomprimierteDaten.Add(Zeichen) : Fügt dem Array ein zeichen hinzu

Mein erster Lösungansatz war das ich mir ein Struktogramm erstelle und den dann in Pseudocode umwandel. Wie würdet ihr es machen ? Habt ihr eine Idee wie ich es umsetzen kann ?
 
#3
Hallo Spyke,
kannst du mir ein Kleinen Ausschnitt aus deinem Code den du dir gedacht hast schreiben ? ich möchte nicht die Komplette-Lösung haben jedoch ein Anfang damit ich weiß wie ich vorgehen muss
 

Parantatatam

mag Cookies & Kekse
#4
Welche Zeichen können denn in den Rohdaten vorkommen? Du hast bei Dir schon das schöne Beispiel gezeigt, dass Du vier gleiche Zeichen auf §4Q§ "kürzt", wobei das Ergebnis die gleiche Länge hat wie die Ausgangsdaten. Dies könnte dazuführen, dass Du beispielsweise drei Zeichen auf §3Q§ vergrößerst und somit die Ergebnisdaten auch länger sein können als die Ausgangsdaten.

Wenn Du nur Buchstaben verwendest, kannst Du auch die Paragraphenzeichen weglassen. Außerdem solltest Du eine Regel einführt, die die Ausgangsdaten erst dann komprimiert, wenn das Ergebnis auch wirklich kürzer ist als das Original.
 

Spyke

Capoeirista
Premium-User
#6
Ich würde die Zeichen alle einzeln durchlaufen und zählen solange immer das gleiche zeichen vorkommt.
Dabei die Position des ersten vorkommens des zeichens merken.

Ändert sich das Zeichen, ev. schaun, wie @einfach nur crack schon bemerkte, ob sich das komprimieren lohnt.
In diesem Fall wenn das vorkommen des zeichen öfters als 4 mal in einer reihenfolge auftaucht.

Dann, wenn kleiner 4 die original zeichen in das komprimierungs array, ansonsten deine komprimierung in das komprimierungs array.
 
#7
Ich würde die Zeichen alle einzeln durchlaufen und zählen solange immer das gleiche zeichen vorkommt.
Dabei die Position des ersten vorkommens des zeichens merken.

Ändert sich das Zeichen, ev. schaun, wie @einfach nur crack schon bemerkte, ob sich das komprimieren lohnt.
In diesem Fall wenn das vorkommen des zeichen öfters als 4 mal in einer reihenfolge auftaucht.

Dann, wenn kleiner 4 die original zeichen in das komprimierungs array, ansonsten deine komprimierung in das komprimierungs array.
HÄ jetzt versteh ich garnix mehr :(
 
#8
so habe jetzt einfach mal ein pseudocode geschrieben aber ich frage mich ob er auch richtig ist :confused:

SeqChar p = < NächstesEingabezeichen >;
Char k = NächstesEingabezeichen;
Wiederhole:
Falls p & < k > in Tabelle enthalten
dann p = p & < k >
sonst trage p & <k> neu in Tabelle ein
(und erzeuge neuen Index dafür);
Schreibe Tabellenindex von p auf Ausgabe;
p = < k >;
Ende Fallunterscheidung;
k = NächstesEingabezeichen;
solange bis Eingabeende
Schreibe Tabellenindex von p auf Ausgabe;
 

Parantatatam

mag Cookies & Kekse
#9

ComFreek

Mod | @comfreek
Moderator
#11
Mir scheint, als ob du hier nach einer fertigen Lösung für deine Hausaufgabe suchst.

einfach nur crack hat dir sogar schon echten Code geschrieben. Diesen in Pseudocode umzuwandeln müsste viel leichter sein als andersherum.
Folgende Zeile müsstest du in einer weiteren Funktion umschreiben, da du keine regulären Ausdrücke verwenden darfst.
Javascript:
var groups = string.match( /([A-Z])\1*/g )
Sie findet alle Reihungen gleicher Buchstaben. Dafür musst du den aktuellen Buchstaben zwischenspeichern und bei jeder Iteration (über dem String) prüfen, ob der nächste Buchstabe noch gleich dem alten Buchstaben ist.
Hier der Code in JavaScript:
Javascript:
// str ist ein String
// str[i]: Zeichen i im String str
// []: ein leeres Array
// [x,y,z]: ein Array mit den Werten x, y, z
function blub(str) {
  var curChar, count = 0;
  var sequences = [];
  for (var i = 0; i < str.length; i++) {
    if (i == 0) {
      curChar = str[i];
    }
    if (curChar == str[i]) {
      count++;
    } else {
      sequences.push([curChar, count]);
      count = 1;
      curChar = str[i];
    }
  }
  sequences.push([curChar, count]);
  return sequences;
}
Jetzt musst du nur noch deine Terminologie benutzen (Bilddaten).
Eventuell kann du statt der Speicherung der Reihungen auch gleich in das Array für die komprimierten Daten schreiben.
 
Zuletzt bearbeitet:

Parantatatam

mag Cookies & Kekse
#14
Hinweis: Ich musste in meinem Quelltext genau sechs Zeichen hinzufügen, wobei zwei Leerzeichen und noch einmal zwei Anführungszeichen waren.