前缀树是一种用于快速检索的多叉树结构,利用字符串的公共前缀来降低查询时间,核心思想是空间换时间,经常被搜索引擎用于文本词频统计。

优点:最大限度地减少无谓的字符串比较,查询效率高;

缺点:内存消耗较大;

特性:

(1)不同字符串的相同前缀只保存一份;

(2)结点不存放数据,数据存储在树的边上,结点存放字符经过的次数和结束的次数;

例如:给出一组单词,adv, air, ait, cat

前缀树的类定义

我们需要储存每个结点的pass和end值,再准备一个长度为26的指针数组来储存字符信息。至于字符信息怎么表示,我们需要储存的任意字符-'a’就能映射到数组中的对应位置上,例如我们要储存a,那么a-a=0,所以我们就专门在0位置储存字符a,依次类推。。。

直接上代码,头文件"TrieTree.h"

#pragma once
#include <string>
#include <stack>
using namespace std;struct _Node{int pass;int end;_Node* next[26];_Node(){pass = 0;end = 0;for (int i = 0; i < 26; i++){next[i] = NULL;}}
};class TrieTree
{
public:~TrieTree();TrieTree();//插入字符串void add(string str);//查询包含该前缀的字符串数量int preNum(string str);//查询字符串次数int searchNum(string str);//删除字符串void erase(string str);private:_Node* root;
};

cpp文件"TrieTree.cpp"

#include "stdafx.h"
#include "TrieTree.h"TrieTree::TrieTree()
{root = new _Node();
}TrieTree::~TrieTree()
{
}void TrieTree::add(string str)
{if (str.empty())return;root->pass++;int path = 0;_Node* cur = root;for (int i = 0; i < str.length(); i++){path = str[i] - 'a';if (!cur->next[path])cur->next[path] = new _Node();cur = cur->next[path];cur->pass++;}cur->end++;
}int TrieTree::preNum(string str)
{if (str.empty())return -1;int path = 0;_Node* cur = root;for (int i = 0; i < str.length(); i++){path = str[i] - 'a';if (cur->next[path] == NULL)return 0;cur = cur->next[path];}return cur->pass;
}int TrieTree::searchNum(string str)
{if (str.empty())return -1;int path = 0;_Node* cur = root;for (int i = 0; i < str.length(); i++){path = str[i] - 'a';if (cur->next[path] == NULL)return 0;cur = cur->next[path];}return cur->end;
}void TrieTree::erase(string str)
{if (str.length() || searchNum(str) == 0)return;int path = 0;_Node* cur = root;cur->pass--;for (int i = 0; i < str.length(); i++){path = str[i] - 'a';if (--cur->next[path]->pass == 0){_Node* eNode = cur->next[path];stack<_Node*> est;est.push(eNode);while (!est.empty()){_Node* now = est.top();est.pop();for (int i = 0; i < 26; i++){if (now->next[i] != NULL){est.push(now->next[i]);}}delete now;}}cur = cur->next[path];}cur->end--;
}

前缀树(Trie树)相关推荐

  1. HDU 1247 Hat’s Words 字典树(Trie树)

    HDU 1247 Hat's Words 字典树(Trie树) 字典树的建立是应该都是一样的 下面是我的做法: 建立完后, 对每一个单词都进行find_string()判断是否符合, 分别对其分成两半 ...

  2. java工具:字典树(单词查找树/Trie树)的实现以及使用

    项目地址 https://github.com/kylin-hunter/k-dic 文章目录 项目地址 前言 一.字典树 二.使用步骤 1 引入库 1.1 编译并发布到本地 1.2 gradle ( ...

  3. 字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  4. 字典树(Trie树)

    Trie树就是字典树,其核心思想就是空间换时间. 举个简单的例子. 给你100000个长度不超过10的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,第一次出现第几个位置. 这题当然可以用h ...

  5. 【BZOJ3217】ALOEXT-暴力重构线段树-替罪羊树-Trie树-树套树-10k大代码(+数据生成器)...

    Problem ALOEXT 题目大意 给出一个数据结构维护一个数列,要求支持以下操作: 向数列中某个位置插入一个数 将数列中某个位置的数删除 将数列中某个位置的数换成另外一个数 查询一段区间内的次大 ...

  6. LeetCode 14. Longest Common Prefix字典树 trie树 学习之 公共前缀字符串

    所有字符串的公共前缀最长字符串 特点:(1)公共所有字符串前缀 (好像跟没说一样...) (2)在字典树中特点:任意从根节点触发遇见第一个分支为止的字符集合即为目标串 参考问题:https://lee ...

  7. Trie(前缀树/字典树)及其应用

    from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...

  8. python3精要(5)-最长公共前缀Trie树

    单词查找树Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. python函数引用传递 列表.字典 ...

  9. 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树......

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 上篇文章我们主要介绍了线性数据结构,本篇233酱带大家看看 无所不 ...

  10. Trie 树——搜索关键词提示

    当你在搜索引擎中输入想要搜索的一部分内容时,搜索引擎就会自动弹出下拉框,里面是各种关键词提示,这个功能是怎么实现的呢?其实底层最基本的就是 Trie 树这种数据结构. 1. 什么是 "Tri ...

最新文章

  1. c语言表达式3178的值为,【C语言】C语言运算符
  2. Linux设置开机启动
  3. 机器学习为NASA贡献了什么?
  4. linux多少个端口,Linux允许python使用多少个网络端口?
  5. pythondevp2p_以太坊GO、JAVA、PYTHON、RUBY、JS客户端介绍
  6. html(+css)/01/html语言基础,标记,标记语法,html文档结构
  7. Zookeeper-入门-安装
  8. 〖Demo〗-- 计算器
  9. NoSQL之【MongoDB】学习(二):DML和查询操作说明
  10. 微软iis服务器并发量,IIS并发连接数
  11. 使用先根序列作为插入顺序重建二叉搜索树
  12. C语言二维数组范德蒙,2、编写一个程序,实现一个3×4矩阵转置。
  13. Computer vision: models, learning and inference 学习笔记1:引言
  14. Springboot​ mybatis-plus
  15. 用python 打印等腰三角形
  16. 数据分析(1):对比分析法
  17. Web Service描述语言 WSDL 详解
  18. python - 官方简易文档篇(1)常用、函数
  19. 实验三十六 Windows Server 2012 RDS桌面虚拟化之七VDI虚拟桌面的更新和维护
  20. WinForm dataGridView连接Access数据库

热门文章

  1. Win10锁屏之后设置自动关闭屏幕的时间
  2. 曲线绕x轴旋转曲面方程_绕x轴旋转(微积分旋转体绕y轴旋转体积~我看不懂图片上的公式~...)...
  3. Java刷题-蓝桥杯省赛第十一届JavaC组1---3
  4. HTML5人工智能基础及OO实践
  5. 例题 9-8 颜色的长度(Color Length, ACM/ICPC Daejeon 2011, UVa1625)
  6. ES6的Array.from方法创建长度为N的undefined数组
  7. 哈希表解决冲突的方式
  8. python读取txt 符号分割 读取一条删除一条
  9. UE5回合制游戏【2-摄像机控制】(蓝图版)
  10. 2022年6月的顶级黑客