Автор оригинала: Pankaj Kumar.
Реализация структуры данных TRIE в Python
Структура данных TRIE очень эффективна, когда речь идет о получении информации. Он используется в реализации словари и телефонных книг.
Это также полезно для реализации автоматически текстовых предложений, которые вы видите, набрав на клавиатуре.
В этом руководстве мы поймем, как реализовать нашу собственную структуру данных TRIE в Python.
В этом руководстве вы узнаете следующее:
- Как реализовать собственную реализацию для структуры данных TRIE.
- Как сделать вставки в структуру данных TRIE.
- Как запросить слова в структуре данных TRIE.
Реализация трехслойного класса
Давайте начнем с написания кода для Триен класс Отказ Каждый узел TRIE должен иметь следующие поля:
- Характер
- Список детей
- Логин, который говорит, заканчивается ли слово на этом узле.
Давайте напишем код для нашего трехлетнего класса:
class TrieNode: def __init__(self, char): self.char = char self.is_end = False self.children = {}
Принимая инициализацию тринадцатого года, нам нужно предоставить символ.
.is_end отмечает, заканчивается ли слово на текущем узле или нет. Он установлен на ложь по умолчанию.
Написание класса структуры данных TRIE
Давайте перейдем к записи кода для нашего класса TRIE.
Чтобы инициализировать TRIE, нам нужно инициализировать узел TRIE и предоставить методы для вставки и поиска в TRIE.
class Trie(object): def __init__(self): self.root = TrieNode("")
Эта часть заботится о инициализации пустого трина.
Как выполнить вставки в нашу TRIE?
Давайте посмотрим на то, как вставки случаются в структуре данных TRIE.
Чтобы сделать вставку, нам нужно пройти слово для вставления символа по символу.
Одновременно нам нужно перейти по TRIE из корня и посмотреть, есть ли список детей, что имеет этот характер. В случае, если персонаж нет, то нам нужно сделать новый тринод с этим символом и добавить его в список детей.
Когда мы достигаем конца слова, нам нужно установить Is_end true для узла, соответствующего последнему характеру слова.
Вот реализация подхода, обсуждаемого выше.
def insert(self, word): node = self.root #traverse the word character by character for char in word: #check if the character is there in the list of children if char in node.children: node = node.children[char] else: # else make a new TrieNode corresponding to that character new_node = TrieNode(char) # add the new node to the list of children node.children[char] = new_node node = new_node #after traversig the word set .is_end to true for the last #char node.is_end = True
Это позаботится обо всех наших вставках.
Рассмотрим TRIE со следующими словами:
- Здесь
- Слышать
- Ее
- Он
- Привет
- Как
TRIE, соответствующий этим словам, будет выглядеть:
Здесь Зеленые узлы соответствовать IS_END Быть правдой Для этого узла.
Как искать в нашем Три?
Теперь давайте посмотрим, как искать слова в нашем Три. Мы не хотим выполнять точное совпадение для поиска. Скорее, что мы хотим, это получить список слов, начинающихся со строки, которую мы ищем.
При поиске мы предоставим только префикс, и функция поиска должна быть в состоянии вернуть все слова, начинающиеся с этого префикса.
Например, если мы ищем «Он» Мы должны получить следующие слова.
- Он
- Здесь
- Слышать
- Ее
- Привет
Это слова, которые начинаются с «он». Этот аспект TRIE делает его полезным для внедрения автоматического завершения на клавиатуре.
При поиске слова, которые мы ищем в моде DFS. Поэтому нам нужно написать функцию для выполнения поиска DFS в нашем TRIE.
def dfs(self, node, pre): if node.is_end: self.output.append((pre + node.char)) for child in node.children.values(): self.dfs(child, pre + node.char)
Призывая функцию, нам нужно пройти узел, и префикс ищите до сих пор. Всякий раз, когда поиск достигает узла с Is_end как правда Он добавляет слово в список выходных.
В противном случае он продолжает поискать среди детей в моде DFS.
Функция поиска выглядит следующим образом:
def search(self, x): node = self.root # traverse the search query and move down the trie for char in x: if char in node.children: node = node.children[char] else: #if query doesn't match the nodes in trie return [] self.output = [] #call DFS self.dfs(node, x[:-1]) return self.output
При поиске мы проходим через поисковый запрос и переместите TRIE одновременно.
Затем мы называем DFS на узле, соответствующем последним символам запроса.
Функция DFS затем перемещается с этого последнего символа и добавляет все полные слова в наш выходной список.
Полный код
Полный код этого руководства приведен ниже:
class TrieNode: def __init__(self, char): self.char = char self.is_end = False self.children = {} class Trie(object): def __init__(self): self.root = TrieNode("") def insert(self, word): node = self.root for char in word: if char in node.children: node = node.children[char] else: new_node = TrieNode(char) node.children[char] = new_node node = new_node node.is_end = True def dfs(self, node, pre): if node.is_end: self.output.append((pre + node.char)) for child in node.children.values(): self.dfs(child, pre + node.char) def search(self, x): node = self.root for char in x: if char in node.children: node = node.children[char] else: return [] self.output = [] self.dfs(node, x[:-1]) return self.output
Три в действии
Давайте попробуем добавлять несколько слов в TRIE и сделать поисковый запрос.
tr = Trie() tr.insert("here") tr.insert("hear") tr.insert("he") tr.insert("hello") tr.insert("how ") tr.insert("her")
Это сделает TRIE и добавить эти пять слов к нему.
Теперь мы можем сделать запрос, используя следующую строку:
tr.search("he")
Выход:
['he', 'her', 'here', 'hear', 'hello']
Давайте сделаем еще один запрос:
tr.search("her")
Выход:
['her', 'here']
Заключение
Это руководство покрыло реализацию для структуры данных TRIE в Python. Мы узнали, как сделать класс TRIE, как выполнить вставки и как запросить слова в Три.