![]() |
Burrows-Wheeler-Transformation nach Wikipedia
Ich stecke gerade fest und finde einfach nicht heraus wo das Problem ist.
Ich möchte gerne in Delphi die Burrows-Wheeler-Transformation nachschreiben. Dazu habe ich mir das Wikipedia-Beispiel angesehen (LUA) und nach Delphi umgeschrieben. Wikipedia: ![]() Delphi
Delphi-Quellcode:
Das gewünschte Ergebnis der ersten Transformation (Rotation) ist
procedure TForm1.Button4Click(Sender: TObject);
var i, iTmp, j, len, index: Integer; sText, codiert: string; matrix: array of string; begin Memo1.Lines.Clear; sText := Edit2.Text; len := Length(sText) + 1; SetLength(matrix, len); // Start : .ANANAS. // Wanted result: ANANAS.. // Tabelle mit allen Rotationen des Textes erzeugen for i := 1 to len - 1 do begin matrix[i] := Copy(sText, i, Length(sText)) + Copy(sText, 1, i - 1); // matrix[i] = string.sub(text, i) .. string.sub(text, 1, i - 1) Memo1.Lines.Add(matrix[i]); end; // Tabelle sortieren for i := 1 to len - 1 do begin for j := i + 1 to len - 1 do begin if Length(matrix[i]) > Length(matrix[j]) then begin matrix[i] := matrix[j]; matrix[j] := matrix[i]; end; end; end;; // Aus jeder Zeile das letzte Zeichen nehmen codiert := ''; index := -1; for i := 1 to len - 1 do begin codiert := codiert + Copy(matrix[i], Length(matrix[i]), 1); if matrix[i] = sText then index := i; end; ShowMessage(codiert); end;
Mein Ergebnbis ist aber
Blickt hier jemand eher durch als ich :idea: |
AW: Burrows-Wheeler-Transformation nach Wikipedia
Ich hab mich jetzt nicht genau mit dem Algorithmus auseinandergesetzt aber:
1) der 2. Schritt sortiert den Text d.h. statt
Delphi-Quellcode:
was immer gleich sein sollte, wird eher ein CompareText benötigt
Length(matrix[i]) > Length(matrix[j])
2) du brauchst eine Hilfsvariable zum Austausch
Delphi-Quellcode:
h := matrix[i];
matrix[i] := matrix[j]; matrix[j] := h; |
AW: Burrows-Wheeler-Transformation nach Wikipedia
Danke für die Antwort.
Die beiden Hilfestellungen machen leider keinen Unterschied am aktuellen Ergebnis. Ich denke es liegt an dieser Zeile hier die nicht die gleiche Funktionalität hat wie die LUA-Zeile
Delphi-Quellcode:
{* Delphi *} matrix[i] := Copy(sText, i, Length(sText)) + Copy(sText, 1, i - 1);
{* LUA * } // matrix[i] = string.sub(text, i) .. string.sub(text, 1, i - 1) |
AW: Burrows-Wheeler-Transformation nach Wikipedia
Deine Schleifen starten bei Index "1", ein Array in Delphi startet jedoch - soweit nicht anders angegeben - mit dem Index "0".
|
AW: Burrows-Wheeler-Transformation nach Wikipedia
Zitat:
+1, weil sonst der letzte Buchstabe aufgefressen wird (da ich ja bei 1 beginne). Vom Prinzip her funktioniert meine Transformation ja. Nur die Reihenfolge ist scheinbar umgedreht oder verdreht. |
AW: Burrows-Wheeler-Transformation nach Wikipedia
Du solltest trotzdem das von Daniel umsetzen und beim Stringindex + 1 addieren
Delphi-Quellcode:
Auch wenn ich nie LUA programmiert habe, der Quellcode von Wikipedia scheint nicht zum Ergebnis zu passen. Lass die 1. Schleife rückwärts laufen, dann sollte es klappen
len := Length(text);
SetLength(matrix, len) // ... // Bubblesort for i := Low(Matrix) to High(Matrix)-1 do begin for j := i+1 to High(Matrix) do begin end; end; //...
Delphi-Quellcode:
Es ist aber egal wie rum die Schleife läuft, durch die Sortierung sollte man in beiden Fällen das richtige Endergebnis erhalten.
for i := High(Matrix) downto Low(Matrix) do
///... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz