Изменить: 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