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生成随机数或者字符串的代码
Sep 05 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
基于empty函数的判断详解
Jun 17 PHP
解析php中的escape函数
Jun 29 PHP
ThinkPHP CURD方法之where方法详解
Jun 18 PHP
php设计模式之简单工厂模式详解
Sep 04 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
Nov 19 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
Laravel 5框架学习之Laravel入门和新建项目
Apr 07 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
PHP双向链表定义与用法示例
Jan 31 PHP
PHP命名空间定义与用法实例分析
Aug 14 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
Cygwin中安装PHP方法步骤
2015/07/04 PHP
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
JQuery对表单元素的基本操作使用总结
2014/07/18 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
jQuery随机密码生成的方法
2015/03/09 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
2017/01/03 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
详解Python编程中包的概念与管理
2015/10/16 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Python实现完整的事务操作示例
2017/06/20 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
德国自行车商店:Tretwerk
2019/06/21 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
一夜的工作教学反思
2014/02/08 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
社区消防工作实施方案
2014/03/21 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
骨干教师申报材料
2014/12/17 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
撤诉状格式范本
2015/05/19 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python