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读取PDF内容配合Xpdf的使用

    下面我就来详细讲解“PHP读取PDF内容配合Xpdf的使用”的完整攻略。 什么是Xpdf Xpdf是一款开源的PDF阅读器,它提供了一系列的命令行工具,可以用于进行PDF解析、提取等操作。其中最常用的两个工具是pdfinfo和pdftotext,前者用于获取PDF文件的基本信息,后者用于将PDF文件转换为文本文件。 PHP读取PDF内容的基本步骤 通过PHP…

    PHP 2023年5月26日
    00
  • PHP用反撇号执行外部命令

    使用反撇号可以执行外部命令,这在某些情况下可以非常方便。不过,使用反撇号时必须特别小心,确保输入的命令不会引起安全隐患。 以下是使用反撇号执行外部命令的步骤: 1. 准备外部命令 在使用反撇号执行外部命令之前,你需要先确定你要执行的外部命令。这个命令可以是任何可执行的命令,比如grep, ls, curl等等。在准备命令时,一定要注意没有任何安全隐患,否则可…

    PHP 2023年5月26日
    00
  • 解析用PHP读写音频文件信息的详解(支持WMA和MP3)

    解析用PHP读写音频文件信息的详解(支持WMA和MP3) 背景介绍 随着音频流行,数字音频文件越来越受欢迎。通常,这些文件存储有关音频的元数据,例如标题,表演者和发行日期等信息。在PHP中,有多种方法可以读取和写入这些元数据,例如ID3v2标签,APEv2标签和Windows Media Audio(WMA)标记,本文将详细讲解如何解析WMA或MP3文件中的…

    PHP 2023年5月26日
    00
  • 详解php内存管理机制与垃圾回收机制

    详解PHP内存管理机制与垃圾回收机制 前言 PHP是一种高级编程语言,其自动内存管理和垃圾回收机制可以帮助开发者避免手动内存管理的麻烦,但也需要开发者了解其内存管理机制和垃圾回收机制,才能更好地编写高效的代码。 PHP内存管理机制 PHP内存管理机制是通过Zend Memory Manager实现的,其主要分配和管理以下几种类型的内存: Per-Reques…

    PHP 2023年5月24日
    00
  • PHP编码规范-php coding standard

    PHP编码规范,也被称为PHP Coding Standard,是指为了保持PHP代码的统一性和可读性而约定的一系列规范。它定义了变量命名、代码缩进、函数库的使用等方面的规则。在团队协作、代码交接、代码维护等过程中,遵守PHP编码规范能够提高代码质量和效率,减少出错率。 以下是PHP编码规范的完整攻略: 1. 缩进 每个缩进层次使用4个空格,而不是Tab键。…

    PHP 2023年5月27日
    00
  • PHP 数组黑名单/白名单实例代码详解

    关于“PHP 数组黑名单/白名单实例代码详解”,我会进行以下几个方面的讲解: 简要介绍黑名单/白名单 详细阐述黑名单/白名单的实现代码 附带两个示例说明 1. 简要介绍黑名单/白名单 在编写程序时,我们经常需要对用户输入的数据进行过滤,以防止潜在的安全漏洞。其中,一种比较常用的做法是采用黑名单/白名单的方式进行过滤。 所谓黑名单/白名单,就是对用户输入的数据…

    PHP 2023年5月23日
    00
  • 浅析PHP程序设计中的MVC编程思想

    浅析PHP程序设计中的MVC编程思想 在PHP程序设计中,MVC是一种常见的编程思想,该思想将应用程序分为三个组件:Model(模型)、View(视图)和Controller(控制器)。以下是详细讲解MVC编程思想的完整攻略。 MVC模式的基本概念 Model(模型) Model是指应用程序中的数据、业务逻辑和数据库访问逻辑。Model仅负责数据和业务逻辑的…

    PHP 2023年5月27日
    00
  • PHP文件下载类

    本文将为大家讲解如何使用PHP文件下载类进行文件下载。下面将按照以下步骤进行讲解: 什么是PHP文件下载类 安装PHP文件下载类 如何使用PHP文件下载类 1. 什么是PHP文件下载类 PHP文件下载类是一种用于下载文件的PHP类库,可以通过PHP语言实现文件下载的功能。它可以通过HTTP协议直接下载文件,支持断点续传、范围下载、流式读取等功能。 2. 安装…

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