目录
1 问题描述
我们在使用百度或其它搜索框的时候经常会看到如下情况:
下拉框中会显示检索词的联想,这个功能是怎么实现的呢?其实这就是Trie树(或者字典树)的一个实际应用。
2 具体实现
这里不具体介绍Trie树,接下来简单实现一下这种联想功能。
#include<iostream>
#include<stdio.h>
#include<vector>
#include<string>
#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<string> &result); //当检索query时,从Trie树中获取联想结果并存入vector中
void FindStrCore(TreeNode *root,string query,vector<string> &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<string> &result)
{
if(root == NULL)
return ;
if(root->isEnd)
result.push_back(str);
for(int j=0;j<N;j++)
{
if(root->next[j] != NULL)
FindStrCore(root->next[j],str+(char)j,result);
}
}
void Trie::FindStr(string src,vector<string> &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<str.size();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<N;i++)
{
if(root->next[i] != NULL)
DeleteNode(root->next[i]);
}
root = NULL;
root->isEnd = false;
}
void Trie::Clear()
{
int i=0;
for(;i<N;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<<"please input query:"<<endl;
cin>>query; //输入要检索的query
vector<string> result;
myTrie->FindStr(query,result);
vector<string>::iterator iter = result.begin(); //输出联想结果
cout<<"matching the query list:"<<endl;
for(;iter != result.end();++iter)
{
cout<<*iter<<endl;
}
return 0;
}
输出结果: