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

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

Автор оригинала: FreeCodeCapm Team.

Вступление

Слово TRIE – это прижигание слова «Re Trie val», потому что TRIE может найти одно слово в словаре только с префиксом слова.

TRIE – это эффективная структура данных извлечения данных. Использование TRIE, поисковые сложности могут быть доведены до оптимального предела, то есть длина строки.

Это мультипальная структура дерева, полезная для хранения струн на алфавите, когда мы храним их. Он использовался для хранения больших словарей английского языка, скажем, слов в программах проверки заклинаний. Однако наказание на попытках – это требования к хранению.

Что такое три?

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

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

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

Три, как правило, выглядит что-то подобное,

Это изображение TRIE, которое хранит слова {Ass Ass, Algo, все, также, дерево, 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-го индекса. Если персонаж, который вы ищете, указывает на Нет Это подразумевает слово не там в Три.

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

  • add_word (слово, значение)
  • search_word (слово)
  • delete_word (слово)

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

  • get_all_words ()
  • get_all_words_with_prefix (префикс)

Добавление слова в три

	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:])

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

Удаление данных, вам просто нужно изменить переменную Close_ не к Ложь Отказ Это не изменяет префиксы, но все равно удаляет смысл и существование слова из Три.

	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:])

Запустите код