Uppgiften att hitta den längsta gemensamma undersekvensen ( eng. längsta gemensamma undersekvensen , LCS) är uppgiften att hitta en sekvens som är en undersekvens av flera sekvenser (vanligtvis två). Ofta definieras problemet som att hitta alla de största delsekvenserna. Detta är ett klassiskt datavetenskapligt problem , som har tillämpningar, särskilt i textfilsjämförelseproblemet ( diff- verktyget ), såväl som i bioinformatik .
En undersekvens kan erhållas från någon ändlig sekvens om någon uppsättning av dess element (eventuellt tomma) tas bort från den senare. Till exempel är BCDB en undersekvens av sekvensen ABCDDBAB. Vi säger att en sekvens Z är en gemensam undersekvens av sekvenserna X och Y om Z är en undersekvens av både X och Y. Det krävs för två sekvenser X och Y för att hitta en gemensam undersekvens av störst längd. Observera att det kan finnas flera NOP.
Notera! En delsekvens skiljer sig från en delsträng . Till exempel, om det finns en källsekvens "ABCDEF" kommer "ACE" att vara en delsekvens men inte en delsträng och "ABC" kommer att vara både en delsekvens och en delsträng.
Låt oss jämföra två lösningsmetoder: brute-force-sökning och dynamisk programmering .
Det finns olika tillvägagångssätt för att lösa detta problem med en fullständig uppräkning - du kan sortera ut alternativ för efterföljande, raderingsalternativ från dessa sekvenser, etc. Men i alla fall kommer programmets gångtid att vara ett polynom i strängarnas längder.
A | B | C | D | ||
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | |
D | 0 | ← 0 | ← 0 | ← 0 | ↖ 1 |
C | 0 | ← 0 | ← 0 | ↖ 1 | ← 1 |
D | 0 | ← 0 | ← 0 | ↑ 1 | ↖ 2 |
A | 0 | ↖ 1 | ← 1 | ← 1 | ↑ 2 |
Hitta först längden på den största undersekvensen. Antag att vi letar efter en lösning för fallet (n 1 , n 2 ), där n 1 , n 2 är längden på den första och andra strängen. Låt lösningar redan existera för alla delproblem (m 1 , m 2 ) mindre än det givna. Därefter reduceras uppgiften (n 1 , n 2 ) till mindre deluppgifter enligt följande:
Låt oss nu återgå till problemet med att konstruera en undersekvens. För att göra detta lägger vi till den befintliga algoritmen ett minne för varje uppgift i deluppgiften genom vilken den löses. Nästa åtgärd, med början från det sista elementet, går vi upp till början längs riktningarna som ges av den första algoritmen och skriver tecknen i varje position. Detta kommer att vara svaret på detta problem.
Algoritmens körtid kommer att vara .
Strängar | |
---|---|
Stränglikhetsmått | |
Sök efter delsträng | |
palindromer | |
Sekvensjustering | |
Suffixstrukturer | |
Övrig |