Uppgiften att hitta den största ökande undersekvensen är att hitta den längst ökande undersekvensen i en given sekvens av element.
Observera att en delsekvens kanske inte är en delsträng (det vill säga att dess element inte nödvändigtvis är konsekutiva i den ursprungliga sekvensen). Formellt, för en sträng x med längden n , är det nödvändigt att hitta det maximala antalet l och motsvarande ökande sekvens av index , så att . Den största ökande undersekvensen har tillämpningar inom fysik, matematik, grupprepresentationsteori, slumpmatristeori. I det allmänna fallet är lösningen av detta problem känd i tiden n log n i värsta fall [1] .
Låt oss presentera en algoritm för att lösa problemet som körs i O( n log n ).
För sträng x kommer vi att lagra arrayerna M och P med längden n . M[i] innehåller indexet för det minsta av de sista elementen av ökande delsekvenser x n j av längden i , , som finns i detta steg. P[i] lagrar indexet för det föregående tecknet för den längsta stigande undersekvensen som slutar i den i:te positionen. Vid varje steg kommer vi att lagra den nuvarande maximala längden på undersekvensen och motsvarande index för det sista tecknet, och komma ihåg att behålla egenskaperna för arrayer. Ett steg är en övergång till nästa element i strängen, varje övergång kräver inte mer än logaritmen av tid (binär sökning på arrayen 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
Efter exekvering av algoritmen är L uppenbarligen längden på den önskade undersekvensen, och själva elementen kan erhållas genom att expandera P rekursivt från indexelementet.