最长前缀匹配法 统计不同单词个数
如果使用概率算法的话,虽然速度较快,但会有一定的误差,而且这种误差还不稳定。
考虑使用确定算法,一般来讲,单词数量越多,第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;
} 阅读全文
类别:算法 查看评论
考虑使用确定算法,一般来讲,单词数量越多,第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;
} 阅读全文
类别:算法 查看评论