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 IPV6正则表达式验证代码
Feb 16 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
Jun 06 PHP
php三维数组去重(示例代码)
Nov 26 PHP
PHP字符串的连接的简单实例
Dec 30 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
php验证身份证号码正确性的函数
Jul 20 PHP
验证坐标在某坐标区域内php代码
Oct 08 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
Dec 21 PHP
php实现的中文分词类完整实例
Feb 06 PHP
PHP巧妙利用位运算实现网站权限管理的方法
Mar 12 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 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新手上路(六)
2006/10/09 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
php字符串分割函数用法实例
2015/03/17 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
浅谈编码,解码,乱码的问题
2016/12/30 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
软件测试工程师面试问题精选
2016/10/28 面试题
违纪检讨书2000字
2014/02/08 职场文书
《散步》教学反思
2014/03/02 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
个人委托书怎么写
2014/09/17 职场文书
师德师风整改措施
2014/10/24 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
Python内置数据类型中的集合详解
2022/03/18 Python
Vue.Draggable实现交换位置
2022/04/07 Vue.js