Õppetund
Teooria — Levenshteini kauguse visualiseerija
Levenshteini kaugus kahe sõne vahel on vähim arv ühe märgi muudatusi, mis muudab ühe teiseks, kusjuures muudatus on lisamine, kustutamine või asendamine. See on miinimum üle kõigi võimalike tegemisviiside — ja just see teeb ta silma järgi raskeks ja ruudustikuga lihtsaks: muudatuste järjestusi on hoomamatult palju ning see meetod leiab lühima, ilma et loetleks neist ainsatki.
Mida iga sümbol tähendab
m, n- kahe sõne, A ja B, pikkused.
D(i, j)- odavaim viis muuta A esimesed i märki B esimesteks j märgiks. Üks lahter sellel lehel olevast tabelist.
[aᵢ ≠ bⱼ]- maksab 1, kui need kaks märki erinevad, ja 0, kui nad langevad kokku — asendamise hind, mis kaob, kui asendada pole midagi.
d- vastus,
D(m, n): parempoolne alumine lahter.
Kust valem tuleb
- Otsustage, mida üks lahter tähendab, enne kui ühtegi täidate. Olgu
D(i, j)vähim muudatuste arv, mis muudab A esimesedimärki B esimesteksjmärgiks. Otsitav arv onD(m, n)ja iga teine lahter on sama küsimuse väiksem variant. - Servad ei nõua mõtlemist. Et B esimesed
jmärki tühjast kohast üles ehitada, tuleb kõikjlisada, seegaD(0, j) = j. Et A esimesedimärki tühjaks taandada, tuleb kõikikustutada, seegaD(i, 0) = i. See on ruudustiku ülemine rida ja vasak veerg — ja seepärast nad lihtsalt loendavad. - Nüüd samm, mis teeb kogu töö. Võtke suvaline optimaalne käikude jada
D(i, j)jaoks ja vaadake ainult selle viimast käiku. Võimalusi on täpselt kolm: see kustutasaᵢ, jättes ülesandeksD(i−1, j); see lisasbⱼ, jättesD(i, j−1); või sidusaᵢjabⱼpaari, jättesD(i−1, j−1). Igaüks neist on lahter, mille olete juba täitnud. - Seega on lahter neist kolmest odavaim:
D(i, j) = min( D(i−1, j) + 1, D(i, j−1) + 1, D(i−1, j−1) + [aᵢ ≠ bⱼ] ). Täitke ruudustik vasakult paremale ja ülalt alla, siis on igasse lahtrisse jõudes selle kolm naabrit juba teada. See ongi kogu algoritm —m × nlahtrit, igaühes kolm võrdlust.
Kuidas nähtut lugeda
Ruudustik sellel lehel ongi see tabel. Read on A, veerud on B, ning lisarida ja -veerg üleval vasakul on 2. sammu tühjad eesliited — seepärast nad loendavad 0, 1, 2, 3. Lahtri toon on tema väärtus: kahvatu diagonaalne koridor on seal, kus kaks sõnet veel odavalt kokku langevad. Liigutage kursor lahtri kohale või puudutage seda ning allolev paneel kirjutab just selle lahtri jaoks 3. sammu lahti — kolm kandidaati, igaüks oma arvutusega, võitja esile tõstetud. Värviline joon on üks optimaalne tee, mis on parempoolsest alumisest nurgast tagasi jälitatud, ja selle all olev joondusriba on seesama tee märkidena välja kirjutatud.
- Eeldab
- Iga muudatus maksab täpselt 1 ja märke võrreldakse täpse võrdsuse alusel — ei mingit suur- ja väiketähtede ühtlustamist, Unicode’i normaliseerimist ega arusaama sellest, millised märgid üksteise moodi välja näevad. Kaks tagajärge on siin näha. Siin loendatakse UTF-16 koodiühikuid, mitte seda, mida te tähtedeks nimetaksite: kirjutage lahtrisse üksainus emoji ja tabel on 3 × 1, sest üks emoji on kaks ühikut ja selle kustutamine maksab 2. Ja
caféeelkomponeeritudé-ga võrrelduna sõnegacafé, mis on kirjutatud kuiepluss kombineeruv rõhumärk, annab kauguse 2, kuigi ekraanil näevad mõlemad täpselt ühesugused välja. - Ei kehti, kui
- Ruudustikus on
m × nlahtrit, seega töö kasvab pikkuste korrutisena. Kahe sõna puhul on see hea ja miljoni kirjega sõnaraamatu vastu päringu tegemiseks lootusetu — see on miljon ruudustikku. Loomulik vastus oleks nutikam algoritm, ja üllatus on, et sisuliselt ühtegi pole: Backurs ja Indyk näitasid 2015. aastal, et tugevalt alamruutaegne redigeerimiskaugus lükkaks ümber tugeva eksponentsiaalaja hüpoteesi. Päris õigekirjakontrollid ei alista seda piiri, vaid väldivad seda — katkestavad kohe, kui kaugus ületab väikese lävendi, või indekseerivad nii, et peaaegu ühtegi kandidaati ei võrreldagi.
Ülesanne täielikult lahendatud
-
Odavaim muutmisjada kitten muutmiseks sõnaks sitting 5 sammu
Teisenda kitten sõnaks sitting. Leia vähima maksumusega teisenduste jada ja tõesta, et odavamat ei ole olemas — seejärel arvuta, mida see maksab, kui teine sõna on terve sõnastik.
-
Rekurrentne seos ongi kogu algoritm. Iga lahter küsib, mida maksab siia jõudmine kustutamise, lisamise või kahe praeguse märgi kohakuti seadmise teel — viimane võimalus on tasuta, kui need ühtivad. Lahter vajab vaid kolme naabrit üleval ja vasakul, seega täidab tabeli üks läbivaatus vasakult paremale.
-
Enne millegi täitmist piira vastuse vahemik. Pikkused erinevad ühe võrra, seega on vähemalt üks lisamine vältimatu; ja sõna täielik ümberkirjutamine maksab 7. Vastus jääb nende vahele, mis välistab juba enamiku pakkumisi.
-
Kolm teisendust teevad töö ära: asenda k → s, asenda e → i, lisa g. Igaüks on üksik lubatud teisendus ja ahel lõpeb sihtmärgil.
-
Kolme teisenduse esitamine tõestab vaid seda, et kaugus on kõige rohkem 3. Tabel tõestab, et see on täpselt 3, sest iga tee alumisse paremasse nurka saab hindepunktid ja igas lahtris teel võetakse miinimum. See ongi erinevus vastuse leidmise ja selle ületamatuse teadmise vahel.
-
Maksumus on üks lahter märgipaari kohta — siin 42, mis pole midagi. 100 000-sõnalise sõnastiku puhul, kus iga sõna on seitse tähte pikk, teeb see üheainsa otsingu jaoks üle nelja miljoni lahtri uuendamise.
Vastus
Tööriist väljastab tulemuseks 3 ja sarnasuseks 57,14%, mis on 1 − 3/7: pikema sõnaga normaliseeritud kaugus. Mõlemad pärinevad tabelist, mille saab käsitsi täita minutiga. See, mis ei skaalu, on tabel — töömaht on Θ(mn), seega mõlema sõne pikkuse kahekordistamine neljakordistab selle, ning iga õigekirjakontroll, mida olete kasutanud, on üles ehitatud nii, et seda vältida. Väljapääs ei ole kiirem tabel. Väljapääs peitub selles, et Levenshteini kaugus rahuldab kolmnurga võrratust, seega d(a, c) ≤ d(a, b) + d(b, c) võimaldab indeksil tõestada kandidaadi liiga suurt kaugust ilma seda kaugust kunagi mõõtmata.
-
Allikad (4)
- The theory section ends on why nobody has a much faster algorithm. This is the result that says they probably cannot have one: A. Backurs & P. Indyk, "Edit Distance Cannot Be Computed in Strongly Subquadratic Time (Unless SETH is False)." SIAM Journal on Computing 47(3), 1087–1097, 2018; first presented at STOC 2015.
- The grid this tool fills, and why filling each cell once is enough: R. A. Wagner & M. J. Fischer, "The String-to-String Correction Problem." Journal of the ACM 21(1), 168–173, 1974 — the dynamic-programming algorithm for the edit distance Levenshtein had defined in 1965.
- The fourth move in the Damerau cost model, and the survey of typing errors that argued for it: F. J. Damerau, "A technique for computer detection and correction of spelling errors." Communications of the ACM 7(3), 171–176, 1964.
- Insight block 3 ends on the problem of recovering the route without keeping the grid. This is the paper that solved it: D. S. Hirschberg, "A linear space algorithm for computing maximal common subsequences." Communications of the ACM 18(6), 341–343, 1975.