www.wikidata.uk-ua.nina.az
Algoritm Knuta Morrisa Pratta skorocheno algoritm KMP odin iz algoritmiv poshuku ryadka sho shukaye vhodzhennya slova W u ryadku S vikoristovuyuchi proste sposterezhennya sho koli vidbuvayetsya nevidpovidnist to slovo mistit u sobi dostatno informaciyi dlya togo shob viznachiti de nastupne vhodzhennya mozhe pochatisya takim chinom propuskayuchi kilkarazovu perevirku poperedno porivnyanih simvoliv Algoritm sho vinajshli Donald Knut ta Von Pratt a takozh nezalezhno vid nih Dzhejms Morris opublikovano u spilnij statti u 1977 roci Chasova asimptotichna skladnist algoritmu stanovit O N M de N dovzhina slova W M dovzhina ryadka S Zmist 1 Teoriya 2 Algoritm KMP 2 1 Priklad algoritmu poshuku 2 2 Opis i psevdokod dlya algoritmu poshuku 2 3 Shvidkodiya algoritmu poshuku 3 Tablicya chastkovih zbigiv takozh vidoma yak funkciya nevdachi 3 1 Priklad roboti algoritmu pobudovi tablici 3 2 Opis i psevdokod algoritmu pobudovi tablici 3 3 Shvidkodiya algoritmu pobudovi tablici 4 Shvidkodiya algoritmu KMP 5 Vtilennya algoritmu 6 Posilannya 7 LiteraturaTeoriya red Algoritm povinen znajti pochatkovij indeks m ryadka W v ryadku S Najprostishij algoritm probigaye po vsomu ryadku S m de m indeks Yaksho indeks m dosyagne kincya ryadka to W ne znajdeno i algoritm poverne rezultat fail Na kozhnij poziciyi pereviryayetsya rivnist elementa na poziciyi m z S j elementa na pershij poziciyi z W tobto S m W 0 Yaksho voni rivni to algoritm pereviryaye nastupni vidpovidni elementi v ryadkah za indeksom i Algoritm pereviryaye vsi virazi S m i W i Yaksho vsi elementi z W znajdeni to algoritm poverne poziciyu m Zazvichaj probna perevirka shvidko vidkidaye mozhlivist zbigu Yaksho ryadki skladayutsya z rivnomirno rozpodilenih elementiv to shans sho pershi elementi dorivnyuyut odin odnomu bude 1 do 26 Otzhe v bilshosti vipadkiv probna perevirka vidkidatime pochatkovi elementi Shans sho pershi dva elementi budut rivnimi dorivnyuye 1 do 262 tobto 1 do 676 Tobto yaksho elementi rivnomirno rozpodileni ochikuvana skladnist poshuku v ryadku S dovzhini k bude poryadku k porivnyan abo O k Yaksho S maye 1 000 000 000 elementiv i W maye 1000 elementiv to poshuk ryadka zajme priblizno 1 000 000 000 porivnyan Prote ochikuvana produktivnist ne garantovana Yaksho ryadki ne vipadkovi to na kozhnomu kroci m mozhe znadobitisya bagato porivnyan U najgirshomu vipadku dva ryadki zbigayutsya majzhe za vsima literami Yaksho ryadok S maye 1 000 000 000 elementiv sho rivni A i ryadok W skladayetsya z 999 elementiv A i ostannij element B Todi najprostishij algoritm na kozhnomu kroci vikonuvatime 1000 perevirok a vsih perevirok bude 1 triljon Otzhe yaksho dovzhina W n to v najgirshomu vipadku skladnist stanovitime O k n Algoritm KMP maye krashij pokaznik shvidkodiyi v najgirshomu vipadku KMP vitrachaye nebagato chasu za poryadkom rozmiru W O n na poperednye obchislennya tablici i potim vikoristovuye tablicyu dlya shvidkogo poshuku ryadka za chas O k Z inshogo boku na vidminu vid poperedno rozglyanutogo prostogo algoritmu algoritm KMP vikoristovuye vidomosti pro poperedni porivnyannya U prikladi sho navedenij vishe koli KMP zustrichaye nezbig na 1000 nomu elementi i 999 tobto S m 999 W 999 KMP znatime sho 999 pozicij vzhe perevireno KMP mistit ci znannya u poperedno obchislenij tablici i dodatkovih zminnih Koli KMP znahodit nezbig z tablici viznachayetsya naskilki zbilshitsya zminna m Algoritm KMP red Priklad algoritmu poshuku red Dlya poyasnennya podrobic algoritmu opracyuyemo porivnyano shtuchnij perebig algoritmu U bud yakij moment algoritm perebuvaye v stani viznachenomu dvoma cilimi m poziciya v S pochatok spodivanogo zbigu dlya W i indeks potochnogo simvolu u W Na kozhnomu kroci algoritm porivnyuye S m i z W i i zbilshuye i yaksho voni odnakovi Ce mozhna pobachiti na pochatku nastupnogo poshuku 1 2 m 01234567890123456789012 S ABC ABCDAB ABCDABCDABDE W ABCD ABD i 0123456 Mi ruhayemos porivnyuyuchi nastupni simvoli W iz vidpovidnimi simvolami z S prosuvayuchis vid potochnogo do nastupnogo v vipadku zbigu Odnak na chetvertomu kroci mi otrimuyemo S 3 yak probil a W 3 D rozbizhnist Radshe nizh pochinati znov z S 1 mi zauvazhimo sho A ne zustrichayetsya mizh poziciyami 0 i 3 v S okrim yak v 0 vidpovidno perevirivshi vsi ci simvoli do cogo mi zanotuvali sho nemozhlivo znajti pochatok zbigu yaksho mi probizhimo yih znov Otzhe mi peresuvayemos na nastupnij simvol vstanovlyuyuchi m 4 i i 0 m napochatku prijmaye znachennya 3 bo m i T i 0 3 0 3 i todi staye 4 bo T 0 1 de T ce tablicya chastkovih zbigiv 1 2 m 01234567890123456789012 S ABC ABCDAB ABCDABCDABDE W ABCDABD i 0123456 Mi shvidko otrimuyemo majzhe povnij zbig ABCDAB azh yak u W 6 S 10 znov mayemo nevidpovidnist Odnak lish same pered zavershennyam potochnogo chastkovogo zbigu mi prominuli AB sho mozhe buti pochatkom novogo zbigu otzhe mayemo vzyati ce do uvagi Raz mi vzhe znayemo sho ci dva simvoli te sho nam potribno mi ne mayemo pereviryati yih znov mi prosto vstanovlyuyemo m 8 i 2 i prodovzhuyemo pereviryati potochnij simvol Takim chinom mi ne tilki opustili simvoli z S sho poperedno zbiglis ale j simvoli z W 1 2 m 01234567890123456789012 S ABC ABCDAB ABCDABCDABDE W ABC DABD i 0123456 Cej poshuk zaznaye nevdachi odrazu bo nash zrazok ne mistit probilu yak i za pershoyi sprobi mi povertayemos do pochatku W i pochinayemo poshuk na nastupnomu simvoli S m 11 vstanovivshi i 0 1 2 m 01234567890123456789012 S ABC ABCDAB ABCDABCDABDE W ABCDABD i 0123456 I znov mi vidrazu zh nashtovhuyemos na vidpovidnist ABCDAB ale nastupnij simvol C ne zbigayetsya z kincevim simvolom D slova W Yak i ranishe mi vstanovlyuyemo m 15 shob pochati z dvosimvolnogo ryadku AB sho vede do potochnoyi poziciyi vstanovlyuyemo i 2 i prodovzhuyemo zistavlyannya z potochnoyi poziciyi 1 2 m 01234567890123456789012 S ABC ABCDAB ABCDABCDABD E W ABCDABD i 0123456 Cogo razu mi mozhemo zavershiti zistavlyannya pershim simvolom yakogo ye S 15 Opis i psevdokod dlya algoritmu poshuku red Navedenij vishe priklad pokazuye vsi elementi algoritmu Narazi pripustimo nayavnist tablici chastkovih zbigiv T opisanoyi nizhche yaka pokazuye de mi mayemo pochati nove zistavlennya v razi nevdachi potochnogo Zapisi T utvoreni tak sho yaksho mayemo zbig vid S m sho zaznav nevdachi pri porivnyanni S m i z W i todi nastupnij mozhlivij zbig pochnetsya z indeksu m i T i v S T i ce kilkist povernen yaki mi mayemo zrobiti pislya nevdachi Ce maye dva naslidki pershij T 0 1 pokazuye sho yaksho W 0 ce ne zbig mi ne mozhemo povernutis i povinni prosto pereviriti nastupnij simvol i drugij hocha nastupnij mozhlivij zbig pochnetsya z indeksu m i T i yak u prikladi vishe mi ne mayemo naspravdi pereviryati bud yakij z simvoliv T i pislya cogo tak sho mi prodovzhuyemo poshuk z W T i Dali navoditsya priklad psevdokodu algoritmu poshuku KMP algoritm poshuk kmp vhid masiv simvoliv S tekst poshuku masiv simvoliv W shukane slovo vihid cile chislo bazovana na nuli poziciya v S v yakij znajdeno W viznachayemo zminni cile chislo m 0 pochatok potochnogo zbigu v S cile chislo i 0 poziciya potochnogo simvolu v W masiv cilih chisel T tablicya obchislena deinde doki m i mensha za dovzhinu S vikonuvati yaksho W i S m i yaksho i dorivnyuye dovzhina W 1 povernuti m nehaj i i 1 inakshe nehaj m m i T i yaksho T i bilsha nizh 1 nehaj i T i inakshe nehaj i 0 yaksho mi potrapili syudi poshuk v S zavershivsya nevdacheyu povernuti dovzhina S Shvidkodiya algoritmu poshuku red Pripuskayuchi isnuvannya tablici T poshukova skladova algoritmu KMP maye skladnist O k de k ce dovzhina S Za vinyatkom stalih vitrat na viklik funkciyi vsi obchislennya vikonuyutsya ciklom b while b mi virahuyemo granichnu kilkist iteracij ciklu dlya cogo mi spochatku zrobimo sposterezhennya pro prirodu T Za viznachennyam vona pobudovana tak sho yaksho chastkovij zbig sho pochavsya v S m provalivsya pid chas porivnyannya S m i z W i todi nastupnij mozhlivij zbig maye pochatis v S m i T i Nastupnij mozhlivij zbig mozhe trapitis lishe na bilshomu indeksi nizh m z cogo viplivaye shoT i lt i Znayuchi cej fakt pokazhemo sho cikl mozhe vikonatis ne bilshe 2k raziv Dlya kozhnoyi iteraciyi vikonuyetsya odna z dvoh gilok tila ciklu U pershij gilci bezumovno zbilshuyetsya i i ne zminyuyetsya m tak sho m i indeks simvolu S sho mi rozglyadayemo zbilshuyetsya Druga gilka dodaye i T i do m i yak mi bachili ce zavzhdi dodatne chislo Otzhe zbilshuyetsya pochatok potochnogo zbigu m Teper cikl zavershuyetsya yaksho m i k z togo sho kozhna gilka ciklu mozhe buti vidvidana ne bilsh nizh k raziv bo voni zbilshuyut vidpovidno abo m i abo m i m m i yaksho m k todi napevno m i k z togo sho vono zbilshuyetsya shonajbilshe na odinicyu kozhnogo razu mi mali mati m i k v yakijs moment u minulomu yakim bi sposobom mi ne prosuvalis Tak yak cikl vikonuyetsya ne bilshe nizh 2k raziv mi pokazali sho skladnist algoritmu poshuku O k Os inshij sposib rozglyadu chasu vikonannya Skazhimo mi pochinayemo zistavlyati W i S v poziciyah i ta p yaksho W isnuye yak pidryadok S v p todi W 0 do m S p do p m Za umovi uspihu W i S p i mi zbilshuyemo i na 1 i Pri nevdachi W i S p i vkazivnik u teksti ne zminyuyetsya a vkazivnik v shukanomu slovi vidkochuyetsya na pevnu kilkist simvoliv i T i de T ce tablicya perehodiv I mi namagayemosya zistaviti W T i z S p i Najbilshij vidkit obmezhenij i tobto dlya bud yakogo nezbigu mi mozhemo vidkotitis shonajbilshe na nash postup do nevdachi Zvidsi j viplivaye chas 2k Tablicya chastkovih zbigiv takozh vidoma yak funkciya nevdachi red Cil ciyeyi funkciyi dozvoliti algoritmu uniknuti perevirki kozhnogo simvolu S bilsh nizh odin raz Golovnim sposterezhennyam pro prirodu linijnogo poshuku sho dozvolyaye comu buti ce te sho v perevirenomu vidtinku golovnogo ryadku shodo pochatkovogo vidtinka zrazka mi tochno znayemo v yakih miscyah novij potencijnij zbig sho mig bi prodovzhitis do potochnoyi poziciyi mig bi pochinatis pered potochnoyu poziciyeyu Inakshe kazhuchi mi robimo pered poshuk zrazka i zbirayemo spisok usih mozhlivih pozicij vidstupu vidtinki vid yakih do potochnoyi poziciyi utvoryuyut chastkovi zbigi T i ce dovzhina najdovshogo mozhlivogo virnogo pochatkovogo segmentu W yakij takozh ye vidtinkom pidryadka sho zavershuyetsya v W i 1 Mi vikoristovuyemo domovlenist sho porozhnij ryadok maye dovzhinu 0 Cherez te sho nezbig na samomu pochatku algoritmu ce osoblivij vipadok ne isnuye mozhlivosti vidstupu mi vstanovlyuyemo T 0 1 yak pokazano vishe Priklad roboti algoritmu pobudovi tablici red Spochatku mi rozglyanemo priklad W ABCDABD Mi pobachimo sho vin podibnij do golovnogo poshuku j efektivnij z tih samih prichin Vstanovlyuyemo T 0 1 Dlya znahodzhennya T 1 mi mayemo viyaviti sufiks A yakij takozh ye prefiksom dlya W Ale takogo sufiksu ne isnuye otzhe T 1 0 Tak samo T 2 0 Prodovzhuyuchi z T 3 mi zauvazhuyemo nayavnist korotkogo shlyahu perevirki vsih sufiksiv pripustimo mi znajshli sufiks sho ye prefiksom i zavershuyetsya v W 2 z dovzhinoyu 2 najbilsha mozhliva todi jogo pershij simvol ye prefiksom prefiksu W tobto prefiksom sam po sobi i zavershuyetsya v W 1 a mi v vipadku T 2 vzhe viznachili sho ce nemozhlivo Otzhe na kozhnomu kroci treba pereviryati sufiksi dovzhini m 1 lishe yaksho bulo znajdeno sufiks dovzhini m na poperednomu kroci tobto T x m Zvidsi mi navit ne povinni rozglyadati pidryadki dovzhini 2 i yak i na poperednomu kroci yedina sproba z dovzhinoyu 1 zaznaye nevdachi tomu T 3 0 Mi perehodimo do nastupnogo W 4 A Ta sama logika pokazuye sho najdovshij pidryadok na yakij treba zvazhati maye dovzhinu 1 i hocha tut A spracovuye zgaduyemo sho mi shukayemo na segment sho zavershuyetsya do potochnogo simvolu zvidsi T 4 0 takozh Prosuvayemos do W 5 yakij ye B mi zastosovuyemo nastupnu logiku yaksho mi pered cim znajshli pidzrazok sho pochinayetsya pered poperednim simvolom W 4 sho trivaye do potochnogo W 5 todi zokrema vin mav bi mati virnij pochatkovij vidtinok sho zavershuyetsya v W 4 sho zaperechuyetsya faktom sho mi vzhe viyavili A yak yedinij virnij vidtinok sho zavershuyetsya v W 4 Z cogo viplivaye sho mi ne mayemo divitis do W 4 Otzhe T 5 1 Nareshti mi rozglyadayemo nastupnij simvol u vidtinku z pochatkom u W 4 A ce bude B vin zbigayetsya z W 5 Dali bilshe ti zh dovodi sho j ranishe kazhut sho mi ne povinni divitis pered W 4 dlya znahodzhennya vidtinku dlya W 6 i mi vstanovlyuyemo T 6 2 Otzhe mi ukladayemo taku tablicyu i 0 1 2 3 4 5 6W i A B C D A B DT i 1 0 0 0 0 1 2Inshij priklad cikavishij i skladnishij i 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3W i P A R T I C I P A T E I N P A R A C H U T ET i 1 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 1 2 3 0 0 0 0 0Opis i psevdokod algoritmu pobudovi tablici red Priklad vishe pokazuye zagalnu tehniku utvorennya tablici z najmenshimi vitratami Zagalnij princip poshuku bilsha chastina roboti vikonuyetsya do potochnogo kroku otzhe duzhe malo treba robiti dlya perehodu na nastupnij Malenkim uskladnennyam ye te sho logika virna v usomu ryadku daye nevirnij rezultat na pochatku Ce vimagaye deyakogo pochatkovogo kodu algoritm tablicya kmp vhid masiv simvoliv W slovo do rozboru masiv cilih T tablicya do napovnennya vihid nichogo ale pid chas diyi napovnyuyetsya tablicya viznachennya zminnih cile pos 2 potochna poziciya v T cile cnd 0 bazovanij na nuli indeks u W nastupnogo simvolu v potochnomu pidryadku kandidati pershi kilka znachen fiksovani i vidriznyayutsya vid zaproponovanih algoritmom nehaj T 0 1 T 1 0 doki pos menshe nizh dovzhina W vikonuvati pershij variant pidryadok prodovzhuyetsya yaksho W pos 1 W cnd nehaj cnd cnd 1 T pos cnd pos pos 1 drugij vipadok ne prodovzhuyetsya ale mi mozhemo vidstupiti inakshe yaksho cnd gt 0 nehaj cnd T cnd tretij vipadok mi vicherpali vsih kandidativ Zauvazhimo cnd 0 inakshe nehaj T pos 0 pos pos 1 Shvidkodiya algoritmu pobudovi tablici red Skladnist tablichnogo algoritmu dorivnyuye O n de n ce dovzhina W Za vinyatkom pochatkovogo nalashtuvannya vsya robota vikonuyetsya v cikli b while b otzhe dostatno pokazati sho cej cikl vikonuyetsya za chas O n chogo mi dosyagnemo cherez shozhi vivchennya znachen pos i pos cnd V pershij gilci pos cnd zberigayetsya bo pos i cnd zbilshuyutsya odnochasno ale zvisno pos zbilshilas V drugij gilci cnd zaminyayetsya na T cnd yak mi bachili vishe zavzhdi suvoro mensha nizh cnd otzhe zbilshuyetsya pos cnd V tretij gilci pos zbilshuyetsya a cnd ni otzhe pos i pos cnd zbilshuyutsya Z togo sho pos pos cnd otrimuyemo sho na kozhnomu kroci zbilshuyetsya abo pos abo nizhnya mezha dlya pos otzhe z togo sho algoritm zavershuyetsya za umovi pos n vin maye zavershitis ne piznishe 2n iteracij ciklu bo pos cnd pochinayetsya z 1 Znachit skladnist tablichnogo algoritmu stanovit O n Shvidkodiya algoritmu KMP red Cherez te sho dvi skladovi algoritmu mayut skladnosti vidpovidno O k i O n skladnist vsogo algoritmu stanovit O n k Skladnosti zalishayutsya nezminnimi popri te skilki zrazkiv sho povtoryuyutsya v W abo S Vtilennya algoritmu red s 0 for i 1 i lt m i while s gt 0 amp amp a i b s 1 s f s f funkciya nevdachi failure function if a i b s l s s 1 if s n return yes return no Posilannya red An explanation of the algorithm Arhivovano 16 sichnya 2021 u Wayback Machine Knuth Morris Pratt algorithm Arhivovano 25 sichnya 2021 u Wayback Machine Literatura red Donald Knuth James H Morris Jr Vaughan Pratt 1977 Fast pattern matching in strings SIAM Journal on Computing 6 2 323 350 Arhiv originalu za 4 sichnya 2010 Procitovano 15 zhovtnya 2006 Otrimano z https uk wikipedia org w index php title Algoritm Knuta Morrisa Pratta amp oldid 38153433