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

相关文章

  • php生成静态页面并实现预览功能

    生成静态页面可以有效降低服务器负担,提高网站访问效率。本文将为大家介绍如何使用 PHP 生成静态页面并实现预览功能。 步骤一:生成静态页面 1. 准备工作 首先,您需要创建一个 PHP 页面,用于生成静态页面。我们可以使用 file_put_contents 函数将 PHP 页面生成的 HTML 代码写入一个 HTML 文件中。这里有一个简单的示例: &lt…

    PHP 2023年5月26日
    00
  • PHP大文件分割分片上传实现代码

    理解大文件上传的原理 大文件上传一般采用分片上传的方式,通过对大文件进行分割,分多个请求上传到服务器,最终由服务器将多个分片合并成一个完整的文件。这样做可以降低单个上传请求的大小,避免大文件上传时出现网络波动、服务器负载等问题。 实现思路 (1)前端实现 前端实现分两部分,一部分是将大文件分割成多个小文件,每个小文件在数据上传前进行MD5计算,确保服务器接收…

    PHP 2023年5月26日
    00
  • 浅谈PHP设计模式的原型模式

    简介: 原型模式,属于创建型模式的一种。主要针对对象进行克隆,把被克隆的对象称之为原型,原型模式称之为克隆模式也许更为贴切。用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用场景: 实例化对象的资源开销过大时可直接克隆。 需要循环创建大量对象,此时用克隆也是一个挺不错的选择。 优点: 高性能:如果创建对象的过程复杂,或者消耗大量资源,那么…

    PHP 2023年4月18日
    00
  • php输入流php://input使用示例(php发送图片流到服务器)

    下面是“php输入流php://input使用示例(php发送图片流到服务器)”的完整攻略。 什么是php://input php://input是PHP的输入流,我们可以用它来读取HTTP请求的原始数据。在处理POST请求中的文件上传、JSON数据等特殊请求时,使用php://input可以更加灵活地处理请求中的数据。 示例一:接收POST请求JSON数据…

    PHP 2023年5月26日
    00
  • php中使用PHPExcel读写excel(xls)文件的方法

    这里就为你详细讲解一下”php中使用PHPExcel读写excel(xls)文件的方法”的完整攻略。 1. 什么是PHPExcel PHPExcel 是一个开源软件包,用于在 PHP 应用程序中读取和写入 xls 文件。它可以支持 Excel 2007+ 文件格式,包括 .xlsx, .xlsm 以及 .xlsb 格式。使用 PHPExcel,您可以为您的应…

    PHP 2023年5月26日
    00
  • 详解各种PHP函数漏洞

    下面是详解各种PHP函数漏洞的完整攻略。 1. PHP函数漏洞概述 PHP是一种常用的Web编程语言,而PHP语言中有很多常用的函数,这些函数在网站开发中有着重要的用途。但是在使用函数的过程中会经常出现安全问题,这些问题被成为PHP函数漏洞。 PHP函数漏洞通常是由于函数使用不当或者参数传递错误导致的,在攻击者利用PHP函数漏洞之后,可以获取站点的敏感信息、…

    PHP 2023年5月27日
    00
  • PHP 网络开发详解之远程文件包含漏洞

    PHP 网络开发详解之远程文件包含漏洞 远程文件包含(RFI)属于一种常见的漏洞类型,攻击者通过该漏洞可以执行任意代码,甚至获取控制权。以下将详细讲解如何利用RFI漏洞实现攻击,并给出两个实例: 概述 远程文件包含漏洞是指攻击者通过指定一段远程URL链接的方式,使服务器端动态脚本在执行时将含有攻击代码的远程文件包含进来,进而实现在服务器上执行恶意代码的行为。…

    PHP 2023年5月26日
    00
  • php常用字符函数实例小结

    下面我将详细讲解“php常用字符函数实例小结”的完整攻略。 概述 在PHP开发中,常常需要对字符串进行操作。PHP提供了许多字符串函数,比如:strlen()、substr()、strpos()等等,这些函数在对字符串进行操作时十分有用。本文将对PHP中一些常用的字符串函数做一个简单的介绍。 strlen()函数 strlen()函数用于获取字符串的长度。 …

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