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 相关文章推荐
dedecms 制作模板中使用的全局标记图文教程
Mar 11 PHP
实用函数10
Nov 08 PHP
php printf输出格式使用说明
Dec 05 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
Feb 17 PHP
解析PHP提交后跳转
Jun 23 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
May 26 PHP
PHP序列化操作方法分析
Sep 28 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
Oct 09 PHP
TP5框架简单登录功能实现方法示例
Oct 31 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
2009/06/29 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
教你在header中隐藏php的版本信息
2016/08/10 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
Python中字符串的修改及传参详解
2016/11/30 Python
Python语言快速上手学习方法
2018/12/14 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
python中return不返回值的问题解析
2020/07/22 Python
浅谈Python __init__.py的作用
2020/10/28 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
数字漫画:comiXology
2020/06/13 全球购物
电脑租赁公司创业计划书
2014/01/08 职场文书
篮球社团活动总结
2014/06/27 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书