Я не знаю, стоит ли спрашивать об алгоритмах. Но посмотрим, получаю ли я ответы...:)
Если что-то неясно, я очень рад прояснить ситуацию.
Я только что реализовал Trie в python. Однако один бит казался более сложным, чем следовало бы (как человек, который любит простоту). Возможно, у кого-то была аналогичная проблема?
Моя цель заключалась в том, чтобы свести к минимуму количество узлов, сохранив в своем корне самый большой общий префикс субтри. Например, если бы у нас были слова stackoverflow, stackbase и на основе стека, тогда дерево выглядело бы примерно так:
[s]tack
[o]verflow ______/ \_______ [b]ase
\___ [d]
Обратите внимание, что все еще можно думать о ребрах, имеющих один символ (первый из дочерних элементов node).
Найти-запрос прост в реализации. Вставка не сложна, но несколько сложнее, чем я хочу.: (
Моя идея заключалась в том, чтобы вставлять ключи один за другим (начиная с пустого trie), сначала ищем вставленный ключ k (Find (k)), а затем переставляя/разбивая узлы локально на место, где процедура поиска останавливается. Там оказалось 4 случая: (Пусть k - ключ, который мы хотим вставить, а k '- ключ node, где поиск закончился)
- k совпадает с k '
- k - "правильный" префикс k '
- k 'является "правильным" префиксом k
- k и k 'используют общий префикс, но ни один из случаев (1), (2) или (3) не встречается.
Кажется, что каждый из случаев уникален и, следовательно, подразумевает различные модификации Trie. НО: это действительно так сложно? Я что-то упускаю? Есть ли лучший подход?
Спасибо:)