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去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
浅析php中jsonp的跨域实例
Jun 21 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
PHP session_start()问题解疑(详细介绍)
Jul 05 PHP
PHP错误和异长常处理总结
Mar 06 PHP
php上传图片存入数据库示例分享
Mar 11 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
分享下php5类中三种数据类型的区别
Jan 26 PHP
php实现的日历程序
Jun 18 PHP
ThinkPHP控制器详解
Jul 27 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
Oct 17 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
模仿OSO的论坛(五)
2006/10/09 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
2019/10/13 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
Python数据类型详解(一)字符串
2016/05/08 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
Python常用特殊方法实例总结
2019/03/22 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
Python实现图片批量加入水印代码实例
2019/11/30 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
Python如何在bool函数中取值
2020/09/21 Python
python switch 实现多分支选择功能
2020/12/21 Python
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
专科应届生求职信
2013/11/24 职场文书
机械制造专业个人的自我评价
2013/12/28 职场文书
质量月活动策划方案
2014/03/10 职场文书
银行委托书范本
2014/04/04 职场文书
医德考评自我评价
2014/09/14 职场文书
护士先进个人总结
2015/02/13 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
毕业实习证明范本
2015/06/16 职场文书
python开发制作好看的时钟效果
2022/05/02 Python