Problém najít největší rostoucí subsekvenci

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 8. února 2015; kontroly vyžadují 7 úprav .

Úkolem najít největší rostoucí podposloupnost je najít nejdelší rostoucí podposloupnost v dané posloupnosti prvků.

Prohlášení o problému

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] .

Související algoritmy

Příklad efektivního algoritmu

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.

Poznámky

  1. Schensted, C. (1961). „Nejdelší rostoucí a klesající dílčí sekvence“. Canadian Journal of Mathematics 13: 179-191.
  2. Hunt, James W. a Szymanski, Thomas G. Rychlý algoritmus pro výpočet nejdelších společných sekvencí   // Commun . ACM. - ACM, 1977. - Sv. 20 , č. 5 . - str. 350--353 . — ISSN 0001-0782 .

Odkazy