Úkolem najít největší rostoucí podposloupnost je najít nejdelší rostoucí podposloupnost v dané posloupnosti prvků.
Všimněte si, že podsekvence nemusí být podřetězcem (to znamená, že její prvky nemusí být nutně po sobě jdoucí v původní sekvenci). Formálně je pro řetězec x délky n nutné najít maximální číslo l a odpovídající rostoucí posloupnost indexů , takže . Největší rostoucí podsekvence má aplikace ve fyzice, matematice, teorii reprezentace grup, teorii náhodných matic. V obecném případě je řešení této úlohy známo v čase n log n v nejhorším případě [1] .
Ukažme si algoritmus pro řešení problému, který běží v O( n log n ).
Pro řetězec x uložíme pole M a P délky n . M[i] obsahuje index nejmenšího z posledních prvků rostoucích dílčích sekvencí x n j délky i , nalezených v tomto kroku. P[i] ukládá index předchozího znaku pro nejdelší vzestupnou podsekvenci končící na i-té pozici. V každém kroku uložíme aktuální maximální délku podsekvence a odpovídající index konečného znaku, přičemž nezapomeneme zachovat vlastnosti polí. Krok je přechod na další prvek řetězce, každý přechod nebude vyžadovat více než logaritmus času (binární vyhledávání na poli M ).
P = array of length N M = array of length N + 1 L = 0 for i in range 0 to N-1: lo = 1 hi = L while lo ≤ hi: mid = ceil((lo+hi)/2) if X[M[mid]] < X[i]: lo = mid+1 else: hi = mid-1 newL = lo P[i] = M[newL-1] M[newL] = i if newL > L: L = newL S = array of length L k = M[L] for i in range L-1 to 0: S[i] = X[k] k = P[k] return S
Je zřejmé, že po provedení algoritmu je L délka požadované podsekvence a samotné prvky lze získat expanzí P rekurzivně z prvku indexu.