当时学过QAQ,无奈早已忘光,只剩一个概念2333
重新捡起来,同时感谢yymxw的指导(才怪)
负责任的粘贴一下网上的概念:
Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
Trie树的基本性质可以归纳为:
(1)根节点不包含字符,除根节点意外每个节点只包含一个字符。
(2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
(3)每个节点的所有子节点包含的字符串不相同。
Trie树有一些特性:
(1)根节点不包含字符,除根节点外每一个节点都只包含一个字符。
(2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
(3)每个节点的所有子节点包含的字符都不相同。
(4)如果字符的种数为n,则每个结点的出度为n,这也是空间换时间的体现,浪费了很多的空间。
(5)插入查找的复杂度为O(n),n为字符串长度。
开始愉快的刷(shui)题吧~
[Trie树]COGS 1176 月考
非常简单的单词插入与查找是否出现过,Trie树入门必备
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #define pos(i,a,b) for(int i=(a);i<=(b);i++) #define pos2(i,a,b) for(int i=(a);i>=(b);i--) #define N 5000 using namespace std; struct Trie { Trie *ch[70];//此节点有几种可能的字符 ,不要开炸内存 int dfn;//判断此节点是否为单词 Trie(){memset(ch,0,sizeof(ch));dfn=0;} }*root; int n,m; void insert(char *s) { int len=strlen(s); Trie *now=root; pos(i,0,len-1) { if(now->ch[s[i]-‘A‘]==NULL) now->ch[s[i]-‘A‘]=new Trie(); now=now->ch[s[i]-‘A‘]; } now->dfn=1; } int find(char *s){ int len=strlen(s); Trie *now=root; pos(i,0,len-1){ if(now->ch[s[i]-‘A‘]==NULL) return 0; now=now->ch[s[i]-‘A‘]; } if(now->dfn==1) return 1; else return 0; } int main() { scanf("%d",&n); root=new Trie(); pos(i,1,n) { char s[60]; scanf("%s",s); insert(s); } scanf("%d",&m); int ans(0); pos(i,1,m){ char s[60]; scanf("%s",s); if(find(s)) ans++; } cout<<ans; return 0; }
时间: 2024-11-09 01:54:26