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 array 的加法操作代码
Jul 24 PHP
php中通过虚代理实现延迟加载的实现代码
Jun 10 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
Mar 27 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
PHP临时文件的安全性分析
Jul 04 PHP
php获取当月最后一天函数分享
Feb 02 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
Feb 15 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 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
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python的id()函数介绍
2013/02/10 Python
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
python生成随机密码或随机字符串的方法
2015/07/03 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
利用python如何在前程无忧高效投递简历
2019/05/07 Python
python读写csv文件方法详细总结
2019/07/05 Python
python实现集中式的病毒扫描功能详解
2019/07/09 Python
python如何实现单链表的反转
2020/02/10 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
python基于win32api实现键盘输入
2020/12/09 Python
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
教师节宣传方案
2014/05/23 职场文书
悬空寺导游词
2015/02/05 职场文书
骨干教师个人总结
2015/02/11 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
实习生辞职信范文
2015/03/02 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers