最长前缀匹配法 统计不同单词个数

如果使用概率算法的话,虽然速度较快,但会有一定的误差,而且这种误差还不稳定。
考虑使用确定算法,一般来讲,单词数量越多,第n个需要进行比较的单词操作时间越长。
今天在bbs上看到一种字典序的方法,每个单词与已经存在的单词的比较的时间花费只和自身的长度有关。也就是这样做得:
单词中的第i(0<i<n+1)位字母有26(对应26个英文字母)个预置位置,其(ASII-'a')值为其占有的位置,每个位置设置1个标志位标识该位是否是单词结束字母位置,定义每个对象都包含26个预留位置、1个标志符和指向下一个对象的指针。每个单词只需要按照顺序寻找第i位字母的对应位置,如果位置被占,直接寻找第i+1个字母的位置,如没有被占,就把这个位置new出来,直到最后一个字母,然后查看最后一位字母的位置的标识,如是被修改过,则是重复出现的单词,否则是新单词。  叙述的很乱,还是直接上代码吧。

@感谢LevinLin同学的贡献

----------------------------------------------------
#include<iostream>
using namespace std;

const int kind=26;
int same=0;

struct Treenode
{
bool wordend;    //标识位,是否是最后一个字母
Treenode* next[kind];   //第i+1个字母的的位置
Treenode()
{
wordend=false;
for(int i=0;i<kind;i++)
next[i]=NULL;
}
};

void insert(Treenode* root,char *word)
{
Treenode* location=root;
int i=0,branch=0;

while(word[i]!='\0')
{
branch=word[i]-'a';
if(!(location->next[branch]))     //判断第i位是否已经被占
{
location->next[branch]=new Treenode();
}
i++;
location=location->next[branch];
}
if (location->wordend==false)
{
location->wordend=true;   //修改标识
}
else
same++;  //标识被修改过,是重复出现的单词
}

int main()
{
int n,i;
char word[11];
Treenode *root=NULL;
root=new Treenode();
cin>>n;
for (i=0;i<n;i++)
{
cin>>word;
insert(root,word);
}
cout<<n-same;
return 0;
} 阅读全文
类别:算法 查看评论

posted on 2010-04-03 23:38  janqii  阅读(677)  评论(0)    收藏  举报

导航