我已經編寫了Perl代碼,實際上創建了一個給定數組中的一組單詞的數據結構。現在我遇到了遍歷和打印文字的問題。遍歷一個trie以獲取所有單詞
也粘貼創建的數據結構的Dumper輸出。
遍歷後的最後一組單詞似乎並不正確,因爲遍歷邏輯肯定缺少某些東西。但是,創建好並且工作得很快。有人可以幫我嗎?
的特里結構的頂層是一個哈希
每個散列條目有一個鍵是一種 字母和每個散列指向一個 數組引用。
陣列裁判又包含散列的 列表以及每個哈希產品 同1
如果你看到在輸出中的第一個字。它出現爲archtopriumwe。
我們應該得到弧,拱,頂上,中庭,敬畏
CODE
use Data::Dumper; my %mainhash; ## Subroutine sub storeword { my $type = shift; my $fc = shift; my $word = shift; return if ((not defined $word) or (length($word) == 0)); my @letters = split (//,$word); my $len = scalar(@letters) - 1; my ($arr_ref,$pass_ref,$flag ,$i,$hashitem,$newitem); $pass_ref = $hashitem = $new_item = undef; $arr_ref = $type; $setstop = 1 if (length($word) == 1); $flag =0; for($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,$letters[0],join ('',@letters[ 1..$len])); } ## Subroutine 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$letter\n"; } } } ##main ##list of words my @wd = qw (arc atop awe blob boil fame tub arch atrium); ##inserting each word into the datastructure foreach my $w (@wd) { my @letters = split (//,$w); my $len = scalar(@letters) - 1; if (not exists $mainhash{$letters[0]}) { $mainhash{$letters[0]} = []; } storeword($mainhash{$letters[0]},$letters[0],join ('',@letters[ 1..$len])); } print Dumper(%mainhash); ## Trying to print each word from trie. print("\n List of words\n"); process('',\%mainhash);
輸出:
$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' => [] } ] } ]; List of words archtopriumwe bloboil fame tub
據我所見,你的詞庫似乎並不存儲「弧」本身就是一個詞,只是存在一個以「弧」開頭的詞,其中有兩個「弧」 「和」拱「。 – 2011-05-18 07:20:20
是的同意,我將不得不在我的數據結構中使用某種停止詞,以便能夠弧和拱。 – 2011-05-18 08:50:11