PHP字典树(Trie树)定义与实现方法示例


Posted in PHP onOctober 09, 2017

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

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

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

PHP字典树(Trie树)定义与实现方法示例

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

PHP字典树(Trie树)定义与实现方法示例

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

PHP实现代码:

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP连接MySQL代码的参数说明
Jun 07 PHP
PHP 加密解密内部算法
Apr 22 PHP
Yii学习总结之安装配置
Feb 22 PHP
php中explode的负数limit用法分析
Feb 27 PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 PHP
ThinkPHP连接Oracle数据库
Apr 22 PHP
php 获取文件行数的方法总结
Oct 11 PHP
CI框架常用函数封装实例
Nov 21 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP的mysqli_rollback()函数讲解
Jan 23 PHP
php-7.3.6 编译安装过程
Feb 11 PHP
ThinkPHP5.1验证码功能实现的示例代码
Jun 08 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 #PHP
PHP实现的折半查询算法示例
Oct 09 #PHP
PHP实现的MD5结合RSA签名算法实例
Oct 07 #PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 #PHP
PHP实现打包下载文件的方法示例
Oct 07 #PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 #PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 #PHP
You might like
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
图片完美缩放
2006/09/07 Javascript
简单JS代码压缩器
2006/10/12 Javascript
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
jQuery validate 中文API 附validate.js中文api手册
2010/07/31 Javascript
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
vue filters的使用详解
2018/06/11 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
python threading模块操作多线程介绍
2015/04/08 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
关于Python作用域自学总结
2019/06/10 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
自动化系在校本科生求职信
2013/10/23 职场文书
大四自我鉴定
2014/02/08 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
法定代表人身份证明书
2015/06/18 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL