Узел
type Trie struct {
next [26]*Trie
word bool
}
Массив быстрее map для фиксированного маленького алфавита.
Префиксное дерево обменивает память на быстрый поиск строк и префиксов.
Минимальный синтаксис, который понадобится в решении.
type Trie struct {
next [26]*Trie
word bool
}
Массив быстрее map для фиксированного маленького алфавита.
index := word[i] - 'a'
Результат byte подходит как индекс массива.
Три идиоматичных решения на Go с оценкой времени и памяти.
Создаём отсутствующие рёбра.
O(length) time · O(length) spacefunc (t *Trie) Insert(word string) {
node := t
for i := range word {
index := word[i]-'a'
if node.next[index] == nil { node.next[index] = &Trie{} }
node = node.next[index]
}
node.word = true
}
Проходим по тем же рёбрам без проверки word.
O(length) time · O(1) spacefunc (t *Trie) StartsWith(prefix string) bool {
node := t
for i := range prefix {
node = node.next[prefix[i]-'a']
if node == nil { return false }
}
return true
}
После прохода по рёбрам дополнительно проверяем терминальный флаг.
O(length) time · O(1) spacefunc (t *Trie) Search(word string) bool {
node := t
for i := range word {
node = node.next[word[i]-'a']
if node == nil { return false }
}
return node.word
}