Изменить: WHOOPS! Большое допущение я испортил определение синтаксиса шаблона ?
in fnmatch
и, похоже, предложил (и, возможно, решил) гораздо более сложную проблему, когда он ведет себя как .?
в регулярных выражениях. Конечно, на самом деле он должен вести себя как .
в регулярных выражениях (сопоставление ровно одного символа, а не нуля или одного). Это, в свою очередь, означает, что моя первоначальная работа по сокращению проблем была достаточной для решения (теперь довольно скучной) оригинальной проблемы. Однако решение более сложной проблемы довольно интересно; Я мог бы написать это когда-нибудь.
С положительной стороны это означает, что существует гораздо больший шанс, что что-то вроде факуляции иглы 2way/SMOA может быть применимо к этим шаблонам, что, в свою очередь, может привести к желаемому O(n)
или даже производительность.
В заголовке вопроса пусть m
- длина рисунка/иглы, а n
- длина строки, сопоставляемой с ней.
Этот вопрос представляет интерес для меня, потому что все алгоритмы, которые я видел/использовали, имеют либо патологически плохую производительность, либо возможные переполнения из-за обратного отслеживания или требуемое распределение динамической памяти (например, для подхода DFA или просто избегая выполнения обратного отслеживания в стеке вызовов) и, следовательно, имеют случаи сбоя, которые также могут быть опасны, если программа использует fnmatch
для предоставления/запрета доступа к каким-либо правам.
Я готов поверить, что такой алгоритм не существует для соответствия регулярных выражений, но язык шаблонов имен файлов намного проще, чем регулярные выражения. Я уже упростил проблему до такой степени, что можно предположить, что шаблон не использует символ *
, и в этой модифицированной задаче вы не согласуете всю строку, но ищете вхождение шаблона в строку ( как проблема соответствия подстроки). Если вы еще больше упростите язык и удалите символ ?
, язык будет состоять только из конкатенаций фиксированных строк и выражений скобок, и это можно легко сопоставить в O(mn)
времени и O (1) пространстве, что, возможно, может быть улучшено до O(n)
, если методы факторизации иглы, используемые в поиске подстроки 2way и SMOA, могут быть расширены до таких шаблонов скобок. Однако наивно каждый ?
требует испытаний с или без ?
, потребляющих символ, в результате чего коэффициент времени 2^q
, где q
- количество символов ?
в шаблоне.
Кто-нибудь знает, была ли эта проблема уже решена или есть идеи для ее решения?
Примечание. При определении пространства O (1) я использую Transdichotomous_model.
Примечание 2: Этот сайт содержит подробную информацию о алгоритмах 2way и SMOA, на которые я ссылался: http://www-igm.univ-mlv.fr/~lecroq/string/index.html