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 相关文章推荐
DOMXML函数笔记
Oct 09 PHP
你可能不知道PHP get_meta_tags()函数
May 12 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
PHP socket 模拟POST 请求实例代码
Jul 18 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 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 mkdir()定义和用法
2009/01/14 PHP
日常整理PHP中简单的图形处理(经典)
2015/10/26 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
五段实用的js高级技巧
2011/12/20 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
Python中的作用域规则详解
2015/01/30 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
踏青活动策划方案
2014/08/19 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
Golang: 内建容器的用法
2021/05/05 Golang
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android