Nejdelší rostoucí subsekvence - Longest increasing subsequence

Ve výpočetní technice je nejdéle rostoucím problémem subsekvencí nalezení subsekvence dané sekvence, ve které jsou prvky subsekvence seřazené, od nejnižší po nejvyšší a ve které je subsekvence co nejdelší. Tato subsekvence není nutně souvislá nebo jedinečná. Nejdelší rostoucí subsekvence jsou studovány v rámci různých oblastech souvisejících s matematiky , včetně algoritmizace , teorie náhodných matice , teorie reprezentace a fyziky . Nejdelší rostoucí problém subsekvencí je řešitelný v čase O ( n log n ), kde n označuje délku vstupní sekvence.

Příklad

V prvních 16 termínech binární Van der Corputovy sekvence

0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15

je nejdelší rostoucí podsekvencí

0, 2, 6, 9, 11, 15.

Tato subsekvence má délku šest; vstupní sekvence nemá žádné sedmičlenné rostoucí podsekvence. Nejdelší rostoucí subsekvence v tomto příkladu není jediným řešením: například

0, 4, 6, 9, 11, 15
0, 2, 6, 9, 13, 15
0, 4, 6, 9, 13, 15

jsou další rostoucí podsekvence stejné délky ve stejné vstupní sekvenci.

Vztahy k dalším algoritmickým problémům

Nejdelší rostoucí problém subsekvencí úzce souvisí s nejdelším společným problémem subsekvence , který má kvadratické časové dynamické programovací řešení: nejdelší rostoucí subsekvence sekvence S je nejdelší společnou subsekvencí S a T , kde T je výsledkem třídění S . Ve zvláštním případě, kdy je vstupem permutace celých čísel 1, 2, ..., n , však lze tento přístup učinit mnohem efektivnějším, což vede k časovým hranicím tvaru O ( n log log n ).

Největší klika v permutačním grafu odpovídá nejdelší klesající subsekvenci permutace, která graf definuje (za předpokladu, že je původní nepermutovaná sekvence seřazena od nejnižší hodnoty po nejvyšší). Podobně maximální nezávislá množina v permutačním grafu odpovídá nejdelší neklesající subsekvenci. K efektivnímu vyřešení problému s klikou v permutačních grafech lze tedy použít nejdelší rostoucí algoritmy subsekvencí .

V Robinsonově -Schenstedově korespondenci mezi permutacemi a Youngovými tableaux se délka prvního řádku tabla odpovídající permutaci rovná délce nejdelší rostoucí subsekvence permutace a délka prvního sloupce se rovná délce nejdelší klesající podsekvenci.

Efektivní algoritmy

Níže popsaný algoritmus efektivně řeší nejdelší rostoucí problém subsekvencí pomocí polí a binárního vyhledávání . Zpracovává sekvenční prvky v pořadí a zachovává dosud nejdelší rostoucí subsekvenci. Označte hodnoty sekvence jako atd. Poté, po zpracování , bude mít algoritmus uložené hodnoty ve dvou polích:

  • - ukládá index nejmenší hodnoty tak, že dochází k rostoucí podsekvenci délky končící na v rozsahu ( Toto prohlášení musí být jasnější ). Pokud tedy označuje množinu všech indexů tak, že a existuje rostoucí podposloupnost délky končící na (to znamená, že existují indexy končící na takové, že ), pak je index, pro který platí následující: a (nebo ekvivalentně a pro každý ). Všimněte si toho, protože protože představuje délku rostoucí podposloupnosti a představuje index jejího ukončení.
  • - ukládá index předchůdce v nejdelší rostoucí subsekvenci končící na

Algoritmus navíc ukládá proměnnou L představující délku dosud nalezené nejdelší rostoucí subsekvence. Protože níže uvedený algoritmus používá číslování založené na nule , je pro přehlednost vyplněno, což se nepoužívá, což odpovídá podsekvenci délky Skutečná implementace může podle toho přeskočit a upravit indexy.

Všimněte si, že v jakémkoli bodě algoritmu sekvence

stoupá. Neboť pokud existuje rostoucí podposloupnost délky končící na, pak existuje také podposloupnost délky končící na menší hodnotě: jmenovitě ta, která končí na Tedy, můžeme v této sekvenci provádět binární vyhledávání v logaritmickém čase.

Algoritmus tedy probíhá následovně:

Image
Ukázka kódu.
P = array of length N
M = array of length N + 1

L = 0
for i in range 0 to N-1:
    // Binary search for the largest positive j ≤ L
    // such that X[M[j]] < X[i]
    lo = 1
    hi = L + 1
    while lo < hi:
        mid = lo + floor((hi-lo)/2)
        if X[M[mid]] < X[i]:
            lo = mid+1
        else:
            hi = mid

    // After searching, lo is 1 greater than the
    // length of the longest prefix of X[i]
    newL = lo

    // The predecessor of X[i] is the last index of 
    // the subsequence of length newL-1
    P[i] = M[newL-1]
    M[newL] = i
    
    if newL > L:
        // If we found a subsequence longer than any we've
        // found yet, update L
        L = newL

// Reconstruct the longest increasing subsequence
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

Protože algoritmus provádí jedno binární vyhledávání na prvek sekvence, jeho celkový čas lze vyjádřit pomocí Big O notace jako O ( n  log  n ). Fredman (1975) pojednává o variantě tohoto algoritmu, kterou připisuje Donaldu Knuthovi ; ve variantě, kterou studuje, algoritmus před provedením binárního vyhledávání testuje, zda lze každou hodnotu použít k prodloužení aktuální nejdelší rostoucí sekvence v konstantním čase. S touto modifikací algoritmus používá nanejvýš n log 2 n - n log 2 log 2 n + O ( n ) srovnání v nejhorším případě, což je optimální pro algoritmus založený na srovnání až do konstantního faktoru v O ( n ) termín.

Hranice délky

Podle Erdős – Szekeresovy věty má jakákoli sekvence n 2 +1 odlišných celých čísel rostoucí nebo klesající subsekvenci délky n + 1. U vstupů, u nichž je každá permutace vstupu stejně pravděpodobná, se předpokládaná délka nejdelší subsekvence je přibližně 2 n . V limitu, když se n blíží nekonečnu, má délka nejdelší rostoucí subsekvence náhodně permutované sekvence n položek distribuci blížící se distribuci Tracy – Widom , distribuci největší vlastní hodnoty náhodné matice v Gaussově unitárním souboru .

Online algoritmy

Nejdelší rostoucí subsekvence byla také studována v nastavení online algoritmů , ve kterých jsou prvky sekvence nezávislých náhodných proměnných se spojitou distribucí F - nebo alternativně prvky náhodné permutace - prezentovány po jednom algoritmu, který musí rozhodnout, zda zahrnout nebo vyloučit každý prvek, bez znalosti pozdějších prvků. V této variantě problému, která umožňuje zajímavé aplikace v několika kontextech, je možné navrhnout optimální postup výběru, který vzhledem k náhodnému vzorku velikosti n jako vstupu vygeneruje rostoucí sekvenci s maximální očekávanou délkou velikosti přibližně 2n . Délka rostoucí subsekvence zvolená tímto optimálním postupem má rozptyl přibližně rovný 2n /3 a její omezující distribuce je po obvyklém centrování a škálování asymptoticky normální . Stejné asymptotické výsledky platí pro přesnější meze pro odpovídající problém při nastavení Poissonova procesu příchodu. Další upřesnění v nastavení Poissonova procesu je dáno důkazem centrální limitní věty pro optimální výběrový proces, který drží, s vhodnou normalizací, v úplnějším smyslu, než by se dalo očekávat. Důkaz přináší nejen „správnou“ funkční limitní větu, ale také (singulární) kovarianční matici trojrozměrného procesu shrnující všechny interagující procesy.

aplikace

  • Součást systému MUMmer (Maximum Unique Match finder) pro zarovnání celých genomů.
  • Používá se v systémech pro správu verzí, jako je Git atd.
  • Používá se v Patience Diff, rozdílném algoritmu (vypočítává a zobrazuje rozdíly mezi obsahem souborů), který se používá v „Bazaru“ (Bazaar je systém pro správu verzí, který vám pomůže sledovat historii projektu v čase a snadno spolupracovat s ostatními ..)

Viz také

Reference

externí odkazy