Levenshtein-afstanden ( rediger afstand , rediger afstand ) er en metrik , der måler den absolutte forskel mellem to sekvenser af tegn. Det er defineret som det mindste antal enkelttegnsoperationer (nemlig indsættelser, sletninger, substitutioner), der kræves for at transformere en sekvens af tegn til en anden. Generelt kan de operationer, der anvendes i denne transformation, tildeles forskellige priser. Udbredt i informationsteori og datalingvistik .
Problemet blev først stillet i 1965 af den sovjetiske matematiker Vladimir Levenshtein , da han studerede sekvenser [1] , senere blev et mere generelt problem for et vilkårligt alfabet forbundet med hans navn. Et stort bidrag til undersøgelsen af spørgsmålet blev ydet af Dan Gasfield [2] .
Levenshtein-afstanden og dens generaliseringer bruges aktivt:
Fra et applikationssynspunkt har definitionen af afstanden mellem ord eller tekstfelter ifølge Levenshtein følgende ulemper:
En redaktionel instruktion er en sekvens af handlinger, der er nødvendige for at opnå den anden fra den første linje på den kortest mulige måde. Normalt betegnes handlinger som følger: D ( eng. delete ) - delete, I (eng. insert) - insert, R ( replace ) - replace, M ( match ) - match.
For eksempel, for 2 strenge "CONNECT" og "CONEHEAD" kan du bygge følgende konverteringstabel:
M | M | M | R | jeg | M | R | R |
---|---|---|---|---|---|---|---|
C | O | N | N | E | C | T | |
C | O | N | E | H | E | EN | D |
At finde kun Levenshtein-afstanden er en lettere opgave end også at finde den redaktionelle recept (se nedenfor for flere detaljer).
Operationspriser kan afhænge af operationstypen (indsæt, slet, erstat) og/eller af de involverede tegn, hvilket afspejler den forskellige sandsynlighed for mutationer i biologien [3] , forskellig sandsynlighed for forskellige fejl ved indtastning af tekst osv. I den generelle sag:
Det er nødvendigt at finde en sekvens af substitutioner, der minimerer de samlede omkostninger. Levenshtein-afstanden er et særligt tilfælde af dette problem for
Både et specialtilfælde og et problem for vilkårlig w løses af Wagner-Fisher-algoritmen nedenfor. Her og nedenfor antager vi, at alle w er ikke-negative, og trekantens ulighed gælder : at erstatte to på hinanden følgende operationer med én øger ikke de samlede omkostninger (for eksempel at erstatte symbolet x med y, og så er y med z nej bedre end umiddelbart x med z).
Hvis vi tilføjer en transponering til listen over tilladte operationer (to tilstødende tegn er byttet om), får vi Damerau-Levenshtein-afstanden . Den har også en algoritme, der kræver O(MN)-operationer. Damerau viste, at 80% af menneskelige tastefejl er transpositioner. Derudover bruges afstanden Damerau-Levenshtein også i bioinformatik.
Her og nedenfor antages det, at elementerne i strenge er nummereret fra den første, som det er sædvanligt i matematik, og ikke fra nul, som det er sædvanligt i mange programmeringssprog.
Lad og være to strenge (af længde og henholdsvis) over et eller andet alfabet , så kan redigeringsafstanden (Levenshtein-afstanden) beregnes ved hjælp af følgende rekursive formel
, hvor
,
hvor er nul hvis og en ellers; returnerer det mindste af argumenterne.
Her symboliserer trinnet på sletningen (D) fra den første linje, på - indsættelsen (I) i den første linje, og trinnet på begge indeks symboliserer udskiftningen af tegnet (R) eller fraværet af ændringer (M) .
Det er klart, at følgende udsagn er sande:
P | O | L | Y | N | O | M | jeg | EN | L | ||
---|---|---|---|---|---|---|---|---|---|---|---|
0 | en | 2 | 3 | fire | 5 | 6 | 7 | otte | 9 | ti | |
E | en | en | 2 | 3 | fire | 5 | 6 | 7 | otte | 9 | ti |
x | 2 | 2 | 2 | 3 | fire | 5 | 6 | 7 | otte | 9 | ti |
P | 3 | 2 | 3 | 3 | fire | 5 | 6 | 7 | otte | 9 | ti |
O | fire | 3 | 2 | 3 | fire | 5 | 5 | 6 | 7 | otte | 9 |
N | 5 | fire | 3 | 3 | fire | fire | 5 | 6 | 7 | otte | 9 |
E | 6 | 5 | fire | fire | fire | 5 | 5 | 6 | 7 | otte | 9 |
N | 7 | 6 | 5 | 5 | 5 | fire | 5 | 6 | 7 | otte | 9 |
T | otte | 7 | 6 | 6 | 6 | 5 | 5 | 6 | 7 | otte | 9 |
jeg | 9 | otte | 7 | 7 | 7 | 6 | 6 | 6 | 6 | 7 | otte |
EN | ti | 9 | otte | otte | otte | 7 | 7 | 7 | 7 | 6 | 7 |
L | elleve | ti | 9 | otte | 9 | otte | otte | otte | otte | 7 | 6 |
Lad os overveje formlen mere detaljeret. Det er klart, at redigeringsafstanden mellem to tomme linjer er nul. Det er også indlysende, at for at få en tom streng fra en streng med længde , skal du udføre sletningsoperationer, og for at få en streng med længde fra en tom, skal du udføre indsættelsesoperationer.
Det er tilbage at overveje det ikke-trivielle tilfælde, når begge strenge er ikke-tomme.
Til at begynde med bemærker vi, at de i den optimale rækkefølge af operationer kan ombyttes vilkårligt. Overvej faktisk to sekventielle operationer:
Lad det ende med tegnet "a", slut med tegnet "b". Der er tre muligheder:
For at finde den korteste afstand skal du beregne matrixen D ved hjælp af ovenstående formel . Det kan beregnes både efter rækker og efter kolonner. Algoritme pseudokode:
for alle i fra 0 til M for alle j fra 0 til N udregn D(i, j) retur D(M, N)Eller i en mere detaljeret form og med vilkårlige priser på erstatninger, indsættelser og sletninger:
D(0, 0) = 0 for alle j fra 1 til N D(0, j) = D(0, j - 1) + symbolindsæt pris S2[j] for alle i fra 1 til M D(i, 0) = D(i - 1, 0) + omkostningerne ved at slette symbolet S1[i] for alle j fra 1 til N D(i, j) = min{ D(i - 1, j) + omkostninger ved at slette symbolet S1[i], D(i, j - 1) + omkostningerne ved at indsætte symbolet S2[j], D(i - 1, j - 1) + omkostninger ved at erstatte symbol S1[i] med symbol S2[j] } retur D(M, N)(Vi minder dig om, at elementerne i rækkerne er nummereret fra den første , ikke fra nul.)
For at gendanne den redaktionelle recept er det nødvendigt at beregne matrixen D og derefter gå fra nederste højre hjørne (M, N) til øverste venstre, ved hvert trin på udkig efter minimum tre værdier:
Her (i, j) er cellen i matrixen, hvor vi er på dette trin. Hvis to af de tre værdier er minimale (eller alle tre er ens), betyder det, at der er 2 eller 3 tilsvarende redaktionelle forskrifter.
Denne algoritme kaldes Wagner-Fisher-algoritmen. Det blev foreslået af R. Wagner (RA Wagner) og M. Fischer (MJ Fischer) i 1974. [fire]
Algoritmen i formen beskrevet ovenfor kræver operationer og den samme hukommelse. Sidstnævnte kan være irriterende: For eksempel vil sammenligning af filer med en længde på 10 5 linjer kræve omkring 40 gigabyte hukommelse.
Hvis der kun kræves afstand, er det nemt at reducere den nødvendige hukommelse til . For at gøre dette skal vi tage højde for, at efter at have beregnet en linje, er den forrige linje ikke længere nødvendig. Desuden er D(i-1,0) ... D(i-1,j-1) heller ikke nødvendig efter beregning af D(i, j). Derfor kan algoritmen omskrives som
for alle i fra 0 til M for alle j fra 0 til N udregn D(i, j) hvis jeg > 0 slet linje D(i - 1) retur D(M, N)eller endda
for alle i fra 0 til M for alle j fra 0 til N udregn D(i, j) hvis i > 0 og j > 0 slet D(i - 1, j - 1) retur D(M, N)Hvis et redaktionelt mandat er påkrævet, bliver det sværere at gemme hukommelsen.
For at sikre hukommelsestid definerer vi en matrix E med minimumsafstande mellem strengsuffikser , dvs. E(i, j) er afstanden mellem de sidste i-tegn og de sidste j-tegn . Det er klart, at matrixen E kan beregnes på samme måde som matricen D, og lige så hurtigt.
Nu beskriver vi algoritmen, idet vi antager, at den er den korteste af de to strenge.
Udførelsestiden opfylder (op til multiplikation med en konstant) betingelsen
,hvorfra det følger (bevist ved induktion på M)
følgelig
Påkrævet hukommelse er proportional
Derudover er der algoritmer, der sparer hukommelse på grund af en betydelig opbremsning, for eksempel bliver tiden kubisk, ikke kvadratisk, i længden af linjer.
Strenge | |
---|---|
String lighedsmål | |
Understrengssøgning | |
palindromer | |
Sekvensjustering | |
Suffiksstrukturer | |
Andet |