Как узнать
много слов и вопросы про их начала: есть ли слово или префикс, автодополнение, слово с буквами-джокерами или поиск многих слов в одной сетке.
Как решать такие задачи
- Заведи узел: потомки по буквам (словарь или массив из 26) и флаг конца слова.
- Вставка: иди от корня, добавляй недостающего потомка для каждой буквы, последний узел отметь как конец.
- Поиск: иди так же и останавливайся на отсутствующей букве. Слову нужна отметка конца, префиксу — нет.
- Если в сетке нужно найти много слов, иди по дереву и по сетке вместе: любой префикс, который никуда не ведёт, сразу обрывает поиск.
Вариант: Поиск с «.»
То же, но в шаблоне есть «.», которая означает любую букву. Обычная буква ведёт в одну ветку, а точка — во все, поэтому на точке пробуем каждую ветку по очереди.
- Напиши match(node, i): подходит ли остаток шаблона начиная с i к чему-то под этим узлом?
- База: когда шаблон кончился, на узле должна стоять отметка конца слова.
- Обычная буква: иди в этого потомка или верни false, если его нет.
- Джокер: вызови match для каждого потомка и верни true, как только кто-то из них вернёт true.
Где встречается
- Маршрутизация. Ядро Linux решает, куда отправить пакет, по префиксному дереву IP-адресов (fib_trie): идёт по битам адреса и находит самый длинный подходящий префикс.
- Веб-фреймворки. Роутеры httprouter и Gin на Go хранят адреса страниц вроде /users/:id в префиксном дереве, поэтому нужный обработчик находится за длину адреса, сколько бы маршрутов ни было.
- Redis. Redis хранит потоки (Streams) в сжатом префиксном дереве rax.