/ / Traversing trie dostať všetky slová - perl, data-štruktúry, traversal, trie

Prechádzať trie dostať všetky slová - perl, dátové štruktúry, traversal, trie

Napísal som Perl kód skutočne vytvoriť trie datastructure daný súbor slov v poli. Teraz mám problémy s prechádzaním a tlačou slov.

Vložil sa aj výstup Dumper vytvorenej štruktúry údajov.

Konečná množina slov po prejazde sa nezdá byť správna, pretože traversálna logika určite niečo chýba. Ale vytvorenie trie je v poriadku a funguje rýchlo. Môže mi niekto pomôcť?

Najvyššia úroveň trie je hash

  1. Každá položka hash má kľúč, ktorý je a každý hash označuje a pole ref.

  2. Pole znovu obsahuje a zoznam hash a každý hash položky je rovnaké ako 1

Ak vidíte prvé slovo vo výstupe. Vychádza to ako archtopriumwe.

Mali by sme sa dostať oblúku, arch, na vrchole, átrium, hrôza

CODE

používať údaje ::sklápač; môj% mainhash;  ## Subrutina podmnožina { môj typ $ = shift; môj $ fc = posun; moje slovo = posun; return if ((nie je definované $ word) alebo (dĺžka ($ word) == 0)); my @letters = split (//, $ word); my $ len = skalárny (@letters) - 1; my ($ arr_ref, $ pass_ref, $ flag, $ i, $ hashitem, $ newitem); $ pass_ref = $ hashitem = $ new_item = undef; $ arr_ref = $ type; $ setstop = 1 ak (dĺžka ($ word) == 1); $ flag = 0; pre ($ i = 0; $ i {$ letters [0]}) { $ flag = 1; $ pass_ref = $ hashitem -> {$ letters [0]}; last; } } if ($ flag == 0) { $ newitem -> {$ letters [0]} = []; push (@ $ arr_ref, $ newItem); $ pass_ref = $ newitem -> {$ letters [0]}; }  storeword ($ pass_ref, $ písmená [0], pripojiť ("", @ písmená [1 .. $ len])); }  ## Subrutina čiastkový proces { my ($ prefix, $ trie) = @_; za môj znak $ (triedenie kľúčov% $ trie) { if (@ {$ trie -> {$ letter}}) { pre moju pobočku $ (@ {$ trie -> {$ letter}}) { proces („$ prefix $ letter“, $ branch); } } inak { print "$ prefix $ lettern"; } } }  ##hlavné  ## zoznam slov my @ wd = qw (oblúk na vrchole úcty blob boil fame vaňový oblúk atrium);  ## vloženie každého slova do štruktúry údajov foreach my $ w (@wd) { my @letters = split (//, $ w); my $ len = skalárny (@letters) - 1; if (neexistuje $ mainhash {$ letters [0]}) { $ mainhash {$ letters [0]} = []; } storeword ($ mainhash {$ letters [0]}, $ letters [0], join ("", @ písmená [1 .. $ len]))); } tlač Dumper (% mainhash); ## Snažím sa vytlačiť každé slovo z programu trie. print ("n Zoznam slov"); proces ( "",% mainhash);


Výkon:

$ VAR1 = "a"; $ VAR2 = [ { "r" => [ { "c" =>[ { "h" => [] } ] } ] }, { "t" => [ { "o" => [ { "p" => [] } ] }, { "r" => [ { "i" => [ { "u" => [ { "m" => [] } ] } ] } ] } ] }, { "w" => [ { "e" => [] } ] } ]; $ VAR3 = "b"; $ VAR4 = [ { "l" => [ { "o" => [ { "b" => [] } ] } ] }, { "o" => [ { "i" => [ { "l" => [] } ] } ] } ]; $ VAR5 = "f"; $ VAR6 = [ { "a" => [ { "m" => [ { "e" => [] } ] } ] } ]; $ VAR7 = "t"; $ VAR8 = [ { "u" => [ { "b" => [] } ] } ];  Zoznam slov archtopriumwe bloboil sláva vaňa

odpovede:

3 pre odpoveď č. 1

Vidíte, že váš kód je len tlačkaždý list v datastructure raz, namiesto raz za slovo je v? A iba raz vytlačiť nový riadok pre každé písmeno najvyššej úrovne v strome, nie jedno za slovo?

Ak chcete tento problém vyriešiť, musíte do rekurzívnej podrady preniesť viac kontextu. Niečo také:

sub process {
my ($prefix, $trie) = @_;
for my $letter (sort keys %$trie) {
if ( @{ $trie->{$letter} } ) {
for my $branch (@{ $trie->{$letter} }) {
process("$prefix$letter", $branch);
}
}
else {
print "$prefix$lettern";
}
}
}

print("n List of wordsn");
process("", %mainhash);

Toto nevytlačí oblúk, pretože niespôsob, ako vo vašej dátovej štruktúre povedať, že oblúk je slovo, ale napr. boi nie je. Hodnota pre každé písmeno musí obsahovať dve veci: booleovský indikátor, že ide o koniec slova, a zoznam možných nasledujúcich písmen a ich podradených písmen.