c语言联想词搜索实现,使用Trie字典树来实现搜索框检索词联想功能

我们在使用百度或其它搜索框的时候经常会看到如下情况:

0818b9ca8b590ca3270a3433284dd417.png

下拉框中会显示检索词的联想,这个功能是怎么实现的呢?其实这就是Trie树(或者字典树)的一个实际应用。

这里不具体介绍Trie树,接下来简单实现一下这种联想功能。

#include

#include

#include

#include

#define N 256

using namespace std;

struct TreeNode

{

bool isEnd;

struct TreeNode *next[N];

};

class Trie

{

public:

Trie();

void InsertNode(string query); //将query插入Trie树中

void FindStr(string query,vector &result); //当检索query时,从Trie树中获取联想结果并存入vector中

void FindStrCore(TreeNode *root,string query,vector &result);

void Clear();

void DeleteNode(TreeNode *root);

~Trie();

private:

TreeNode *root;

};

Trie::Trie()

{

root = new TreeNode();

root->isEnd = false;

}

void Trie::FindStrCore(TreeNode *root,string str,vector &result)

{

if(root == NULL)

return ;

if(root->isEnd)

result.push_back(str);

for(int j=0;j

{

if(root->next[j] != NULL)

FindStrCore(root->next[j],str+(char)j,result);

}

}

void Trie::FindStr(string src,vector &result) //当检索query时,从Trie树中获取联想结果并存入vector中

{

int cur = 0;

TreeNode *tmp = this->root;

unsigned char index = (unsigned char)src[cur];

while(cur < src.size() && tmp->next[index] != NULL)

{

tmp = tmp->next[index];

++cur;

index = (unsigned char)src[cur];

}

if(cur != src.size() || tmp == NULL)

return;

FindStrCore(tmp,src+(char)cur,result);

}

void Trie::InsertNode(string str) //将query插入Trie树中

{

int i=0;

TreeNode *tmp = this->root;

for(;i

{

unsigned char index = (unsigned char)str[i];

if(tmp->next[index] == NULL)

{

tmp->next[index] = new TreeNode();

}

tmp = tmp->next[index];

}

tmp->isEnd = true;

}

void Trie::DeleteNode(TreeNode *root)

{

int i=0;

for(;i

{

if(root->next[i] != NULL)

DeleteNode(root->next[i]);

}

root = NULL;

root->isEnd = false;

}

void Trie::Clear()

{

int i=0;

for(;i

{

if(root->next[i] != NULL)

{

DeleteNode(root->next[i]);

}

}

}

Trie::~Trie()

{

Clear();

}

int main()

{

Trie *myTrie = new Trie(); //先插入数据

myTrie->InsertNode("宝马1系");

myTrie->InsertNode("宝马2系");

myTrie->InsertNode("宝马3系");

string query;

cout<

cin>>query; //输入要检索的query

vector result;

myTrie->FindStr(query,result);

vector::iterator iter = result.begin(); //输出联想结果

cout<

for(;iter != result.end();++iter)

{

cout<

}

return 0;

}

输出结果:

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值