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

我的理解是用来做字符串搜索的,每个节点只包含一个字符,比如录入单词"world",则树的结构是:

这时再录入单词"worab",则树的结构为:

所以每个节点必须还要一个字段is_end标识是否为结束单词。比如用户输入wor,搜索所有wor开头的单词,假设现在有一个单词就是wor,从"w"开始检索,当检索到"r"的时候需要判断"r"节点的is_end为true,则把wor加入到结果列表,然后继续往下面检索。

PHP实现代码:

<?phpclass Node{public $value;                 // 节点值public $is_end = false;        // 是否为结束--是否为某个单词的结束节点public $childNode = array();   // 子节点/* 添加孩子节点--注意:可以不为引用函数,因为PHP对象赋值本身就是引用赋值 */public function &addChildNode($value, $is_end = false){$node = $this->searchChildNode($value);if(empty($node)){// 不存在节点,添加为子节点$node = new Node();$node->value = $value;$this->childNode[] = $node;}$node->is_end = $is_end;return $node;}/* 查询子节点 */public function searchChildNode($value){foreach ($this->childNode as $k => $v) {if($v->value == $value){// 存在节点,返回该节点return $this->childNode[$k];}}return false;}
}/* 添加字符串 */
function addString(&$head, $str){$node = null;for ($i=0; $i < strlen($str); $i++) {if($str[$i] != ' '){$is_end = $i != (strlen($str) - 1) ? false : true;if($i == 0){$node = $head->addChildNode($str[$i], $is_end);}else{$node = $node->addChildNode($str[$i], $is_end);}}}
}/* 获取所有字符串--递归 */
function getChildString($node, $str_array = array(), $str = ''){if($node->is_end == true){$str_array[] = $str;}if(empty($node->childNode)){return $str_array;}else{foreach ($node->childNode as $k => $v) {$str_array = getChildString($v, $str_array, $str . $v->value);}return $str_array;}
}/* 搜索 */
function searchString($node, $str){for ($i=0; $i < strlen($str); $i++) {if($str[$i] != ' '){$node = $node->searchChildNode($str[$i]);// print_r($node);if(empty($node)){// 不存在返回空return false;}}}return getChildString($node);
}/* 调用测试开始 */
$head = new Node;   // 树的head// 添加单词
addString($head, 'hewol');
addString($head, 'hemy');
addString($head, 'heml');
addString($head, 'you');
addString($head, 'yo');// 获取所有单词
$str_array = getChildString($head);// 搜索
$search_array = searchString($head, 'hem');
// 循环打印所有搜索结果
foreach ($search_array as $key => $value) {echo 'hem' . $value . '<br>';  // 输出带上搜索前缀
}

PHP实现Trie树(字典树)相关推荐

  1. C++实现trie tree字典树(附完整源码)

    实现trie tree字典树 实现trie tree字典树算法的完整源码(定义,实现,main函数测试) 实现trie tree字典树算法的完整源码(定义,实现,main函数测试) #include ...

  2. trie(字典树、前缀树)

    trie(字典树.前缀树) 1. trie原理 原理 trie树,又被称为字典树.前缀树,是一种高效地存储和查找字符串集合的数据结构. 一般来说,用到trie的题目中的字母要么全是小写字母,要么全是大 ...

  3. HDU - 5790 Prefix(主席树+字典树)

    题目链接:点击查看 题目大意:给出 n 个字符串,再给出 m 次询问,每次询问需要输出区间 [ l , r ] 内的所有字符串有多少个不同的前缀,要求算法强制在线 题目分析:统计字符串的前缀,不难想到 ...

  4. Algorithm:树结构(二叉树/多路查找树/字典树)的简介、具体结构(FBT/CBT/BST/BBT/Heap/Huffman、B树/B+树/R树、字典树)及其运算(增删查/遍历/旋转)、代码实现

    Algorithm:树结构(二叉树/多路查找树/字典树)的简介.具体结构(FBT/CBT/BST/BBT/Heap/Huffman.B树/B+树/R树.字典树)及其运算(增删查/遍历/旋转).代码实现 ...

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

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

  6. Trie(字典树/前缀树)

    字典树/前缀树 Trie(发音类似 "try")或者说 前缀树(字典树) 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键.这一数据结构有相当多的应用情景,例如自动补完和 ...

  7. Luogu P2580 于是他错误的点名开始了 Trie树 字典树

    字典树裸题.每次插入询问串,查询的时候拿出来直接查,信息保留在节点上. #include <bits/stdc++.h> using namespace std;char s[51]; i ...

  8. 【数据结构】前缀树/字典树

    目录 1.概述 2.代码实现 3.应用 本文参考: LeetCode 208.实现 Trie (前缀树) 1.概述 前缀树又称字典树.Trie 树.单词查找树,是一棵有根树,同时也是一种哈希树的变种, ...

  9. 基于Tire树(字典树)与倒排索引实现文本词频统计工具

    文章目录 文件读写操作 C风格文件读取 C++风格按行读取 C++风格按单词读取 实现文件词频统计工具 英文文章单词的正确分割 基于Trie树实现文件词频统计 基于Trie树实现带倒排索引的文件词频统 ...

  10. Tired树(字典树)理解与例题

    例题:Trie字符串统计 模板 int son[N][26], cnt[N], idx; //idx 当前用到了的结点的下标 // 0号点既是根节点,又是空节点 // son[][]存储树中每个节点的 ...

最新文章

  1. android 的弱网测试,Android APP弱网测试问题和解决分析
  2. Android Crash分析工具arm-eabi-addr2line
  3. 牛客网 【每日一题】6月11日题目精讲 背包
  4. 国内外知名工业交换机品牌有哪些?
  5. 中如何设置电气栅格_游戏中的设置界面如何设计?
  6. Linux 内核C -- 第02课:驱动中的指定初始化
  7. python模糊匹配_python 字符串模糊匹配 Fuzzywuzzy
  8. 打算开源一个低代码平台,第四天,包含【工作流,业务流,财务,APQC】。技术栈 React,typescript,java,mysql
  9. FFMPEG推流到RTMP服务器命令
  10. Selenium下载PDF文件实战 2021-07-21
  11. 如何建立工程测量平面控制网?
  12. 傅里叶级数的通俗理解
  13. STL 堆 鱼塘钓鱼
  14. 二清,是“担保支付”,还是“雁过拔毛”
  15. phpstorm官方下载地址
  16. 常用正则表达式(英文单词、数字、中文 、URL 、电话、身份证、输入内容必须以逗号隔开等)
  17. Java继承同时实现接口 以及继承方法的使用
  18. linux 环境变量复制,LINUX系统环境变量PATH ,cp命令 ,mv命令,文档查看cat/more/less/head/tail...
  19. 驱动RGB灯带MCU阐述
  20. VOS3000怎样给对接网关设置按主叫号码计费

热门文章

  1. babel与php,javascript – Babel JS babel-preset-php错误
  2. java 发送 json数据_Java web中怎样取得Android通过post发送的json数据
  3. python 持续集成 教程_dotnet 部署 github 的 Action 进行持续集成|简明python教程|python入门|python教程...
  4. vba 定义数组_excel自定义排序的三种方法
  5. 四因素三水平正交试验表_正交实验设计过程
  6. php定量,javascript - js 无序数组 任意个数 相加之和为定量m?
  7. Cesium:实现漫游飞行
  8. Pannellum:实例之一个简单的例子
  9. list scala 当前位置 遍历_Scala学习七之集合了解
  10. Mybatis 实现MySQL的:无数据插入,有数据更新