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运行出现Notice : Use of undefined constant 的完美解决方案分享
Mar 05 PHP
php引用返回与取消引用的详解
Jun 08 PHP
php通过数组实现多条件查询实现方法(字符串分割)
May 06 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
php解析http获取的json字符串变量总是空白null
Mar 02 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
适用于初学者的简易PHP文件上传类
Oct 29 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
Mar 21 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
php微信公众平台交互与接口详解
Nov 28 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
PHP工厂模式的日常使用
Mar 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简单静态页生成过程
2008/03/27 PHP
php在线代理转向代码
2012/05/05 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
javascript计时器详解
2015/02/28 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
React中this丢失的四种解决方法
2019/03/12 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
我的大学生活职业生涯规划
2014/01/02 职场文书
新兵入伍心得体会
2014/09/04 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
优秀员工推荐材料
2014/12/20 职场文书
教研活动主持词
2015/07/03 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
Python 数据可视化之Bokeh详解
2021/11/02 Python
Linux中文件的基本属性介绍
2022/06/01 Servers