Así que tiene el código de rubí me agarró de Wikipedia y que modifica un poco:Explicación de código Ruby para la construcción de estructuras de datos Trie
@trie = Hash.new()
def build(str)
node = @trie
str.each_char { |ch|
cur = ch
prev_node = node
node = node[cur]
if node == nil
prev_node[cur] = Hash.new()
node = prev_node[cur]
end
}
end
build('dogs')
puts @trie.inspect
me encontré por primera vez esta en el IRB de la consola, y cada vez que la salida node
, simplemente me sigue dando un hash vacío cada vez {}
, pero cuando realmente invoco esa función compila con el parámetro 'dogs'
cadena, realmente funciona, y saca {"d"=>{"o"=>{"g"=>{"s"=>{}}}}}
, lo cual es totalmente correcto.
Esto es probablemente más una pregunta de Ruby que la pregunta real sobre cómo funciona el algoritmo. Realmente no tengo suficiente conocimiento de Ruby para descifrar lo que está pasando allí, supongo.
¿Qué quiere decir con "cada vez que salgo nodo"? ¿No está seguro de qué tipo de respuesta está buscando? ¿Ha rastreado el algoritmo en papel para una pequeña cadena? Es bastante corto. –
escribí 'nodo' en la consola después de escribir en node = prev_node ['a'], luego devuelve algo como => {} que significa hash para vaciar el objeto, y luego de eso escribí node = node [' b '], tratando de simular el bucle for pasando una chave diferente como clave. cuando escribí 'node' de nuevo después de eso, devuelve nil, por supuesto. Me pregunto cómo puede producir {"d" => {"o" => {"g" => {"s" => {}}}}} cuando cada vez que lo trazo, parece que siempre está vacío –
Todavía recomiendo seguir el algoritmo con un trozo de papel, seguir cada paso y anotar los valores de todas las variables. Mire particularmente en 'prev_node [cur] = Hash.new', y considere lo que' prev_node [cur] 'es - pero recuerde que' prev_node' en sí mismo es un hash con una clave de carácter, que apunta a un hash vacío (para una iteración). –