Префиксные деревья, также известные как три, представляют собой мощную структуру данных, которая позволяет эффективно хранить и обрабатывать набор строк. Они особенно полезны для задач, связанных с автозаполнением, поиском по префиксу и хранением словарей. В этой статье мы рассмотрим, как реализовать префиксное дерево на языке Ruby, а также обсудим его основные операции и преимущества.
Префиксное дерево — это древовидная структура данных, в которой каждый узел представляет собой символ строки. Корень дерева представляет пустую строку, а каждый путь от корня к листу представляет собой строку из набора. Префиксные деревья позволяют быстро выполнять операции вставки, поиска и удаления строк.
Теперь давайте перейдем к реализации префиксного дерева на Ruby. Мы создадим класс `Trie`, который будет содержать методы для вставки, поиска и удаления строк.
class TrieNode attr_accessor :children, :is_end_of_word def initialize @children = {} @is_end_of_word = false end end class Trie def initialize @root = TrieNode.new end def insert(word) node = @root word.each_char do |char| node.children[char] ||= TrieNode.new node = node.children[char] end node.is_end_of_word = true end def search(word) node = @root word.each_char do |char| return false unless node.children[char] node = node.children[char] end node.is_end_of_word end def delete(word) delete_helper(@root, word, 0) end def delete_helper(node, word, depth) return false if node.nil? if depth == word.length return false unless node.is_end_of_word node.is_end_of_word = false return node.children.empty? end char = word[depth] should_delete_current_node = delete_helper(node.children[char], word, depth + 1) if should_delete_current_node node.children.delete(char) return node.children.empty? && !node.is_end_of_word end false end def starts_with(prefix) node = @root prefix.each_char do |char| return [] unless node.children[char] node = node.children[char] end collect_words(node, prefix) end def collect_words(node, prefix) words = [] if node.is_end_of_word words << prefix end node.children.each do |char, child_node| words.concat(collect_words(child_node, prefix + char)) end words end end
Теперь, когда мы реализовали класс `Trie`, давайте посмотрим, как его можно использовать для выполнения различных операций.
trie = Trie.new trie.insert("apple") trie.insert("app") trie.insert("banana") puts trie.search("apple") # true puts trie.search("app") # true puts trie.search("appl") # false trie.delete("apple") puts trie.search("apple") # false puts trie.starts_with("app") # ["app"] puts trie.starts_with("ban") # ["banana"]
Префиксные деревья имеют несколько преимуществ по сравнению с другими структурами данных, такими как хеш-таблицы или массивы:
Префиксные деревья — это мощный инструмент для работы с наборами строк, который может значительно упростить задачи, связанные с поиском и хранением данных. В этой статье мы рассмотрели, как реализовать префиксное дерево на Ruby, а также основные операции, которые можно выполнять с его помощью. Надеемся, что эта информация была полезной и вдохновит вас на использование префиксных деревьев в ваших проектах!
© 2024 RailsInsights. All rights reserved.