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 相关文章推荐
五款常用mysql slow log分析工具的比较分析
May 22 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
PHP传参之传值与传址的区别
Apr 24 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
Laravel框架实现抢红包功能示例
Oct 31 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 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调用Oracle存储过程
2006/10/09 PHP
php中对2个数组相加的函数
2011/06/24 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
js确定对象类型方法
2012/03/30 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
js实现图片轮播效果
2015/12/19 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
微信分享调用jssdk实例
2017/06/08 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
2019/03/30 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
园林设计师自荐信
2013/11/18 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
写字楼租赁意向书
2014/07/30 职场文书
银行求职信模板
2015/03/20 职场文书
办公室岗位职责范本
2015/04/11 职场文书
2015年财务科工作总结范文
2015/05/13 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书