freeCodeCamp/guide/russian/miscellaneous/data-structure-trie/index.md

7.1 KiB
Raw Blame History

title localeTitle
Data Structure Trie Структура данных Trie

Введение в Trie

Слово trie - это нагнетание слова «re trie val», потому что trie может найти единственное слово в словаре только с префиксом слова.
Trie - эффективная структура данных извлечения данных, используя trie, сложности поиска можно довести до оптимального предела, то есть длины строки.
Это многоуровневая древовидная структура, полезная для хранения строк над алфавитом, когда мы их храним.
Он использовался для хранения больших словарей английского языка, например, слов в программах проверки орфографии.
Тем не менее, штраф за попытки - это требование хранения.

Что такое trie?

Три - это дерево, подобное структуре данных, в которой хранятся строки, и вы можете найти данные, связанные с этой строкой, используя префикс строки.
Например, скажем, вы планируете создавать словарь для хранения строк вместе со своими значениями. Вам должно быть интересно, почему я не могу просто использовать хеш-таблицу, чтобы получить информацию.
Да, вы, очевидно, можете получить информацию, используя хеш-таблицу, но хэш-таблицы могут найти только данные, где строка точно совпадает с той, которую мы добавили. Но trie даст нам возможность находить строки с общими префиксами, отсутствующим персонажем и т. Д. В меньшем времени, по сравнению с хэш-таблицей.
Обычно это трюк, выглядит примерно так:

Trie

Это образ Trie, в котором хранятся слова {assoc, algo, all, also, tree, trie}.

Как реализовать trie?

Давайте реализуем trie в python, для хранения слов с их значениями из английского словаря.

ALPHABET_SIZE = 26 # For English 
 
 class TrieNode: 
    def __init__(self): 
        self.edges = [None]*(ALPHABET_SIZE) # Each index respective to each character. 
        self.meaning = None # Meaning of the word. 
        self.ends_here = False # Tells us if the word ends here. 

Как вы можете видеть, ребра имеют длину 26, каждый индекс относится к каждому символу в алфавите. 'A', соответствующий 0, 'B', 1, C ', 2 ...' Z ', 25-й индекс. Если персонаж, которого вы ищете, указывает на None , это означает, что в trie слово отсутствует.

Типичный Trie должен реализовывать по крайней мере эти две функции:

  • add_word(word,meaning)
  • search_word(word)
  • delete_word(word)

Кроме того, можно добавить что-то вроде

  • get_all_words()
  • get_all_words_with_prefix(prefix)

Добавление слова в trie

    def add_word(self,word,meaning): 
        if len(word)==0: 
            self.ends_here = True # Because we have reached the end of the word 
            self.meaning = meaning # Adding the meaning to that node 
            return 
        ch = word[0] # First character 
        # ASCII value of the first character (minus) the ASCII value of 'a'-> the first character of our ALPHABET gives us the index of the edge we have to look up. 
        index = ord(ch) - ord('a') 
        if self.edges[index] == None: 
            # This implies that there's no prefix with this character yet. 
            new_node = TrieNode() 
            self.edges[index] = new_node 
 
        self.edges[index].add(word[1:],meaning) #Adding the remaining word 

Извлечение данных

    def search_word(self,word): 
        if len(word)==0: 
            if self.ends_here: 
                return True 
            else: 
                return "Word doesn't exist in the Trie" 
        ch = word[0] 
        index = ord(ch)-ord('a') 
        if self.edge[index]== None: 
            return False 
        else: 
            return self.edge[index].search_word(word[1:]) 

Функция search_word скажет нам, существует ли слово в Trie или нет. Поскольку наш словарь - это словарь, нам нужно также получить значение, теперь давайте объявим функцию для этого.

    def get_meaning(self,word): 
        if len(word)==0 : 
            if self.ends_here: 
                return self.meaning 
            else: 
                return "Word doesn't exist in the Trie" 
        ch = word[0] 
        index = ord(ch) - ord('a') 
        if self.edges[index] == None: 
            return "Word doesn't exist in the Trie" 
        else: 
            return self.edges[index].get_meaning(word[1:]) 

Удаление данных

Удалив данные, вам просто нужно изменить переменную ends_here на False . Выполнение этого не изменяет префиксы, но все же удаляет смысл и существование слова из trie.

    def delete_word(self,word): 
        if len(word)==0: 
            if self.ends_here: 
                self.ends_here = False 
                self.meaning = None 
                return "Deleted" 
            else: 
                return "Word doesn't exist in the Trie" 
        ch = word[0] 
        index = ord(ch) - ord('a') 
        if self.edges[index] == None: 
            return "Word doesn't exist in the Trie" 
        else: 
            return self.edges[index].delete_word(word[1:]) 

:rocket: Код запуска

Ресурсы

  • Для дальнейшего чтения вы можете попробовать этот учебник topcoder .
  • Кроме того, учебник от geeksforgeeks