Trie – это специальная структура данных, в которой мы храним буквы строки. Это очень полезно для поиска самого длинного префикса, самой длинной длины префикса, поиска определенной строки, поиска самого длинного слова в словаре, а также для системы автозаполнения.
Мы можем структурировать нашу пробу в зависимости от наших потребностей. Обычно у нас может быть символ ch
, обозначающий символ, Конец слова
, который обозначает при вставке слова, достигли ли мы конца или нет, Триенод [] Триенод[26]
, который действует как указатель, указывающий на индекс буквы, которую мы вставили.
class TrieNode { char ch; TrieNode [] array = new TrieNode[26]; int wordEnd = 0; }
Таким образом, у каждого узла trie есть символ, конец слова и массив для указания на вставленные буквы.
Мы можем выполнять операции вставки, поиска и многое другое с помощью trie.
В операции вставки мы начинаем с создания корневого узла, в котором есть слово и значение 0, в нем нет определенного символа и массива TrieNode.
Итак, предположим, что мы вставляем строку, скажем s
. Мы выполняем следующие действия:
Начиная с корня, мы проверяем индекс
a
, который можно найти с помощью'a' -
. Сначала мы проверяем, является ли массив[0] нулевым или нет. Здесь массив[0] равен нулю, поэтому из 0-го индекса в корне мы создаем новый тринод с новым символом, содержащимa
, так как строка, которую мы должны вставить, не закончена, и массив указателей. Теперь мы переходим к узлу а.Далее мы должны вставить
b
и на этот раз мы начинаем со следующего узла, то есть с узлаa
. Так же, как и выше, мы находим правильный индекс дляb
используя'b' -
. Здесь мы проверяем, равен ли массив[1] нулю или нет, если он равен нулю, то создается новый узел дляb
создается, как указано выше, с соответствующим полем, в противном случае это означает, что мы уже вставилиb
и мы переходим к следующему узлу. В нашем примереазбука
, новый узел дляb
будет создан. Теперь мы переходим к узлу b. Примечание : Конец слова по-прежнему будет равен 0, так как мы еще не закончили с нашим сильным.Далее мы вставляем
c
путем нахождения индекса'c' -
. Мы проверяем, является ли массив[2] нулевым или нет, здесь он будет нулевым, поэтому дляc
узла будет сгенерирован новый узел. Здесь мы закончили со строкой, поэтому конечное значение слова будет обновлено доwordEnd + 1
.
Давайте продолжим вставлять другую строку s
Здесь мы снова начинаем с корня и находим индекс для первого символа, то есть здесь, который
' a' -
. Итак, здесь массив[0] не равен нулю, так как мы уже вставляли его ранее, поэтому мы переходим к узлуa
без создания нового узла.Далее мы должны вставить
b
. Нахождение индекса дляb
, который равен'b' -
. Здесь также, когда мы проверяем массив [1] нулевой или нет из узла a, мы видим, что он уже вставлен, поэтому, не создавая новый узел, мы переходим к узлу b.Следующий символ –
d
и мы находим индекс дляd
, который равен'd' -
. Если мы проверим массив[3], мы увидим, что он равен нулю, и поэтому дляd создается новый узел
. Посколькуd
является последним символом строки, мы увеличиваемконец слова
доКонец слова + 1
, чтобы указать, что мы закончили со строкойabd
.
Давайте вставим еще одну строку s
.
То же, что и в описанной выше процедуре, давайте сделаем это еще раз.
Начните с корня, найдите индекс первого символа
b
который'b' -
и его значение в массиве[1] равно нулю, поэтому создается новый узел для b, и мы переходим к узлу b.Следующий символ –
c
и его индекс ='c' -
. Из узла b, если мы ищем значение массива[2], мы получаем, что оно равно нулю, и мы создаем новый узел дляc
и продолжаем с этим узлом.Следующий символ –
d
и его индекс ='d' -
. Из узла c, если мы ищем значение массива[3], мы получаем, что оно равно нулю, и создается новый узел. Поскольку d является последним символом строки, мы увеличиваем слово И наКонец слова + 1
.
Окончательная структура trie после этих вставок будет:
O(количество слов * максимальная Длина Слова)
O(количество слов * максимальная Длина Слова)
class TrieNode { char ch; TrieNode [] array = new TrieNode[26]; int wordEnd = 0; } public class Trie { TrieNode root = null; public Trie() { root = new TrieNode(); } public void insert(String word) { TrieNode node = root; for (char ch : word.toCharArray()) { int index = ch - 'a'; if (node.array[index] == null) { node.array[index] = new TrieNode(); node.array[index].ch = ch; node.array[index].wordEnd = 0; } node = node.array[index]; } node.wordEnd += 1; } public static void main(String [] args) { Trie trie = new Trie(); String a = "abc"; String b = "abd"; String c = "bcd"; trie.insert(a); trie.insert(b); trie.insert(c); } }
Rohith v 07/LeetCode Топ-интервьювопросы
Leetcode Лучшие вопросы для интервью, обсуждаемые в Leetcode. Leetcode Лучшие вопросы для интервью, обсуждаемые в Leetcode.
Leetcode Лучшие вопросы для интервью, обсуждаемые в Leetcode. Leetcode Лучшие вопросы для интервью, обсуждаемые в Leetcode.
Также ответ на вопрос от CodeSignal.com: https://app.codesignal.com/
Rohithv07/Код доступа
Проблемы с кодом, которые решены.
Проблемы с кодом, которые решены.
Это видео – отличный повод узнать о три.
Оригинал: “https://dev.to/rohithv07/trie-data-structure-insert-operation-253g”