我编写了 Perl 代码来实际创建一个Trie数据结构,给定数组中的一组单词。现在我在遍历和打印单词时遇到问题。
还粘贴了创建的数据结构的 Dumper 输出。
遍历后的最后一组单词似乎不正确,因为遍历逻辑肯定遗漏了一些东西。但是 trie 的创建很好并且运行速度很快。有人可以在这里帮助我吗?
trie的顶层是哈希
每个散列项都有一个键,它是一个字母,每个散列指向一个数组 ref。
数组 ref 再次包含一个哈希列表,每个哈希项与 1 相同
如果您在输出中看到第一个单词。它以archtopriumwe的形式出现。
我们应该得到弧,拱,顶,中庭,敬畏
代码
使用 Data::Dumper; 我的 %mainhash; ## 子程序 子商店字{ 我的 $type = 班次; 我的 $fc = 班次; 我的 $word = 班次; return if ((not defined $word) or (length($word) == 0)); 我的@letters = split (//,$word); 我的 $len = 标量(@letters) - 1; 我的 ($arr_ref,$pass_ref,$flag ,$i,$hashitem,$newitem); $pass_ref = $hashitem = $new_item = undef; $arr_ref = $类型; $setstop = 1 if (长度($word) == 1); $标志=0; for($i = 0;$i {$letters[0]}) { $标志=1; $pass_ref = $hashitem->{$letters[0]}; 最后的; } } 如果 ($flag == 0) { $newitem->{$letters[0]} = []; 推(@$arr_ref,$newitem); $pass_ref = $newitem->{$letters[0]}; } storeword($pass_ref,$letters[0],join ('',@letters[ 1..$len])); } ## 子程序 子进程{ 我的 ($prefix,$trie) = @_; 对于我的 $letter(排序键 %$trie){ if (@{ $trie->{$letter} } ) { 对于我的 $branch (@{ $trie->{$letter} }) { 进程(“$前缀$字母”,$分支); } } 别的 { 打印“$前缀$字母\n”; } } } ##主要的 ##单词列表 我的@wd = qw(在 awe blob 沸腾成名浴缸拱形中庭上的弧形); ##将每个单词插入数据结构 foreach 我的 $w (@wd) { 我的@letters = split (//,$w); 我的 $len = 标量(@letters) - 1; if (不存在 $mainhash{$letters[0]}) { $mainhash{$letters[0]} = []; } storeword($mainhash{$letters[0]},$letters[0],join ('',@letters[ 1..$len])); } 打印转储器(%mainhash); ## 尝试打印 trie 中的每个单词。 print("\n 单词列表\n"); 进程('',\%mainhash);
输出:
$VAR1 = 'a'; $VAR2 = [ { 'r' => [ { 'c' => [ { 'h' => [] } ] } ] }, { 't' => [ { 'o' => [ { 'p' => [] } ] }, { 'r' => [ { '我' => [ { '你' => [ { 'm' => [] } ] } ] } ] } ] }, { 'w' => [ { 'e' => [] } ] } ]; $VAR3 = 'b'; $VAR4 = [ { 'l' => [ { 'o' => [ { 'b' => [] } ] } ] }, { 'o' => [ { '我' => [ { 'l' => [] } ] } ] } ]; $VAR5 = 'f'; $VAR6 = [ { '一个' => [ { 'm' => [ { 'e' => [] } ] } ] } ]; $VAR7 = 't'; $VAR8 = [ { '你' => [ { 'b' => [] } ] } ]; 单词列表 Archtopriumwe 水滴 名声 浴缸