​这篇文章介绍一下字典树的实现原理,又称单词查找树、Trie树,是一种树形构造,是一种哈希树的变种。典型利用是用于统计,排序和保留大量的字符串(但不仅限于字符串),所以常常被搜索引擎零碎用于文本词频统计。它的长处是:利用字符串的公共前缀来缩小查问工夫,最大限度地缩小无谓的字符串比拟,查问效率比哈希树高。

1.字典树(Trie)示意图

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

2.节点定义

class Node{

public $isWord;

public $value;//能够存储示意其余信息

public $next; //这是一颗 Map 树,指向其余 25 个字母

public function __construct(){

$this->next = new BinarySearchTreeMap();

}

}

3.Trie 字典树类定义

如下定义了一个字典树(Trie),其中add() 办法能够向 字典树 中增加单词,contains() 能够查问 字典树(Trie) 中是否蕴含某个单词,isPrefix() 办法能够判断字典树上是否有指定字符串前缀的单词:

require $root . "/Map/BinarySearchTreeMap.php";

/**

* 字典树

* Class Trie

*/

class Trie

{

private $root = null;

private $size;

public function __construct() {

$this->root = new TrieNode();

}

/**

* 向字典树中增加

* @param string $word向字段树中增加元素

*/

public function add(string $word, $value) {

$node = $this->root;

for ($i = 0; $i < strlen($word); $i++) {

$c = $word[$i];

if ($node->next->get($c) == null) {

$node->next->add($c, new TrieNode($value));

}

$node = $node->next->get($c);

}

if (!$node->isWord) {

$node->isWord = true;

$this->size++;

}

}

/**

* 查看单词 word 是否存在 Trie 树中

* @param $word

*/

public function contains($word) {

$node = $this->root;

for ($i = 0; $i < strlen($word); $i++) {

$c = $word[$i];

if ($node->next->get($c) == null) {

return false;

}

$node = $node->next->get($c);

}

if ($node->isWord) {

return true;

} else {

return false;

}

}

/**

* 获取字段树节点信息

* @param $word

*/

public function get($word) {

$node = $this->root;

for ($i = 0; $i < strlen($word); $i++) {

$c = $word[$i];

if ($node->next->get($c) == null) {

return null;

}

$node = $node->next->get($c);

}

return $node->value;

}

/**

* 判断某个字符串是否为单词前缀

* @param string $prefix

* @return bool

*/

public function isPrefix(string $prefix) {

$node = $this->root;

for ($i = 0; $i < strlen($prefix); $i++) {

$c = $prefix[$i];

if ($node->next->get($c) == null) {

return false;

}

$node = $node->next->get($c);

}

return false;

}

public function getSize() {

return $this->size;

}

}

class TrieNode

{

public $isWord = false;

public $next;

public $value = null;

public function __construct($value = null) {

$this->value = $value;

$this->next = new BinarySearchTreeMap();

}

}

4.输入演示

require 'Trie.php';

$trie = new Trie();

$trie->add('qsx',123);

$trie->add('dog',456);

$trie->add('cat',789);

$trie->add('else',111);

$trie->add('good',111);

var_dump($trie->contains('qsx'));

var_dump($trie->contains('dog'));

var_dump($trie->contains('aaaa'));

var_dump($trie->contains('ddd'));

var_dump($trie->get('qsx'));

var_dump($trie->get('cat'));

var_dump($trie->get('dog'));

var_dump($trie->get('good'));

var_dump($trie->isPrefix('go'));

var_dump($trie->isPrefix('goo'));

var_dump($trie->isPrefix('goop'));

代码仓库 :https://gitee.com/love-for-po…

扫码关注爱因诗贤

php 字典树,关于php:数据结构PHP-字典树Trie的实现相关推荐

  1. 树的结构 数据结构_段树| 数据结构

    树的结构 数据结构 What is a segment tree? 什么是段树? A segment tree is a full binary tree where each node repres ...

  2. LSM树——Log-Structured Merge-Tree数据结构、LSM树设计思想、LSM的数据写入操作、LSM的数据查询操作

    LSM树数据结构 简介 传统关系型数据库,一般都选择使用B+树作为索引结构,而在大数据场景下,HBase.Kudu这些存储引擎选择的是LSM树.LSM树,即日志结构合并树(Log-Structured ...

  3. 英文字典。怎样设计数据结构

    发信人: playboyer (cuckoo), 信区: Algorithm 标  题: Re: 再问个N久前的面试题 发信站: 水木社区 (Thu Dec  6 20:16:08 2007), 站内 ...

  4. [数据结构] 常用的树型结构

    这篇文章写得不错原文链接: 数据结构中各种树 - xin Tech - 博客园 数据结构中各种树 阅读目录 1. 二叉树 2. 二叉查找树 3. 平衡二叉树 3.1 平衡查找树之AVL树 3.2 平衡 ...

  5. 分门别类刷leetcode——高级数据结构(字典树,前缀树,trie树,并查集,线段树)

    目录 Trie树(字典树.前缀树)的基础知识 字典树的节点表示 字典树构造的例子 字典树的前序遍历 获取字典树中全部单词 字典树的整体功能 字典树的插入操作 字典树的搜索操作 字典树的前缀查询 字典树 ...

  6. 数据结构之字典树Trie

    文章目录 Trie 字典树 前缀树 什么是Trie 基本概念 基本性质 应用场景 优点 手写一个trie Trie字典树的前缀查询 实现Trie(前缀树) LeetCode208 添加与搜索单词 - ...

  7. 基础数据结构(二):字典树、并查集、堆、哈希表、字符串的哈希方式、STL的常见容器及其接口

    文章目录 一.字典树Trie 1 原理 2 Trie字符串统计 3 [LeetCode 208. 实现 Trie (前缀树)](https://leetcode-cn.com/problems/imp ...

  8. 【数据结构】字典树TrieTree图文详解

    问题引入 现在,我给你n个单词,然后进行q次询问,每一次询问一个单词b,问你b是否出现在n个单词中,你会如何去求呢? 暴力搜索?但是我们如果这么做的话时间复杂度一下就高上去了.大家都是成熟的ACMer ...

  9. 【前缀树】C++ 数据结构 字典树

    之前有段时间力扣天天出字典树,当时写得特别熟练,几个月没做都忘得差不多了--今天又出了相关题目,正好复习一下. 文章目录 一.前缀树是什么? 二.实现前缀树 三.例题:添加与搜索单词 总结 一.前缀树 ...

最新文章

  1. CvBlobTrackerCC 多目标跟踪算法简析
  2. c语言exit在哪个头文件_C语言函数执行成功时,返回1和返回0,究竟哪个好?
  3. 西安java招聘_西安招聘 | 陕西安控科技公司招聘(员工宿舍、节日福利、餐补)...
  4. 区块链80%项目靠同一个故事拿钱,但标准链说最坏的时机就是好的开始
  5. 七十五、React环境搭建,目录文件分析和JSX
  6. RS(2)--从文本数据到用户画像
  7. 承担集团数万应用、研发人员日常工作,阿里持续交付平台的设计、迭代之道... 1
  8. html5自动旋转图片,HTML5画布旋转图片
  9. LANMP架构----------------------mysql(2)
  10. 如何将视频网站的视频下载为mp4格式
  11. 大四去NTT面试软件实习生的个人总结
  12. 如何做到像使用 LaTeX 那样优雅地使用 Word?
  13. js-beautify-html配置,HTML-Beautify.js学习
  14. ckplayer(超酷网页视频播放器)
  15. python语音验证码识别_基于Python的手机语音验证码api调用代码实例
  16. 祝学校计算机系的新年贺词,计算机工程学院 2019祝福情景剧
  17. win10修改用户名_ADAMS2020中/英版软件下载和安装教程|兼容WIN10
  18. 学学这五招,打造自媒体短视频
  19. 先科n612打不开但是充电还是会亮红灯
  20. windows2016安装证书管理器、IIS配置自签名证书、导出证书、证书.pfx转化为.crt和.key

热门文章

  1. STM32一文通(8) 串口通讯
  2. 光缆线路网的组网结构是怎样的
  3. 【实验3 循环结构】7-14 循环结构 —— 中国古代著名算题。趣味题目:物不知其数。
  4. 观看《创新的力量》观后感
  5. SHA1加密技术文档说明
  6. 3D打印的材料有哪几种?
  7. js根据出生日期 计算岁数
  8. 【目标检测评价指标】
  9. c语言表达式106的结果是,云南师范大学C语言期末试题
  10. Altera Max10系列FPGA简介