Придумал очень красивую штуку, чисто программистскую, остальным будет неинтересно.
Каждому программисту известно, что такое регулярные выражения. Каждому человеку, прошедшему базовый курс CS, известно, что базовые регулярные выражения (без backtracking-а)
хорошо моделируются недетерминированными конечными автоматамиВ интересах этой записи
(
Read more... )
Comments 24
(только ссылка из второго абзаца в хроме/фф не открывается. открывается вот такая https://swtch.com/~rsc/regexp/regexp1.html)
Reply
Reply
наверное да, но я не понимаю, откуда оценка сложности: путей-то в графе много, намного больше, чем вершин.
допустим, мы матчим через НКА, он помнит, в каком месте регэкспа мы находимся (все варианты сразу). Но нам же нужно будет столько разных НКА, сколько у нас получается путей? Плюс, если у нас путь может содержать повторы, то и длина пути может оказаться больше, чем количество вершин?
А*, насколько я помню, требует эвристику, а так же известные начало и конец. Тут же задача явно сформулирована более общё. Например, регэксп может начинаться с .*, и мы сразу получаем все пути, какие есть.
Reply
Что мне мешает поверить: в Дейсктре нам не важно, как мы пришли в вершину, нам важна только стоимость. А тут два разных путя могут привести нас в разные состояния регэкспа, и их так просто не схлопнешь, выбрав лучший. И таким образом Дейкстра отсекает много переборных вариантов. А тут так вот сходу не получается. Но может это можно как-то умно обойти...
Reply
Сначала алгоритм узнаёт, что начальная вершина достижима в стартовом состоянии. Каждый раз, устанавливая факт "оказывается, вершина V достижима в новом состоянии S", он исследует следствия из этого знания для ее ближайших соседей; если он уже знал, что пара (V,S) достижима, то ничего делать не нужно. Таким образом каждую вершину V надо посетить не более |S| раз.
Reply
Состояния вершин может меняться не более чем n раз, значит для каждой вершины получаем n * степень. Сумма по всем вершинам это что-то типа 2nE, где E это количество ребер, а 2 если ребра ненаправленные.
Да, это гораздо лучше, чем я подумал. Круто!
Reply
У меня во всяком случае прямо из поста не открывается.
Reply
У вас есть проблема. Вы решили ее регулярными выражениями. Теперь у вас две проблемы.
Reply
Reply
Reply
Reply
(можно заменить ? на * - будет корректно, но некрасиво)
Reply
Reply
Leave a comment