Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 拼写检查器:三元搜索树_Algorithm_Data Structures_Spell Checking_Ternary Search Tree - Fatal编程技术网

Algorithm 拼写检查器:三元搜索树

Algorithm 拼写检查器:三元搜索树,algorithm,data-structures,spell-checking,ternary-search-tree,Algorithm,Data Structures,Spell Checking,Ternary Search Tree,我用三元搜索树做了一个拼写检查代码。有人能告诉我如何在TST中找到下一个可能的单词吗。 例如,如果我想搜索,如果我在拼写检查器中搜索一个单词“Manly”,而这个单词在TST中不存在,那么它给出的输出如下 你是说: “男人” “芒果” . .表示可能接近单词在TST中搜索该单词将在树中的特定位置终止。从这一点上,你可以简单地在树上上升一层,直到你达到一个不仅仅是你的孩子的层次 在这个层次上,您可以简单地选择其他可能的路径并返回这些单词。我已经实现了自己的拼写检查器,但我使用的不是Peter Ka

我用三元搜索树做了一个拼写检查代码。有人能告诉我如何在TST中找到下一个可能的单词吗。 例如,如果我想搜索,如果我在拼写检查器中搜索一个单词“Manly”,而这个单词在TST中不存在,那么它给出的输出如下 你是说: “男人” “芒果” .
.表示可能接近单词

在TST中搜索该单词将在树中的特定位置终止。从这一点上,你可以简单地在树上上升一层,直到你达到一个不仅仅是你的孩子的层次


在这个层次上,您可以简单地选择其他可能的路径并返回这些单词。

我已经实现了自己的拼写检查器,但我使用的不是Peter Kankowski建议的简单三值trie,而是三值dag。你可以看看我的一些细节,以及我是如何做到的。它是用希腊语写的,但是你可以想出一个主意

编辑:

好的,你说得对。 基本思想是为给定的编辑距离使用预先创建的候选列表(对于我来说,值为2是可以的)。要减小列表的大小,可以使用通配符。 当然,这样的列表可以用不同的方式构建。我更喜欢这样的for/while循环(例如,对于两个替换的候选者)

void Substitute2(向量&v,常量wstring&w)
{
尺寸长度=w.尺寸();
if(len<2)
返回;
尺寸p1=0,p2=1;
而(p1
在准备好候选词列表后,在三元dag中对列表中的每个项目进行简单搜索,就可以为我们提供拼写错误单词的建议

void Search( FileNode* pDict, FileNode* pNode, const wchar_t* Word, wstring Sug, set<wstring>& List )
{
    if ( IsNullLink( pNode, pDict ) )
        return;
    if ( *Word == '?' ) {
        Search( pDict, GetLo( pNode, pDict ), Word, Sug, List );
        Search( pDict, GetEq( pNode, pDict ), Word + 1, Sug + pNode->Char, List );
        Search( pDict, GetHi( pNode, pDict ), Word, Sug, List );
    } else {
        if ( *Word < pNode->Char ) {
            Search( pDict, GetLo( pNode, pDict ), Word, Sug, List );
        } else if ( *Word > pNode->Char ) {
            Search( pDict, GetHi( pNode, pDict ), Word, Sug, List );
        } else {
            if ( pNode->Char == '\0' )
            {
                List.insert( Sug );
            }
            if ( *Word != '\0' ) {
                Search( pDict, GetEq( pNode, pDict ), Word + 1, Sug + pNode->Char, List );
            }
        }
    }
}
void搜索(FileNode*pDict,FileNode*pNode,const wchar\u t*Word,wstring Sug,set&List)
{
if(IsNullLink(pNode,pDict))
返回;
如果(*单词=='?'){
搜索(pDict、GetLo(pNode、pDict)、Word、Sug、List);
搜索(pDict,GetEq(pNode,pDict),Word+1,Sug+pNode->Char,List);
搜索(pDict、GetHi(pNode、pDict)、Word、Sug、List);
}否则{
如果(*单词Char){
搜索(pDict、GetLo(pNode、pDict)、Word、Sug、List);
}else if(*Word>pNode->Char){
搜索(pDict、GetHi(pNode、pDict)、Word、Sug、List);
}否则{
如果(pNode->Char='\0')
{
列表。插入(Sug);
}
如果(*单词!='\0'){
搜索(pDict,GetEq(pNode,pDict),Word+1,Sug+pNode->Char,List);
}
}
}
}

注意:字典是一个编译的(基于文件的)三元dag

在TST中有三个指针。如果单词不匹配,则左、等、右三个指针用于搜索单词,它会像在BST中一样进入树中的叶子,因此如何实现在TST中包含字符串的搜索可以跟踪其路径(除非您只想知道您的字符串是否包含在TST中)。如果您跟踪您的路径,则有4个选项:左、等、右和向上(从哪里开始)。这就是我说的“在树中上升一级”时所指的。你能在这里修改我的大学项目急需的代码吗?它很棒,需要学习很多,你正在使用哪个编译器显示建议的单词。三元dag非常有趣,你分享过吗我们的代码在您的博客上。代码中最重要的部分是公开的。我正在使用Microsoft的VS 2012编译器。很抱歉,仅链接的答案在Stackoverflow上不好。请在您的答案中包含代码。或者伪代码和方案,如果这足以解释算法的话。
void Search( FileNode* pDict, FileNode* pNode, const wchar_t* Word, wstring Sug, set<wstring>& List )
{
    if ( IsNullLink( pNode, pDict ) )
        return;
    if ( *Word == '?' ) {
        Search( pDict, GetLo( pNode, pDict ), Word, Sug, List );
        Search( pDict, GetEq( pNode, pDict ), Word + 1, Sug + pNode->Char, List );
        Search( pDict, GetHi( pNode, pDict ), Word, Sug, List );
    } else {
        if ( *Word < pNode->Char ) {
            Search( pDict, GetLo( pNode, pDict ), Word, Sug, List );
        } else if ( *Word > pNode->Char ) {
            Search( pDict, GetHi( pNode, pDict ), Word, Sug, List );
        } else {
            if ( pNode->Char == '\0' )
            {
                List.insert( Sug );
            }
            if ( *Word != '\0' ) {
                Search( pDict, GetEq( pNode, pDict ), Word + 1, Sug + pNode->Char, List );
            }
        }
    }
}