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.