trie树(前缀树)详解——PHP代码实现
trie树常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。
一、Tire树的基本性质
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
- 每个节点的所有子节点包含的字符都不相同。
Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起,比如我们有[b,abc,abd,bcd,abcd,efg,hii ]这个字符串集合,可以将其构建成下面这棵 Trie 树:

每个节点表示一个字符串中的字符,从根节点到红色节点的一条路径表示一个字符串(红色节点表示是某个单词的结束字符,但不一定都是叶子节点)。这样,我们就可以通过遍历这棵树来检索是否存在待匹配的字符串了
二、如何实现Tire树
Tire主要包含两个操作,一个是将字符串集合构造成 Trie 树。这个过程分解开来的话,就是一个将字符串插入到 Trie 树的过程。另一个是在 Trie 树中查询一个字符串。
Trie 树是个多叉树,在这里用数组来存储一个节点的所有子结点。
Trie树节点类,PHP代码实现:
<?php
/**
* TrieNode.php
* Created on 2019/4/29 14:53
* Created by Wilin
*/ class TrieNode
{
public $data;
public $children = [];
public $isEndingChar = false; public function __construct($data)
{
$this->data = $data;
}
}
Trie树,PHP代码实现:
<?php
/**
* Tire.php
* Created on 2019/4/29 14:57
* Created by Wilin
*/ include "TrieNode.php"; class Tire {
private $root; public function __construct() {
$this->root = new TrieNode('/'); //根节点
} public function getRoot() {
return $this->root;
} public function insert($text) {
$p = $this->root;
for ($i = 0; $i < mb_strlen($text); $i++) {
$index = $data = $text[$i]; if (empty($p->children[$index])) {
$newNode = new TrieNode($data);
$p->children[$index] = $newNode;
}
$p = $p->children[$index];
}
$p->isEndingChar = true;
} public function find($pattern) {
$p = $this->root;
for ($i = 0; $i < mb_strlen($pattern); $i++) {
$index = $data = $pattern[$i]; if (empty($p->children[$index])) {
return false;
}
$p = $p->children[$index];
}
if ($p->isEndingChar == false) {
return false;
}
return true;
}
} $trie = new Tire();
$strings = ['b','abc','abd','bcd','abcd','efg','hii'];
foreach ($strings as $str) {
$trie->insert($str);
}
if ($trie->find('bcd')) {
print "包含这个字符串\n";
} else {
print "不包含这个字符串\n";
}
print_r($trie->getRoot());
打印结果如下:
E:\www\tree\3>php Tire.php
包含这个字符串
TrieNode Object
(
[data] => /
[children] => Array
(
[b] => TrieNode Object
(
[data] => b
[children] => Array
(
[c] => TrieNode Object
(
[data] => c
[children] => Array
(
[d] => TrieNode Object
(
[data] => d
[children] => Array
(
) [isEndingChar] => 1
) ) [isEndingChar] =>
) ) [isEndingChar] => 1
) [a] => TrieNode Object
(
[data] => a
[children] => Array
(
[b] => TrieNode Object
(
[data] => b
[children] => Array
(
[c] => TrieNode Object
(
[data] => c
[children] => Array
(
[d] => TrieNode Object
(
[data] => d
[children] => Array
(
) [isEndingChar] => 1
) ) [isEndingChar] => 1
) [d] => TrieNode Object
(
[data] => d
[children] => Array
(
) [isEndingChar] => 1
) ) [isEndingChar] =>
) ) [isEndingChar] =>
) [e] => TrieNode Object
(
[data] => e
[children] => Array
(
[f] => TrieNode Object
(
[data] => f
[children] => Array
(
[g] => TrieNode Object
(
[data] => g
[children] => Array
(
) [isEndingChar] => 1
) ) [isEndingChar] =>
) ) [isEndingChar] =>
) [h] => TrieNode Object
(
[data] => h
[children] => Array
(
[i] => TrieNode Object
(
[data] => i
[children] => Array
(
[i] => TrieNode Object
(
[data] => i
[children] => Array
(
) [isEndingChar] => 1
) ) [isEndingChar] =>
) ) [isEndingChar] =>
) ) [isEndingChar] =>
)
参考资料:https://www.cnblogs.com/luosongchao/p/3239521.html,https://articles.zsxq.com/id_qa0npqvszcmx.html
trie树(前缀树)详解——PHP代码实现的更多相关文章
- AVL树平衡旋转详解
AVL树平衡旋转详解 概述 AVL树又叫做平衡二叉树.前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉查找树).由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, ...
- 【数据结构与算法】Trie(前缀树)模板和例题
Trie 树的模板 Trie 树的简介 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.他的核心思想是空间换 ...
- 9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第9章 查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚 ...
- css3浏览器私有属性前缀使用详解
什么是浏览器私有属性前缀 CSS3的浏览器私有属性前缀是一个浏览器生产商经常使用的一种方式.它暗示该CSS属性或规则尚未成为W3C标准的一部分. 以下是几种常用前缀 -webkit- -moz- -m ...
- Python - 元组(tuple) 详解 及 代码
元组(tuple) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17290967 元组是存放任意元素集合,不能修 ...
- Python - 字典(dict) 详解 及 代码
字典(dict) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17291329 字典(dict)是表示映射的数据 ...
- 深度学习之卷积神经网络(CNN)详解与代码实现(一)
卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...
- C#的String.Split 分割字符串用法详解的代码
代码期间,把代码过程经常用的内容做个珍藏,下边代码是关于C#的String.Split 分割字符串用法详解的代码,应该对码农们有些用途. 1) public string[] Split(params ...
- laravel 框架配置404等异常页面的方法详解(代码示例)
本篇文章给大家带来的内容是关于laravel 框架配置404等异常页面的方法详解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在Laravel中所有的异常都由Handl ...
- Android java程序员必备技能,集合与数组中遍历元素,增强for循环的使用详解及代码
Android java程序员必备技能,集合与数组中遍历元素, 增强for循环的使用详解及代码 作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 For ...
随机推荐
- 下载根目录下的pdf文件, 浏览器下载
public void outPut(HttpServletRequest request, HttpServletResponse response, Integer type) { ClassPa ...
- vue 中使用阿里iconfont彩色图标
在main.js中 import './assets/images/iconfont/iconfont.css'import './assets/images/iconfont/iconfont.js ...
- #C++初学记录(typedef和define)
typedef的用法 typedef关键字可以用于给数据类型定义一个别名,即可以给long long 定义成ll,也可以给结构体定义,当你定义了一个结构体时,每次创建一个结构体都要使用struct+结 ...
- Netty执行流程分析与重要组件介绍
一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle 处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...
- mysql索引原理及优化(三)
B+Tree原理详解 MyISAM中的 B+Tree (非聚簇索引) MYISAM中叶子节点的数据区域存储的是数据记录的地址 主键索引 辅助索引 MyISAM存储引擎在使用索引查询数据时,会先根据索引 ...
- pip的安装
1.get-pip.py安装 (官方)https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py $wget https: ...
- dotfuscator 在混淆.Net Framework 4.0以上版本的时候报错的解决方法2
在混淆的时候报错了,错误描述大致如下: Could not find a compatible version of ildasm to run on assembly C:\xxx.dll This ...
- dockerfile运行mysql并初始化数据
本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Dockerfile和 ...
- Windows系统因“CredSSP加密Oracle修正”无法远程连接
解决办法如下: 在电脑本机运行(快捷键 Win+R)输入:gpedit.msc 回车: 计算机配置->管理模板->系统->凭据分配->右侧找到“加密Oracle凭据”双击-&g ...
- Mysql中TO_DAYS函数
原文地址:https://blog.csdn.net/sinat_19569023/article/details/50417273 SQL博大精深 TO_DAYS函数 返回一个天数! 啊哈?什么天数 ...