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

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

《使用Trie字典树来实现搜索框检索词联想功能》

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

这里不具体介绍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;
}

输出结果:

《使用Trie字典树来实现搜索框检索词联想功能》

    原文作者:Trie树
    原文地址: https://blog.csdn.net/susidian/article/details/52468257
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞