Рубрики
Без рубрики

Реализация структуры данных TRIE в Python

Структура данных TRIE очень эффективна, когда речь идет о получении информации. Он используется в реализации словари и телефонных книг.

Автор оригинала: Pankaj Kumar.

Реализация структуры данных TRIE в Python

Структура данных TRIE очень эффективна, когда речь идет о получении информации. Он используется в реализации словари и телефонных книг.

Это также полезно для реализации автоматически текстовых предложений, которые вы видите, набрав на клавиатуре.

В этом руководстве мы поймем, как реализовать нашу собственную структуру данных TRIE в Python.

В этом руководстве вы узнаете следующее:

  • Как реализовать собственную реализацию для структуры данных TRIE.
  • Как сделать вставки в структуру данных TRIE.
  • Как запросить слова в структуре данных TRIE.

Реализация трехслойного класса

Давайте начнем с написания кода для Триен класс Отказ Каждый узел TRIE должен иметь следующие поля:

  1. Характер
  2. Список детей
  3. Логин, который говорит, заканчивается ли слово на этом узле.

Давайте напишем код для нашего трехлетнего класса:

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, как выполнить вставки и как запросить слова в Три.