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

yizhihongxing

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)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • php中的三元运算符使用说明

    下面是 “PHP中的三元运算符使用说明” 的完整攻略: 什么是三元运算符 PHP中的三元运算符(?:)用于简洁地对比两个值,并且返回一个条件成立或不成立的值。它的基本语法如下: $variable = (condition) ? true_value : false_value; 其中,($condition)是需要判断的条件语句,true_value的值在…

    PHP 2023年5月26日
    00
  • 将酷狗krc歌词解析并转换为lrc歌词php源码

    将酷狗KRC歌词解析并转换为LRC歌词,可以通过PHP来实现。以下是实现该功能的完整攻略: 1. 确认需求 在开始编写代码之前,我们需要明确自己的需求。在此处,需求就是将酷狗KRC格式的歌词解析并转换为LRC格式的歌词。 2. 分析KRC格式歌词 在开始转换KRC格式歌词之前,我们需要先了解KRC格式的歌词结构。KRC格式歌词是一种二进制格式,它由两部分组成…

    PHP 2023年5月28日
    00
  • PHP加密解密函数详解

    PHP加密解密函数详解 在Web开发中,常常需要处理用户输入的敏感信息,而其中保护用户隐私的一种方式就是加密。PHP语言作为一门多用途的脚本语言,提供了许多加密解密函数。 本文将详细讲解一些常用的PHP加密解密函数,帮助开发者更好地保护用户隐私。 base64加密解密函数base64_encode与base64_decode PHP内置函数base64_en…

    PHP 2023年5月26日
    00
  • 小程序微信支付功能配置方法示例详解【基于thinkPHP】

    下面我将详细讲解“小程序微信支付功能配置方法示例详解【基于thinkPHP】”的完整攻略。 标题 小程序微信支付功能配置方法示例详解【基于thinkPHP】 概述 小程序微信支付是非常实用的功能,通过支付可以实现收费的需求。本文将详细讲解小程序微信支付的配置方法,并提供基于thinkPHP框架的示例代码。 步骤 首先,在小程序管理后台开通微信支付功能,并获得…

    PHP 2023年5月23日
    00
  • PHP中__LINE__,__FILE__,__DIR__等常用魔术常量实例讲解

    在PHP中,LINE、FILE、__DIR__等常用魔术常量是预定义的特殊常量,它们提供了有用的信息例如行号、当前文件名和当前目录路径等。下面是这些常量的详细使用方法和示例。 1. __LINE__常量 __LINE__常量返回当前行号。例如,我们可以在PHP脚本中使用__LINE__常量输出当前行号,示例如下: echo "The current…

    PHP 2023年5月12日
    00
  • 100多行PHP代码实现socks5代理服务器[2]

    100多行PHP代码实现socks5代理服务器[2] 简介 在本文中,我们将介绍如何使用100多行PHP代码构建一个简单的socks5代理服务器。使用socks5代理服务器可以保护用户的隐私和安全,并帮助他们绕过网络审查。 准备工作 在开始构建代理服务器之前,请确保你已经安装了PHP,并了解如何在你的本地计算机上运行PHP文件。在这里,我将使用XAMPP作为…

    PHP 2023年5月27日
    00
  • PHP常用技巧总结(附函数代码)

    PHP常用技巧总结 一、字符串处理 1. 字符串反转 可以使用strrev()函数来反转字符串: $string = "Hello World!"; $reversed = strrev($string); echo $reversed; // 输出 "!dlroW olleH" 2. 字符串截取 我们常常需要从一个字…

    PHP 2023年5月24日
    00
  • 微信小程序网络请求wx.request详解及实例

    微信小程序网络请求wx.request详解及实例 在微信小程序中,我们经常需要与服务器进行交互获取数据。而微信提供了wx.request方法用于实现网络请求。本文将详细介绍wx.request的使用方法及实例说明。 wx.request方法详解 语法 wx.request(Object object) 参数说明 Object object: 请求的相关参数,…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部