Trie

Trie

部分资料来自:

https://blog.csdn.net/zzkksunboy/article/details/61421001

https://blog.csdn.net/johnny901114/article/details/80711441

https://blog.csdn.net/qq_36782366/article/details/76152767

Trie, 又称字典树,是前缀树,它的作用是把许多字符串整合储存,做成一个字符串集合,有时可以达到快速查找的效果。

特点

它压缩了所有模式串

查找速度与它的元素长度相关Ow

概念

比如有she,her,hers,his,him这几个单词,我们就可以建立这么一个Trie

首先,Trie是一颗多叉树

Trie的一个特性:必有一个根节点(把根节点记为0),也叫虚根

每条边都有一个权值,权值即各位对应字符

而红色的节点表示的是某个单词结束的节点,在遍历中如果成功访问,就意味着,对于字符串存在。注意它并不代表访问过程中返回点。

如果从链表角度来描述的话,一个字符串就是一个链表。每个Node都保存了它的所有子节点。

构造

指针版

各节点:

struct node
{
	node *nxt[26];
	int flag;
	node()
	{
		for(int i=0;i<26;i++)
		{
			nxt[i]=NULL;
		}
		flag=0;
	}
};

将各模式串存入Trie(当然可以也可以传string)

void ins (char *s)
{
	int len=strlen(s);
	node *now=root;//指向根节点
	for(int i=0;i<len;i++)
	{
		int to=s[i]-'a';
		if(now->nxt[to]==NULL)now->nxt[to]=new node();
		now=now->nxt[to];//now指向新生成的结点
	}
	now->flag++;//最后一个叶节点做标记  意思是这个字符串在这个结点结束
}

标号版

(写在ac自动机那块)

posted @ 2020-04-05 19:43  et3_tsy  阅读(126)  评论(0编辑  收藏  举报