Das Ziel des Algorithmus ist es, die längste Teilfolge in einem Array zu finden, welche kontinuierlich aufsteigt.

Im Array ist die längste aufsteigende Teilfolge (LAT) z.B.
und hat die Länge .

Gegeben ist dem Algorithmus ein Array von Integern und es wird angenommen, das kein Wert doppelt im Array ist.

Gesucht ist die längste aufsteigende Teilfolge wie am Beispiel oben illustriert.

Ansatz mit dynamischer Programmierung

Versuch 1

Beim Versuch 1 wird für immer die längste AT von verwendet.

Beispiel


Das Array hat die folgenden LATs:





Das Problem tritt hier zwischen und auf. Dieser Schritt ist mit Rekursion nicht bzw. nur schwer zu implementieren.

Versuch 2

Versuch 2 geht ähnlich vor, wie dies auch schon in Versuch 1 der Fall war. Allerdings merkt man sich beim zweiten Versuch alle Endungen einer LAT in .

Beispiel



(eindeutig)
(eindeutig)

Auch hier ist dies nur schwer mit Rekursion zu implementieren.

Versuch 3

Die Idee bei Versuch 3 ist, dass man sich auch kürzere ATs in merkt.

ist also definiert, als “Es gibt eine AT der Länge , die in Position endet”. gibt entweder zurück wenn die AT in endet oder wenn sie es nicht tut.

Die Rekursion sieht dann für folgendermassen aus:

Der Basisfall lautet hier folgendermassen:
für alle

Laufzeitanalyse

Wenn man sich die LATs noch einmal anschaut, so sieht man, dass es immer sinnvoller ist, die Folge zu verwenden und nicht . Denn jedes Element, mit welchem man die Folge fortsetzen kann, setzt auch die Folge fort. Hingegen können Elemente, welche aber sind noch an die Folge angefügt werden, jedoch nicht an .

Versuch 4

Der vierte Versuch macht sich genau das oben beobachtete zu Nutzen und soll so die Laufzeit verbessern.

ist die kleinstmögliche Endung einer AT der Länge in . Falls keine solche AT existiert wird dafür geschrieben.

Die Rekursion sieht dann für folgendermassen aus:

Die beiden Basisfälle lauten:

Hier ist nun eine Laufzeit von möglich.

Beispiel

Auch hier kann man wieder einige Eigenschaften entdecken, welche die Implementierung noch einmal verbessern:

  • Die Zeilen sind immer sortiert.
  • Pro Zeile wird immer maximal ein Wert geändert.
  • Der Wert, welcher geändert werden muss kann mit der Binären Suche in durchgeführt werden.
  • Wenn für jede Zeile dasselbe Array verwendet wird und die Einträge nur überschrieben werden, dauert das Update einer Zeile nur
  • Bei Zeilen kommt man somit auf eine Gesamtlaufzeit von

Wenn man nun die Elemente der LAT haben möchte, so muss man für jedes Element des Arrays den Vorgänger speichern. Wichtig ist, dass es der Vorgänger zum Zeitpunkt des Einfügen dieses Elementes ist.