catpad: (Default)
[personal profile] catpad

Задача пришла из жизни. Это не просто упражнение, а совершенно реальная задача, которую мне необходимо решить на работе. Я её решил, но, может быть, кто-то придумает лучше.


Дано множество строк, например:

voda
eric
nec

и так далее - размер множества любой.
На входе алгоритм получает произвольную строку, например: "vodafone.com".
Как наиболее быстрым способом определить, что эта строка содержит в качестве подстроки (substring) одну из данного множества ?
(В приведённом примере ответ положительный, потому что "voda" - это подстрока "vodafone.com").

Задача простая, но ключевые слова здесь, конечно - "наиболее быстро".
Я придумал как это сделать почти за линейное время. "Почти" в смысле, что я не очень хорошо помню, что такое "amortized complexity", но, кажется, получается как раз O(n).
Завтра опубликую ответ, но хотелось бы посмотреть на разные предложения.

Date: 2005-12-01 10:24 am (UTC)
From: [identity profile] potan.livejournal.com
Констнантные для произвольного регуляра? А если он сравним по объему со всем текстом.
Кроме того, для одной строки известны алгоритмы, которые ищут ее быстрее, чем если ее интерпретировать как регулярное выражение (они заглядывают вперед, и смотрят на сколько символов надо сместиться - получается в константу, зависящую от длины искомой строки, раз быстрее). Эти алгоритмы должны обобщаться и на регулярные выражения, но мне такие не известны.

Date: 2005-12-01 10:30 am (UTC)
From: [identity profile] elephantum.livejournal.com
я не говорил про произвольный регуляр. вид регуляра я задал в своем посте. вообще регуляр я вспомнил только потому что NDFSM рисовать лень было.
Page generated Feb. 6th, 2026 10:39 pm
Powered by Dreamwidth Studios