这篇文章主要介绍了PHP字典树(Trie树)定义与实现方法,简单描述了字典树的概念并结合实例形式分析了字典树的定义与使用方法,需要的朋友可以参考下

本文实例讲述了PHP字典树(Trie树)定义与实现方法。分享给大家供大家参考,具体如下:

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

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

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

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

PHP实现代码:

class 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 . '
'; //输出带上搜索前缀

}

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于PHP自定义序列化接口Serializable的用法分析

关于PHP如何实现链表的定义与反转功能

php 字典树,关于PHP字典树的定义与实现方法相关推荐

  1. 字典树实现_trie 字典树的实现方法

    trie 字典树 (前缀树) 什么是字典树 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文 ...

  2. 前缀树(字典树,单词查找树,Trie树)

    参考网址:https://blog.csdn.net/u013949069/article/details/78056102?utm_source=copy 概述 前缀树又名字典树,单词查找树,Tri ...

  3. 012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树

    一.哈希树概述 1.1..其他树背景 二叉排序树,平衡二叉树,红黑树等二叉排序树.在大数据量时树高很深,我们不断向下找寻值时会比较很多次.二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都 ...

  4. 字典树(单词查找树、Trie)

    文章目录 单词查找树 1 基本概念 2 字典树的应用 3 字典树基本操作的实现 4 参考资料 单词查找树 1 基本概念   百度百科对字典树的介绍为:是一种树形结构,是一种哈希树的变种.   < ...

  5. 【字典树】2828 - 字典树

    字典树 先上个定义. 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是 ...

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

    目录 字典树的概念 字典树的逻辑 字典树的实现 易混点剖析 代码示例 字典树的概念 字典树(Trie)是一种空间换时间的数据结构,是一棵关于"字典"的树.主要用于统计.排序和保存大 ...

  7. 字符串处理【字典树】 - 原理 字典树详解

    字符串处理[字典树] - 原理 字典树详解 字典树,又称Trie树.单词查找树,是一种树形结构,也是哈希树的一种变种,主要用于统计.排序和存储大量的字符串(但不限于字符串),所以经常被搜索引擎系统用于 ...

  8. 字典树,01字典树,可持续化01字典树(总结+例题)

    目录 字典树 01字典树 字典树例题: power oj 2390: 查单词 HDU 1671 Phone List HDU 1004Let the Balloon Rise HDU 1075 Wha ...

  9. 字典树 与 01字典树

    字典树可以降低空间复杂度:01字典树可以降低时间复杂度. 字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经 ...

  10. 字典树01字典树专题对字典树的理解

    对于字典树和01字典树的一点理解: 首先,字典树建树的过程就是按照每个数的前缀来的,如果你要存储一个全小写字母字符串,那么这个树每一个节点最多26个节点,这样的话,如果要找特定的单词的话,按照建树的方 ...

最新文章

  1. [leetcode]_Integer to Roman
  2. request获取各种路径 转,记下来免得 以后忘记了。
  3. 【青海】2021年下半年软考报考时间及通知
  4. 支付宝服务窗的简单开发体会
  5. 部署LAMP-LAMP平台集成
  6. Spring Boot Admin的使用
  7. python调用公共方法_common: 这是一个Python的公共工具类,集成了各种主要的python常用方法...
  8. 肺功能曲线图怎么看_如何看肺功能结果报告单
  9. 高性能微服务网关.NETCore客户端Kong.Net开源发布
  10. 【动态规划】01背包问题
  11. 《Java安全编码标准》一2.11 IDS10-J不要拆分两种数据结构中的字符串
  12. SpringBoot入门程序HelloWorld
  13. 20160801java学习重点:函数
  14. 【SaaS - Export项目】23 - Shiro加密实现登录注销,MD5加密算法,加盐加密,shiro凭证匹配器,实现增加用户密码密文存储数据库,登录时通过加盐加密对密文进行比较
  15. wget下载报错403
  16. Android WAP NET 区别
  17. python大漠游戏多开_python游戏脚本多开天才生成器
  18. 安装在ntfs分区的linux,从硬盘NTFS分区安装mandriva linux
  19. Android jetpack DataBinding 与RecyclerView
  20. Luogu P4484 [BJWC2018]最长上升子序列

热门文章

  1. 微信支付指纹上传服务器,指纹安全吗,支付宝、微信支付会上传用户的指纹吗...
  2. python模拟ios点击_弱弱的问下,ios的捷径可以实现模拟点击吗?
  3. java图形界面美化_在Java中使用图片实现GUI的美化.doc
  4. 美电信运营商推云计算业务
  5. 1386 - Cellular Automaton
  6. java一些基础知识点
  7. 截取字符串中某一段数据
  8. 2020校园招聘公司列表!计算机/互联网 技术类岗位!,一直更新!
  9. Android自定义dialog对话框悬浮在界面上
  10. CSGO显示FPS(帧数)指令集设置调用方法 2020年最新版本CSGO教程