(Не)чёткий поиск, Александр Зайцев
В Boost.Algorithm мы имеем методы для точного поиска паттерна в строке (даже в С++17 есть), но вот когда нам нужен поиск с допуском ошибок, начинаются некоторые проблемы. Я расскажу вам, какие проблемы есть и как они решаются.
4. 4 / 15
Когда нужно?
●
Когда нам особо нет разницы, что искать :-)
●
Когда мы сами не знаем, что хотим
●
Когда нам нужно найти все вещи, как-то
похожие на то, что ищем
●
(Наш случай) Никогда-нибудь.
Истинная причина
●
P.S. Boost резиновый — пригодится всё!
5. 5 / 15
А как вы делаете ЭТО сейчас?
●
Я таким не занимаюсь!
●
Перебираю все возможные варианты и
пускаю std::fnd от std::begin(str) до пОБЕДы
●
Ну… я пойду искать готовые решения...
6. 6 / 15
Не всё так просто...
●
seqan
●
agrep
●
Случайные исходники в Интернете
●
Исходники с университетов
●
Написать самому
7. 7 / 15
Не всё так просто(2)...
●
Seqan большой
●
agrep ужасен
●
Исходники в Интернете слишком случайны,
чтобы на них надеяться
●
Про код из университета мы просто помолчим
8. 8 / 15
Сложность самой задачи
●
Алгоритмы сложнее, чем для чёткого поиска
●
Оптимизация крайне сложна
●
Литературы и готовых решений мало
●
А если и есть, то многие алгоритмы
бесполезны
9. 9 / 15
Online vs Ofine
Online Offline
Без препроцессинга (почти) С препроцессингом
Преимущественно одноразовый поиск Подходят для многократного поиска
«Простые» поисковые алгоритмы без
сложного сохранения состояния
Сложные системы, строящие индексы
для ускорения поиска
Agrep, Bitap, Wu-Manber, Pexact, Myers,
etc.
Суффиксные деревья, метрические
деревья, N-grams
11. 11 / 15
Почему самому писать не
лучшее решение
●
Лень
●
Некогда
●
Надо думать
●
Получится с багами
●
Получится медленно
●
Получится быстро, но с багами
●
Работает только для частного случая
●
Всё ок — ура, я написал agrep! (нет, не ура)
12. 12 / 15
Спектр работ
●
Ищем только одно вхождение или сразу все?
●
Ищем только по одному паттерну или нет?
●
А какие размеры строк?
●
А какой размер алфавита?
●
А можно распараллелить?
●
А ускоряется оно всякими SIMD?
●
И т.д.
13. 13 / 15
При чём здесь Boost
●
При том, что в Boost этого всего нет
●
Но оно может появится, если повезёт :-)
14. 14 / 15
Что же делать?
●
Sphinx, Lucene, Elasticsearch
●
Встроенные в БД и плагины для БД
●
Seqan
●
?