PHP字典树(Trie树)定义与实现方法示例

PHP字典树(Trie树)定义与实现方法示例

定义

Trie树,也叫字典树或者单词查找树,是一种树形数据结构,常用于统计或者排序字符串数据集。它能够高效地支持字符串数据的插入、查找和前缀搜索等操作,时间复杂度与字符串长度有关,对于一定量的字符串集合,它的查找效率比哈希表更高。

Trie树与二叉查找树最大的不同在于,Trie树每个节点不仅仅存储一个关键码,而是存储一个关键码序列。Trie树的核心思想是利用字符串之间的公共前缀,将重复的前缀合并在一起,从而减少了存储空间,提高了查找效率。

实现

定义类

我们定义一个Trie树类TrieTree,它有以下三个属性:

  • $root:根节点,初始时为空;
  • $count:Trie树中单词的数量,初始为0;
  • $size:Trie树中节点的数量,初始为1(根节点)。
class TrieTree {
    private $root;
    private $count;
    private $size;

    public function __construct() {
        $this->root = new TrieNode();
        $this->count = 0;
        $this->size = 1;
    }
}

定义节点类

我们定义Trie树中的节点类TrieNode,它有以下三个属性:

  • $char:该节点存储的字符;
  • $isEnd:是否为单词结尾,初始为false;
  • $children:该节点的子节点,初始为空数组。
class TrieNode {
    public $char;
    public $isEnd;
    public $children;

    public function __construct($char = null) {
        $this->char = $char;
        $this->isEnd = false;
        $this->children = [];
    }
}

插入单词操作

Trie树的插入操作需要遍历整个单词,然后将单词的每个字符依次插入到Trie树中。

public function insert($word) {
    $node = $this->root;
    for ($i = 0; $i < strlen($word); $i++) {
        $char = $word[$i];
        if (!isset($node->children[$char])) {
            $node->children[$char] = new TrieNode($char);
            $this->size++;
        }
        $node = $node->children[$char];
    }
    if (!$node->isEnd) {
        $node->isEnd = true;
        $this->count++;
    }
}

查找单词操作

Trie树的查找操作需要遍历整个单词,然后判断每个字符是否存在于Trie树中。

public function search($word) {
    $node = $this->root;
    for ($i = 0; $i < strlen($word); $i++) {
        $char = $word[$i];
        if (!isset($node->children[$char])) {
            return false;
        }
        $node = $node->children[$char];
    }
    return $node->isEnd;
}

查找前缀操作

Trie树的查找前缀操作需要遍历前缀,然后判断每个字符是否存在于Trie树中。

public function startsWith($prefix) {
    $node = $this->root;
    for ($i = 0; $i < strlen($prefix); $i++) {
        $char = $prefix[$i];
        if (!isset($node->children[$char])) {
            return false;
        }
        $node = $node->children[$char];
    }
    return true;
}

示例

示例1:插入单词和查找单词操作

我们创建一个Trie树对象,插入若干个单词,然后查找某些单词是否存在。

$trie = new TrieTree();
$trie->insert('apple');
$trie->insert('banana');
$trie->insert('orange');
$trie->insert('pear');

echo $trie->search('apple'); // true
echo $trie->search('pear'); // true
echo $trie->search('watermelon'); // false

示例2:查找前缀操作

我们创建一个Trie树对象,插入一些单词,然后查找以某个前缀开头的单词个数。

$trie = new TrieTree();
$trie->insert('apple');
$trie->insert('banana');
$trie->insert('orange');
$trie->insert('pear');

echo $trie->startsWith('a'); // true
echo $trie->startsWith('ab'); // false
echo $trie->startsWith('pe'); // true

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP字典树(Trie树)定义与实现方法示例 - Python技术站

(0)
上一篇 2天前
下一篇 2天前

相关文章

  • php-fpm.conf配置文件中文说明详解及重要参数说明

    让我来详细讲解一下“php-fpm.conf配置文件中文说明详解及重要参数说明”的完整攻略。 前言 php-fpm 是 NGINX 下最常用的 PHP 解释器管理程序,是一个高效的 PHP 解决方案。php-fpm 配置文件 php-fpm.conf 可以控制 php-fpm 运行时的一些行为以及基础设施设置。 配置文件结构 php-fpm.conf 配置文…

    PHP 2天前
    00
  • php单态设计模式(单例模式)实例

    关于“php单态设计模式(单例模式)实例”的完整攻略,我可以提供以下内容: 什么是单例模式? 单例模式是一种常见的设计模式,其核心思想是在整个应用程序中,确保某个类只有一个实例,并且提供单一的全局访问点,以方便其他对象使用。 单例模式的实现方式 单例模式的实现方式有很多种,其中比较常见的实现方式有两种: 饿汉模式 饿汉模式是指在程序启动时就立即加载并创建单例…

    PHP 2天前
    00
  • php 如何获取文件的后缀名

    获取文件后缀名,可以通过PHP的字符串处理函数实现,通常可以分为两种方式获取。 方法一:使用pathinfo函数 pathinfo()函数可以返回文件路径的基本信息,即路径,文件名和扩展名等,通过该函数可以轻松获取文件的扩展名。示例代码如下: <?php $file_path = "/var/www/html/test.php"; …

    PHP 2天前
    00
  • PHP执行系统命令函数实例讲解

    PHP执行系统命令函数实例讲解 介绍 PHP提供了一些函数,可以在PHP脚本中调用系统命令并执行它们。这对于需要调用其他程序或操作系统功能的任务非常有用,例如在PHP脚本中调用命令行工具或运行系统命令等。 在此教程中,我们将学习如何使用PHP内置函数来执行系统命令。 exec函数 exec函数用于执行系统命令,并返回最后一行输出。下面是exec函数的语法: …

    PHP 6天前
    00
  • php中输出json对象的值(实现方法)

    在 PHP 中,可以使用 json_encode() 函数将数组或对象转换为 JSON 格式的字符串。而输出 JSON 对象的值可以通过将 JSON 格式字符串转换为 PHP 对象或数组,然后使用对象或数组中的属性或键值来获取值。 以下是输出 JSON 对象的值的实现方法: 1. 将 JSON 格式字符串转换为 PHP 对象 首先,使用 json_decod…

    PHP 3天前
    00
  • 微信小程序实现点击图片放大预览

    下面是关于微信小程序实现点击图片放大预览的完整攻略: 1. 基本思路 要实现微信小程序上的图片放大预览,我们需要使用微信小程序开发中的 wx.previewImage() 方法,该方法可以让用户点击某张图片后全局预览。 首先,我们需要为每个可点击的图片绑定一个点击事件,并在事件中调用 wx.previewImage() 方法预览图片。 其次,我们需要为每个可…

    PHP 5天前
    00
  • 一个经典的PHP验证码类分享

    让我详细讲解一下“一个经典的PHP验证码类分享”的完整攻略。 简介 在网站开发过程中,为了防止恶意的机器人或爬虫攻击,我们常常需要使用验证码来进行验证。本文将分享一个基于PHP的验证码类的实现方式,这个验证码类可以生成包含数字和字母的图片,有效地进行验证。 代码实现 步骤一:基础设置 在生成验证码图像之前,我们需要先基于PHP代码进行一些设置,例如生成一个随…

    PHP 3天前
    00
  • PHP 正则表达式特殊字符 [:alnum:] [:alpha:] 等

    正则表达式是一种强大的文本处理工具,PHP 中也内置了对正则表达式的支持。在正则表达式中,有一些特殊字符可以用来匹配不同类型的字符,这些特殊字符称为字符类。 在字符类中,有一些常用的字符类可以用来匹配特定类型的字符,例如: [:alnum:]:匹配任意字母或数字字符。 [:alpha:]:匹配任意字母字符。 [:digit:]:匹配任意数字字符。 [:spa…

    PHP 3天前
    00
  • mac系统下安装多个php并自由切换的方法详解

    下面我将提供一份详细的“mac系统下安装多个php并自由切换的方法详解”的攻略。 简介 在开发过程中,我们可能会为了测试不同版本的PHP而需要在同一台电脑上安装多个版本的PHP。而同时,也需要切换这些版本以进行测试。本攻略将分享安装和自由切换多个PHP版本的方法。 步骤 以下是安装多个PHP版本的步骤: 步骤一:安装 Homebrew 在mac系统上,我们可…

    PHP 5天前
    00
  • php代码收集表单内容并写入文件的代码

    下面是“PHP代码收集表单内容并写入文件的代码”的完整攻略: 1. 理解表单与文件操作基础 在学习代码实现之前,需要掌握以下两个基础知识: HTML表单:HTML表单(Form)是一个包含表单元素的区域,用户可以在其中输入数据并提交。HTML表单中的每个表单元素都必须有一个name属性,以便PHP代码在后台获取输入的数据。 文件操作:PHP通过内置的文件操作…

    PHP 5天前
    00