这篇文章介绍一下字典树的实现原理,又称单词查找树、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…
扫码关注爱因诗贤