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 ...
随机推荐
- 菜鸟学IT之Hadoop综合大作业
Hadoop综合大作业 作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 1.将爬虫大作业产生的csv文件上传到HDF ...
- 微信小程序全局设置分享内容
微信小程序每个页面都可以在onShareAppMessage中设置分享内容,如果想要全局设置成一样的分享内容如何设置呢? 在app.js中新增以下方法: //重写分享方法 overShare: fun ...
- CgLib实现AOP
一.CgLib实现动态代理的例子 1.创建Person类 package com.example.cglib; public class Person { public void study(){ S ...
- Redis自定义fastJson Serializer
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { public static fi ...
- Cisco设备配置SSH登录
一 试验拓扑 二 Server配置 ①配置hostname和domain name 因为rsa的秘钥是用hostname和domain name产生的 Router(config)#host Serv ...
- ELK - logstash 多个配置文件及模板的使用
目录 - 前言 - 多配置文件的实现方式 - 为logstash 增加模板 - 将 logstash 作为服务启动 1. 前言 在使用 logstash 编写多个配置文件,写入到 elasticsea ...
- [LeetCode] 200. Number of Islands 岛屿的数量
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...
- [LeetCode] 324. Wiggle Sort II 摆动排序 II
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
- 切换 Python2 Python3
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternati ...
- 【LeetCode】删除链表的倒数第N个节点【双指针法】
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...