Prefixträd, även kända som trie, är en datastruktur som används för att lagra en uppsättning strängar. De är särskilt användbara för att implementera autocompletion-funktioner, ordsökningar och andra textbaserade operationer. I denna artikel kommer vi att utforska hur man implementerar prefixträd i Ruby, steg för steg, med exempel och förklaringar.
Ett prefixträd är en trädstruktur där varje nod representerar en del av en sträng. Varje väg från roten till en nod representerar ett prefix av en eller flera strängar. Prefixträd är effektiva för att lagra och söka efter strängar, eftersom de kan minska mängden data som behöver jämföras.
Låt oss börja med att implementera ett enkelt prefixträd i Ruby. Vi kommer att skapa en klass som representerar noden i trädet och en annan klass för själva prefixträdet.
Först behöver vi en klass för att representera varje nod i vårt prefixträd. Varje nod kommer att ha en hash för att lagra sina barn och en boolean för att indikera om den representerar slutet av ett ord.
class TrieNode attr_accessor :children, :is_end_of_word def initialize @children = {} @is_end_of_word = false end end
Nästa steg är att skapa klassen för prefixträdet. Denna klass kommer att innehålla metoder för att infoga ord, söka efter ord och hämta alla ord med ett visst prefix.
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 starts_with(prefix) node = @root prefix.each_char do |char| return false unless node.children[char] node = node.children[char] end true end def words_with_prefix(prefix) node = @root prefix.each_char do |char| return [] unless node.children[char] node = node.children[char] end collect_words(node, prefix) end private 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 end
Nu när vi har implementerat vårt prefixträd, låt oss se hur vi kan använda det. Vi kommer att infoga några ord, söka efter dem och hämta ord som börjar med ett visst prefix.
trie = Trie.new trie.insert("äpple") trie.insert("aprikos") trie.insert("banan") trie.insert("bär") puts trie.search("äpple") # true puts trie.search("aprikos") # true puts trie.search("päron") # false puts trie.starts_with("ap") # true puts trie.starts_with("ba") # true puts trie.starts_with("c") # false puts trie.words_with_prefix("ap").inspect # ["äpple", "aprikos"] puts trie.words_with_prefix("b").inspect # ["banan", "bär"]
Prefixträd är en kraftfull datastruktur för att hantera strängar och kan användas i många olika tillämpningar, från autocompletion till ordsökningar. Genom att implementera ett prefixträd i Ruby har vi sett hur enkelt det kan vara att skapa en effektiv och flexibel lösning för att hantera textdata.
Vi har också lärt oss hur man infogar ord, söker efter dem och hämtar ord med ett visst prefix. Med denna kunskap kan du nu börja använda prefixträd i dina egna Ruby-projekt!
För den som vill fördjupa sig ytterligare i ämnet rekommenderas följande resurser:
Lycka till med din implementering av prefixträd i Ruby!
© 2024 RailsInsights. All rights reserved.