Vor 6 Stunden
Folgende Problemstellung wurde gemeldet:
Es liegt eine TUSTEP-Datei in folgender Form vor:
Nun soll in jeder Zeile in den zweiten Tag die Nummer des ersten Tags der folgenden Zeile eingetragen werden, ohne dass sonst etwas an den Datensätzen geändert wird. In der letzten Zeile soll nichts eingetragen werden, z. B.:
Lösungsweg:
Die Datei wird zeilenweise von hinten nach vorne gelesen und die zu schreibende Nummer im Zwischenspeichert gemerkt.
Im ersten Satz von hinten wird nichts eingetragen, ab da die jeweils gemerkte Nummer:
Komplexität des Algorithmus (vgl. Landau-Notation)
Die Laufzeit beträgt O(n), da alle n Datensätze jeweils einmal gelesen werden müssen.
Der Speicherverbrauch beträgt O(1), da nur konstant viel Speicher belegt wird.
Es liegt eine TUSTEP-Datei in folgender Form vor:
Code:
<eins>{#}</eins><zwei></zwei>
<eins>{#}</eins><zwei></zwei>
<eins>{#}</eins><zwei></zwei>
<eins>{#}</eins><zwei></zwei>Nun soll in jeder Zeile in den zweiten Tag die Nummer des ersten Tags der folgenden Zeile eingetragen werden, ohne dass sonst etwas an den Datensätzen geändert wird. In der letzten Zeile soll nichts eingetragen werden, z. B.:
Code:
<eins>1</eins><zwei>2</zwei>
<eins>2</eins><zwei>3</zwei>
<eins>3</eins><zwei>4</zwei>
<eins>4</eins><zwei></zwei>Lösungsweg:
Die Datei wird zeilenweise von hinten nach vorne gelesen und die zu schreibende Nummer im Zwischenspeichert gemerkt.
Im ersten Satz von hinten wird nichts eingetragen, ab da die jeweils gemerkte Nummer:
Code:
#MAKRO
$$ MODE TUSCRIPT, {}
SET quelle = "Hier der Name der Quelldatei"
SET ziel = "Hier der Name der Zieldatei"
SET daten = FILE(quelle)
- Wir drehen die Reihenfolge der Datensätze um, lesen also von hinten nach vorne
SET daten = REVERSE(daten)
- Wir suchen eine Zahl, die zwischen <eins> und </eins> steht
- {[} = linker Rand; {]} = rechter Rand
BUILD S_TABLE s1 = "|<eins>{[}{#}{]}</eins>|"
- Schleife über alle Datensätze (Zeilen)
- Bei jedem Durchgang wird die aktuelle Zeile aus der Variable daten
- gelöscht (LOOP/CLEAR), die Nummer eingesetzt und dann die so geänderte Zeile
- wieder hinzugefügt. Dadurch spart man sich den Speicher für eine zweite
- Sternvariable.
SET nummer = ""
LOOP/CLEAR zeile = daten
BUILD X_TABLE x1 = "|<zwei></zwei>|<zwei>{nummer}</zwei>|"
SET zeile = EXCHANGE(zeile, x1)
RELEASE X_TABLE x1
SET daten = APPEND(daten, zeile)
- Die Nummer wird für den nächsten Durchgang extrahiert
SET von = SEARCH(zeile, s1, 0, 0, 1, bis)
SET nummer = EXTRACT(zeile, #von, #bis)
ENDLOOP
- Wir drehen die Reihenfolge wieder und schreiben in die Zieldatei
SET daten = REVERSE(daten)
FILE/ERASE ziel = daten
*eofKomplexität des Algorithmus (vgl. Landau-Notation)
Die Laufzeit beträgt O(n), da alle n Datensätze jeweils einmal gelesen werden müssen.
Der Speicherverbrauch beträgt O(1), da nur konstant viel Speicher belegt wird.