请教词典查询单词的算法?

solitarystar 2003-09-14 08:48:51
查询效率要高的算法
...全文
68 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoxic 2003-09-15
  • 打赏
  • 举报
回复
2分法太慢,不能模糊查询,要快可以建索引树,

词典依字母排序后,根据单词分布建树。
数据结构如下:
typedef struct tagSEARCHTREE SEARCHTREE,*LPSEARCHTREE;
struct tagSEARCHTREE
{
LONG position;//索引树的起始位置
LONG wordnumber;//索引树包含单词个数
DWORD reserve;
LPSEARCHTREE sontree[27];//子树,sontree[0]代表‘ ’分支,
//sontree[1]到sontree[26]代表阿a~z分支
};

为解决索引大小与查询速度快慢的矛盾定义一个宏
#define TREELEAFMAXWORD 100
标志叶节点最大包含单词个数。


建索引树为代码如下:

void MakeSearchTree(char *parentname, int pos, int wordnum,int depth)
{

LPSTR treename;

int i,len,sonpos,sonsum[27];
char c;

memset(sonsum,0,sizeof(sonsum));
for(i=0;i< wordnum;i++)
{
c=第 pos+I 单词的 第depth字母;
if(c==空格) sonsum[0]++;
else if(c>=’a’&&c<=’z’) sonsum[c-‘a’+1]++;
}
sonpos=pos;
for(i=0;i<27;i++)
{
if(sonsum[i]> TREELEAFMAXWORD)
{
if(I==0)
sonname= parentname+’_’;
else
sonname= parentname+(I-1+’a’);
MakeSearchTree(sonname,sonpos,sonsum[I],depth+1);
}
sonpos+=sonsum[i];
}

}

将单词每个翻转(ab-ba,abc->cba)以后排序,并将翻转后的索引建表

查询时遇“?”如果有子树进行递归查询,没有子树顺序查找(最多查找TREELEAFMAXWORD次)。
查询时遇“*”,(不允许出现关键词前后都是“*”)。假设__代表一个或多个已知字母。
1,——*型:查找——即可。
2,*——型:在翻转后的树查找——
3,——*——型:1,2查找结果取交集处理(需注意“ba*ad”查找到“bad”)
zzwu 2003-09-15
  • 打赏
  • 举报
回复
用折半查找法(或称2分法)就行了.
solitarystar 2003-09-14
  • 打赏
  • 举报
回复
还有词库的数据结构应该怎么设计

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧