Барлык рекекс матчларын табу һәрвакыт O (n²) булды | Mewayz Blog Skip to main content
Hacker News

Барлык рекекс матчларын табу һәрвакыт O (n²) булды

Аңлатмалар

1 min read Via iev.ee

Mewayz Team

Editorial Team

Hacker News

ternрнәк туры килүнең яшерен бәясе

Төзүчеләр өчен регуляр сүзләр (рекекс) - алыштыргысыз корал, тексттан мәгълүматны анализлау, раслау һәм алу өчен Швейцария Армиясе пычакы. Электрон почта форматларын тикшерүдән алып, бүрәнәләрдән алынган мәгълүматларга кадәр, regex - чишелеш. Ләкин, бу көчле фасад астында дистә еллар дәвамында системаларны җәберләгән эш тозагы ята: барлык матчларны тезмәдә табуның иң начар вакыты O (n²). Бу квадрат вакыт катлаулылыгы, кертү сызыгы сызыклы үсә барган саен, эшкәртү вакыты тиз арада үсә ала, көтелмәгән акрынлыкка, ресурсларның бетүенә һәм ReDoS дип аталган феноменга китерә (Хезмәтне регуляр белдерүдән баш тарту). Бу хас булган чикләнүне аңлау тагын да ныграк һәм эффектив кушымталар төзү өчен беренче адым.

Ни өчен Regex O (n²) белән туры килә? Артка эзләү проблемасы

O (n²) катлаулылыгының тамыры күпчелек традицион рекс двигательләр кулланган механизмда: артка кайту. Релекс двигателе, Перл, Питон яки Явадагы кебек, барлык мөмкин матчларны табарга тырышканда, ул бер тапкыр гына сканерламый. Төрле юлларны барлый. "(A +) + b" кебек гади үрнәкне карап чыгыйк, күбесенчә "a" тезмәсенә кулланылган, "aaaaaaaaac" кебек. Двигатель комсызлык белән барлык "a" ларны беренче "a +" белән туры китерә, аннары "b" финалына туры килергә тырыша. Ул уңышсызлыкка ирешкәч, артка кайта - соңгы "а" белән чагыштырмый һәм тышкы төркемдә "+" санын сынап карый. Бу процесс кабатлана, двигательне "a" ларның ничек төркемләнергә мөмкинлеген берләштерергә тырышырга мәҗбүр итә, бу комбинатор шартлау шартларына китерә. Двигатель тикшерергә тиеш юллар саны озынлык квадратына пропорциональ булырга мөмкин, димәк O (n²).