Les arbres de préfixe, également connus sous le nom de tries, sont des structures de données efficaces pour stocker et rechercher des chaînes de caractères. Ils sont particulièrement utiles pour des applications telles que l'autocomplétion, la recherche de mots et la gestion de dictionnaires. Dans cet article, nous allons explorer comment implémenter un arbre de préfixe en Ruby, en fournissant des exemples de code et des explications détaillées.
Un arbre de préfixe est une structure de données arborescente où chaque nœud représente un caractère d'une chaîne. Les chemins de la racine à un nœud représentent les préfixes des chaînes stockées dans l'arbre. Voici quelques caractéristiques clés des arbres de préfixe :
Les arbres de préfixe offrent plusieurs avantages par rapport à d'autres structures de données, notamment :
Voyons maintenant comment implémenter un arbre de préfixe en Ruby. Nous allons créer une classe Trie
qui contiendra des nœuds et des méthodes pour insérer et rechercher des mots.
La première étape consiste à créer une classe pour représenter un nœud dans l'arbre. Chaque nœud aura un hash pour stocker ses enfants et un booléen pour indiquer si un mot se termine à ce nœud.
class Node attr_accessor :children, :is_end_of_word def initialize @children = {} @is_end_of_word = false end end
Ensuite, nous allons créer la classe Trie
qui contiendra les méthodes pour insérer et rechercher des mots.
class Trie def initialize @root = Node.new end def insert(word) current_node = @root word.each_char do |char| current_node.children[char] ||= Node.new current_node = current_node.children[char] end current_node.is_end_of_word = true end def search(word) current_node = @root word.each_char do |char| return false unless current_node.children[char] current_node = current_node.children[char] end current_node.is_end_of_word end def starts_with(prefix) current_node = @root prefix.each_char do |char| return false unless current_node.children[char] current_node = current_node.children[char] end true end end
Maintenant que nous avons notre classe Trie
, voyons comment l'utiliser pour insérer et rechercher des mots.
trie = Trie.new trie.insert("chat") trie.insert("chien") trie.insert("chouette") puts trie.search("chat") # true puts trie.search("chien") # true puts trie.search("cheval") # false puts trie.starts_with("ch") # true puts trie.starts_with("ca") # false
Nous pouvons également ajouter d'autres fonctionnalités à notre arbre de préfixe, comme la suppression de mots ou la recherche de tous les mots avec un certain préfixe. Voici comment nous pourrions implémenter la recherche de tous les mots avec un préfixe donné.
def find_words_with_prefix(prefix) current_node = @root prefix.each_char do |char| return [] unless current_node.children[char] current_node = current_node.children[char] end collect_words(current_node, prefix) end def collect_words(node, prefix) words = [] words << prefix if node.is_end_of_word node.children.each do |char, child_node| words.concat(collect_words(child_node, prefix + char)) end words end
Avec cette méthode, nous pouvons maintenant rechercher tous les mots qui commencent par un certain préfixe.
trie.find_words_with_prefix("ch") # ["chat", "chien", "chouette"]
Les arbres de préfixe sont des structures de données puissantes et flexibles qui peuvent être utilisées dans de nombreuses applications. En Ruby, leur implémentation est relativement simple et permet d'effectuer des opérations de recherche et d'insertion de manière efficace. Que vous souhaitiez créer un système d'autocomplétion ou gérer un dictionnaire, un arbre de préfixe peut être un excellent choix.
Nous espérons que cet article vous a aidé à comprendre comment implémenter un arbre de préfixe en Ruby. N'hésitez pas à expérimenter avec le code et à ajouter vos propres fonctionnalités pour l'adapter à vos besoins !
© 2024 RailsInsights. All rights reserved.