字典树 | 数据结构

# 1 字典树的概念

字典树,是一种树形结构,是一种哈希树的变种。(来自度娘百科)

首先,字典树的每一个节点都是长这样的:

struct node{
    int end,son[27];
}a[maxn]

每个节点都有一个判断自己是多少个单词结尾的end与它之后的节点son[27]。

# 2 如何构造字典树

假设我们输入:

7

b

ab

ba

bb

aab

baa

aba

我们会得到一个这样的结果:

我们可以轻松地找出每个节点的end值,如下:

这样,我们就成功构建了一棵字典树!

# 3 例题

例题 阅读理解

分析:

step1: 我们将每一篇文章中的每一个单词,用字典树的方式存储,记得标上自己是属于哪一篇文章的。

step2: 对于每一个需要查询的单词,从根节点开始,不断向下遍历,如果在单词的结尾刚好有一篇文章的一个单词结尾在这里,输出文章号就OK了。

代码(很久以前的代码,码风还OK,不过没有用上文的方式存储):

#include<bits/stdc++.h>
using namespace std;
int n,q,t,sum,son[500005][27];
bitset<1005> ans[500005];
map<string,int>m;
string str;
void change(int x,string s){
	int tmp=0;
	for(int j=0;j<s.size();tmp=son[tmp][s[j++]-96])
		if(son[tmp][s[j]-96]==0)
			son[tmp][s[j]-96]=++sum;
	m[s]=tmp;
	ans[tmp][x]=true;
}
void query(string s){
	if(m.count(s)){
		int num=m[s];
		for(int j=1;j<=n;++j)
			if(ans[num][j]==true)
				printf("%d ",j);
	}
	puts("");
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&t);
		for(int j=1;j<=t;++j){
			cin>>str;
			change(i,str);
		}
	}
	scanf("%d",&q);
	for(int i=1;i<=q;++i){
		cin>>str;
		query(str);
	}
	return 0;
}

原文地址:https://www.cnblogs.com/xiaoziyao/p/10354521.html

时间: 2024-11-09 06:02:48

字典树 | 数据结构的相关文章

C++实现字典树数据结构_LeetCode820_字典的压缩编码

用C++实现字典树数据结构的例子: 例题: 单词的压缩编码 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]. 对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们

字典树 trie

字典树数据结构实现 1 public class Trie { 2 //字典树子节点最多值,任意一个单词都是由,26个字母组成的 3 private int SIZE = 26; 4 //根节点 5 private TrieNode root; 6 //初始化字典树 7 public Trie() { 8 root = new TrieNode(); 9 } 10 11 //字典树节点 12 private class TrieNode{ 13 //存放子节点的数组 14 private Tri

白话算法与数据结构之【字典树】

1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.      Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子

9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据

【数据结构】前缀树/字典树/Trie

[前缀树] 用来保存一个映射(通常情况下 key 为字符串  value 为字符串所代表的信息) 例如:一个单词集合 words = {  apple, cat,  water  }   其中 key 为单词      value 代表该单词是否存在 words[ 'apple' ] = 存在     而     word[ ' abc' ] = 不存在 图示:一个保存了8个键的trie结构,"A", "to", "tea", "ted

【学习总结】数据结构-Trie/前缀树/字典树-及其最常见的操作

Trie/前缀树/字典树 Trie (发音为 "try") 或前缀树是一种树数据结构,用于检索字符串数据集中的键. 一种树形结构,是一种哈希树的变种. 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 应用: 自动补全 END 原文地址:https://www.cnblogs.com/anliux/p/12590368.html

字典树 一种快速插入查询数据结构

定义 字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高. 解释 这个图片比较经典 就是在每一次边存的是字符,点标记着个点是否之前的边的字符都存在 如图存在的字符串有 abc abcd abd.... 代码 #include <cstdio> #include <cstring> #include &

【数据结构】第9章 查找! (二叉搜索树BST AVL树 B-(+)树 字典树 HASH表)

难产的笔记...本来打算用1天 结果前前后后拖了5天 §9.1 静态查找表 9.1.1 顺序表的查找 各种扫 自己脑补吧 复杂度O(n) 9.1.2 有序表的查找 若表是单调的,则可以利用二分查找.复杂度O(logn) 9.1.3 静态树表的查找 见 http://blog.csdn.net/area_52/article/details/43795837 9.1.4 索引顺序表的查找 建立索引表查找 §9.2 动态查找表 动态查找表的特点是,表结构本身是在查找过程中动态生成的,即对于给定值ke

[从头学数学] 第255节 Python实现数据结构:字典树(Trie)

剧情提要: 阿伟看到了一本比较有趣的书,是关于<计算几何>的,2008年由北清派出版.很好奇 它里面讲了些什么,就来看看啦. 正剧开始: 星历2016年08月03日 09:35:13, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起研究[计算几何]]. 关于字典树的实现,已经有非常多的博文涉及到了.但基本都是用内嵌数组/列表实现的. 本博文是它的递归实现. <span style="font-size:18px;">### # @usa