​这篇文章介绍一下字典树的实现原理,又称单词查找树、Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

1.字典树(Trie)示意图

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() 方法可以判断字典树上是否有指定字符串前缀的单词:<?php

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.输出演示<?php

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'));

扫码关注爱因诗贤

php trie,数据结构-PHP 字典树(Trie)的实现相关推荐

  1. 数据结构之字典树Trie

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

  2. 最优雅的数据结构之一——字典树Trie(Java)

    什么是Trie? 又称单词查找树: 又叫前缀树(prefix tree): Trie树,是一种树形结构,是一种哈希树的变种. 作用: 用以较快速地进行单词或前缀查询: 用于快速检索.统计,排序和保存大 ...

  3. 《恋上数据结构第1季》字典树 Trie

    字典树Trie Trie 简介 Trie 实现 接口设计 源码 测试 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java 基础推荐看这个: Java 强化笔记目录 Tri ...

  4. php 字典树,关于php:数据结构PHP-字典树Trie的实现

    ​这篇文章介绍一下字典树的实现原理,又称单词查找树.Trie树,是一种树形构造,是一种哈希树的变种.典型利用是用于统计,排序和保留大量的字符串(但不仅限于字符串),所以常常被搜索引擎零碎用于文本词频统 ...

  5. Burst trie(爆炸式字典树)解读

    burst trie(爆炸式字典树) Burst trie组成介绍 burst trie有三个不同的组成部分,一组records,一组containers,还有一个access trie. recor ...

  6. 用Python实现字典树(Trie)与双数组字典树(DATrie)

    1. 字典树(Trie) 假如我们把字典中的词以记录的形式(无序)存入数据库中.现给定一串字符,要查找该字符串是否为字典中的词.因为数据库中的记录是无序的,所以,最朴素的方法就逐记录匹配.此方法简单, ...

  7. 快乐学算法之:字典树Trie

    文章目录 简介 Trie的特性 Trie树和Hashing,BST的对比 Trie树的程序化表示 Trie树的插入 Trie树的搜索 Trie树的删除 Trie树的疑惑 简介 字典树的英文名叫做Tri ...

  8. HDU 1247 Hat’s Words 字典树(Trie树)

    HDU 1247 Hat's Words 字典树(Trie树) 字典树的建立是应该都是一样的 下面是我的做法: 建立完后, 对每一个单词都进行find_string()判断是否符合, 分别对其分成两半 ...

  9. Java实现字典树 Trie

    Java实现字典树 Trie 一.字典树介绍 二.Trie实现以及基本的插入查询操作 数组实现: HashMap实现: Trie插入(这里都以数组实现为例): Trie查询: 三.相关例题: 1.le ...

最新文章

  1. 云计算和云存储IBM教程
  2. java quartz 触发_手动触发Quartz作业
  3. C++ 面向对象(一)继承:继承、对象切割、菱形继承、虚继承、继承与组合
  4. matlab标准化出现负值,为什么我求出来的约束条件是负值
  5. java设计模式组合模式详解_《JAVA设计模式》之组合模式(Composite)
  6. 事务复制5: Transaction and Command
  7. CentOS7关闭rpcbind连带服务
  8. 学校家教服务管理系统mysql_数据库课程设计报告-学校家教服务管理系统.doc
  9. 用Python制作圣诞树
  10. 一侧肩膀怕风吹怎么办
  11. AR技术在智慧交通中的应用
  12. php如何放照片,怎样在图片上加上自己的照片 在图片方框中嵌入另一张照片显示...
  13. 高通平台sensor学习
  14. MISRA-C那些事儿
  15. ONE DAY |网络安全渗透测试之跨网段攻击
  16. subster函数的详细说明
  17. 常见机器学习模型适用场景及优缺点
  18. 微信公众平台python_python搭建微信公众平台
  19. password_hash/password_verify/(JAVA)
  20. 全国首条5G环线在成都正式开通

热门文章

  1. UMAX系统——智能终端的领跑者
  2. 先进工艺22nm FDSOI和FinFET简介
  3. 财路网每日原创推送:区块链中的“块”是什么?
  4. 各种搜索引擎算法研究
  5. windows远程android传输文件,电脑(Linux/Windows)使用SSH远程登录安卓(Android)手机实现无线传输和管理文件(图文详解)-Go语言中文社区...
  6. 浅析企业私有云中的存储架构
  7. 记录一下:老衲的py路程 mac下的tkinter小应用
  8. 实用工具—SimpleMind 和Sublime Text
  9. 自动售货机html代码,自动售货机系统源代码.doc
  10. 夸计算机老师的成语,四字夸奖老师的成语