前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Trie树的基本原理与实现以及改进

Trie树的基本原理与实现以及改进

原创
作者头像
大学里的混子
修改于 2019-02-21 09:08:37
修改于 2019-02-21 09:08:37
1.5K00
代码可运行
举报
文章被收录于专栏:LeetCodeLeetCode
运行总次数:0
代码可运行

Trie树的基本原理

本文介绍了关于Trie树的基本原理与实现,维基百科中的说明如下:trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

(1)使用节点数组,因为是英文字符,可以用Node[26]来保存孩子节点(如果是数字我们可以用Node[10]),这种方式最快,但是并不是所有节点都会有很多孩子,所以这种方式浪费的空间太多 (2)用一个链表根据需要动态添加节点。这样我们就可以省下不小的空间,但是缺点是搜索的时候需要遍历这个链表,增加了时间复杂度。

给出一组单词,inn, int, at, age, adv, ant, 我们可以得到下面的Trie:

所以,当前的字符串的长度越长,树的高度越高,存储一个字符串,要将前几个字符都要存储,这也是Trie树这种数据结构的一个弊端,太过于消耗资源。

Trie节点原型

这是一个多叉树,实际上与二叉树非常的类似,只不过把孩子节点作为一个数组的形式表示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TrieNode {
    TrieNode[] next = new TrieNode[26];
    String word;
}

Trie树的建立

在Trie树中,根节点是不存数据的。i是找到当前的字母是26个字母中的哪一个,p是从头结点一直移动到叶子节点,然后将word插入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public TrieNode buildTrie(String[] words) {
    TrieNode root = new TrieNode();
    for (String w : words) {
        TrieNode p = root;
        for (char c : w.toCharArray()) {
            int i = c - 'a';
            if (p.next[i] == null)
                p.next[i] = new TrieNode();
            p = p.next[i];
        }
        p.word = w;
        System.out.println(w);
    }
    return root;
}

Trie树的遍历

这个是Trie树的层序遍历,同样是采用一个队列,方法与二叉树的层序遍历区别不大。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void printTrie(TrieNode root){
    Queue<TrieNode> queue = new LinkedList<>();
    queue.add(root);
    while (!queue.isEmpty()){
        TrieNode temp = queue.remove();
        if (temp.word!=null)
            System.out.println(temp.word);
        for (TrieNode trieNode:temp.next){
            if (trieNode!=null){
                queue.add(trieNode);
            }
        }
    }
}

添加两个数据项:

  1. 以该节点为结尾的个数,可以达到查询是否存在某个字符串的功能
  2. 插入节点时,记录节点划过的次数,可以达到查询有多少个以某个字符串作为前缀的功能
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

public class Code_01_TrieTree {

	public static class TrieNode {
		public int path;
		public int end;
		public TrieNode[] nexts;

		public TrieNode() {
			path = 0;
			end = 0;
			nexts = new TrieNode[26];
		}
	}

	public static class Trie {
		private TrieNode root;

		public Trie() {
			root = new TrieNode();
		}

		public void insert(String word) {
			if (word == null) {
				return;
			}
			char[] chs = word.toCharArray();
			TrieNode node = root;
			int index = 0;
			for (int i = 0; i < chs.length; i++) {
				index = chs[i] - 'a';
				if (node.nexts[index] == null) {
					node.nexts[index] = new TrieNode();
				}
				node = node.nexts[index];
				node.path++;
			}
			node.end++;
		}

		public void delete(String word) {
			if (search(word) != 0) {
				char[] chs = word.toCharArray();
				TrieNode node = root;
				int index = 0;
				for (int i = 0; i < chs.length; i++) {
					index = chs[i] - 'a';
					if (--node.nexts[index].path == 0) {
						node.nexts[index] = null;
						return;
					}
					node = node.nexts[index];
				}
				node.end--;
			}
		}

		public int search(String word) {
			if (word == null) {
				return 0;
			}
			char[] chs = word.toCharArray();
			TrieNode node = root;
			int index = 0;
			for (int i = 0; i < chs.length; i++) {
				index = chs[i] - 'a';
				if (node.nexts[index] == null) {
					return 0;
				}
				node = node.nexts[index];
			}
			return node.end;
		}

		public int prefixNumber(String pre) {
			if (pre == null) {
				return 0;
			}
			char[] chs = pre.toCharArray();
			TrieNode node = root;
			int index = 0;
			for (int i = 0; i < chs.length; i++) {
				index = chs[i] - 'a';
				if (node.nexts[index] == null) {
					return 0;
				}
				node = node.nexts[index];
			}
			return node.path;
		}
	}

	 
	}

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode208. 实现 Trie (前缀树)
题目链接:[LeetCode208]()  板子题,就不说了 class Trie { class TrieNode { public int end; p
mathor
2018/08/17
6600
LeetCode208. 实现 Trie (前缀树)
Trie树分析
Trie树 Trie树介绍 Trie,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 它有3个基本性质: 1.根节点不包含字符,除根节点外每一个节点都只包含一个字符。 2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 3.每个节点的所有子节点包含的字符都不相同。 Trie中每个节点有一个特殊标记作为结束符号,通过该标记可以判断当前节
汤高
2018/03/28
1.2K0
Trie树分析
算法细节系列(23):回溯
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/72655010
用户1147447
2019/05/26
6190
剑指Offer——Trie树(字典树)
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
全栈程序员站长
2022/10/03
1K0
剑指Offer——Trie树(字典树)
从Trie树到双数组Trie树
Trie树 原理 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,能在常数时间O(len)内实现插入和查
JadePeng
2018/03/12
3.2K0
从Trie树到双数组Trie树
算法:字典树(Trie)-理论与实战
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
营琪
2019/11/04
6900
深入理解Trie树
前面的文章介绍过各种高效的的数据结构,比如二叉搜索树,AVL树,红黑树,B树,跳跃表等,今天我们再来学习一种多路树,叫做Trie树。
我是攻城师
2019/06/03
2.1K0
字符串匹配算法(Trie树)
Trie树是一个多叉树;二叉树的数据结构里存放着左右子节点的指针; Trie树采用的一种经典的存储方式是散列表。
Michael阿明
2021/02/20
1.1K0
字符串匹配算法(Trie树)
字典树概念与题型解析
这次讲一个不经常被人提起的数据结构 - 字典树,虽说知名度不高,但是这个数据结构可以解决其他数据结构所不能解决,或者是比较难解决的问题,而且性能方面,相对于其他的功能类似的数据结构会更优,文章会从概念与基本实现,性能分析,题型解析三大方向来介绍字典树。
五分钟学算法
2019/10/18
6250
【愚公系列】2023年11月 数据结构(十)-Trie树
数据结构是计算机科学中的一个重要概念,它描述了数据之间的组织方式和关系,以及对这些数据的访问和操作。常见的数据结构有:数组、链表、栈、队列、哈希表、树、堆和图。
愚公搬代码
2023/11/09
3350
字典树(前缀树)
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种,典型应用是用于统计和排序大量相同的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是: 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓字符串的比较。
大忽悠爱学习
2023/03/23
7140
字典树(前缀树)
每日一刷《剑指offer》字符串篇之把字符串转换成整数(atoi)
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
终有救赎
2023/11/18
2530
每日一刷《剑指offer》字符串篇之把字符串转换成整数(atoi)
Trie树
他会自动显示相关的搜索,不知道有没有想过这个功能是如何实现的呢?面对海量的数据,它怎么能在我输入的同时,如此快速的检索到相关内容呢?当我查找资料后,就遇到了它,Trie树。
烟草的香味
2019/11/11
6740
Trie树
【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)
接下来将对经典的字典树进行代码实现;接着做几个变体题目深入理解字典树的强大;最后回到日常生活,瞧瞧字典树怎样融入到了我们的生活之中 >_<
全栈程序员站长
2022/10/04
1.4K0
【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)
实现一个单词搜索游戏,给定一个二维网格和一个单词列表,找到单词列表中出现在网格中的所有单词(提示:Trie树 + DFS)。
简介:实现一个单词搜索游戏,给定一个二维网格和一个单词列表,找到单词列表中出现在网格中的所有单词(提示:Trie树 + DFS)。
GeekLiHua
2025/01/21
2480
查找-多路查找详解篇
学编程的小程
2023/10/11
3410
查找-多路查找详解篇
Trie树的原理及应用
在做用户 query 理解的过程中,有许多需要使用词典来”识别”的过程。在此期间,就避免不了使用 Trie 树这一数据结构。
呼延十
2019/12/19
1.1K0
字典树(Trie树)
例如,单词序列a, to, tea, ted, ten, i, in, inn,对应的trie。
全栈程序员站长
2022/07/15
5410
字典树(Trie树)
字典树,不就有点不一样的一颗树
字典树,是一种空间换时间的数据结构,又称Trie树、前缀树,是一种树形结构(字典树是一种数据结构),典型用于统计、排序、和保存大量字符串。所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
bigsai
2021/05/17
7720
字典树,不就有点不一样的一颗树
一种好用的树结构:Trie树
在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
致Great
2022/05/13
5750
一种好用的树结构:Trie树
相关推荐
LeetCode208. 实现 Trie (前缀树)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档