前缀树(清晰明了,不懂问我)

前缀树的定义:
又称单词查找树,字典树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高
xiaoneng
前缀树的性质:

  • 1)根节点不包含字符,除根节点外每一个节点都只包含一个字符
  • 2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
  • 3)每个节点的所有子节点包含的字符都不相同

注:每个节点都含有26个链接表示出现的26个小写字母,即每个节点表示的字符是26个字符中的一个,当字符串插入完成时,我们就会标记该字符串就是完整的字符串了。

在这里插入图片描述

在这里插入图片描述

前缀树的操作:
前缀树的主要操作为插入,查找,删除(删除操作很少见)

源码如下:提供插入,查找及字符串的前缀字符操作

#include <iostream>
#include <string>
using namespace std;

class Trie
{
private:
 bool is_string = false;
 Trie* next[26] = { nullptr };
public:
 Trie() {}
 void insert(const string& word)//插入单词
 {
  Trie* root = this;
  for (const auto& w : word) {
   if (root->next[w - 'a'] == nullptr)root->next[w - 'a'] = new Trie();
   root = root->next[w - 'a'];
  }
  root->is_string = true;
 }
    
 bool search(const string& word)//查找单词
 {
  Trie* root = this;
  for (const auto& w : word) {
   if (root->next[w - 'a'] == nullptr)return false;
   root = root->next[w - 'a'];
  }
  return root->is_string;
 }
    
bool startsWith(string prefix)//查找前缀
 {
  Trie* root = this;
  for (const auto& p : prefix) {
   if (root->next[p - 'a'] == nullptr)return false;
   root = root->next[p - 'a'];
  }
  return true;
 }
};

int main()
{
    Trie* trie = new Trie();
    trie->insert("apple");
    cout << trie->search("apple") << endl;
    cout << trie->search("app") << endl;
    cout << trie->startsWith("app") << endl;
    trie->insert("app");
    cout << trie->search("app") << endl;
    system("pause");
}

前缀树的应用:

1、自动补全(单词自动补全)
2、拼写检查(检查单词是否拼写正确)
3、IP路由(最长前缀匹配)
4、九宫格打字预测(根据前缀预测单词)

前缀树与其他数据结构的优点:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值