|

楼主 |
发表于 2004-10-27 14:42:24
|
显示全部楼层
最初由 Yuking 发表
是,我一直想改进这个算法。
如果记录汉字及编码,用户以一级简码输入的字还是得查找整个码表。
因此我是想以将码表结构改进一下,将单字和词组分开,这样肯定会好很多
struct TWBRECORD {
char strCode[5];
BOOL BeUser;
char *strHZ;
struct TWBRECORD *next;
struct TWBRECORD *prev;
};
typedef struct TWBRECORD WBRecord;
在您的五笔结构里,我加入了一个参数:BOOL BeUser;
我把词库分为系统词库与用户词库。系统词库保持相对稳定,只要在结束时保存一次就行了。而用户词库可以进行较多次数的保存,比如我设定输入20次,保存一次,每新造一个词组保存一次。如何区分系统词还是用户词,就是靠这个参数来分别。我设定BeUser==1时为用户添加词,BeUser==0时为系统词。
在装载入词库时,分别读入两个码表文件。对于系统词自动设置BeUser=0;
对于用户词的装入采用插入的方式,这种方式比较费时,因为对每个用户词条都得搜索怎么码表以决定插到哪里。所以我编了个perl程序,当用户词库的词条积累较多时可以将它并入系统词库中。perl代码如下
open(INFILE, "wbx.mb") || die "Can't open 文件: $!\n";
open(INFILE1, "wbxusr.txt") || die "Can't open 文件: $!\n";
open(OUTFILE, ">wbxadded.txt") || die "Can't open 文件: $!\n";
@karalist=<INFILE1>;
$karanum=@karalist;
$karalist[$karanum]="zzzz zzzz";
@wblist=<INFILE>;
$prevkaraitem="";
foreach $karaitem (@karalist) {
($a, $b) = split(" ", $karaitem);
$Notexit=1;
foreach $wbitem (@wblist){
($c, $d) = split(" ", $wbitem);
next if($c le $prevkaracode);
last if($c gt $a);
if($a eq $c and $b eq $d){
$Notexit=0;
}
print OUTFILE ($c," ",$d,"\n");
}
if($Notexit && ($a ne "zzzz")){
print OUTFILE ($a," ",$b,"\n");
}
$prevkaracode=$a;
}
close(INFILE);
close(INFILE1);
close(OUTFILE);
这样就可以解决问题了。 |
|