Trie树模版

Trie 树 中文名叫字典树,可以用来存放n个单词,并且找出某个前缀的数量,或者找出某个单词的数量。

其实也有其他的应用,比如统计有多少个不同的字符串等等。

字典树分为一般分为两个部分,一个是创建字典树,还一个是find函数,find函数的写法随着题目要求可以灵活多变的!

首先 要先定义出数据结构 。

1  struct Trie{
2 Trie *next[26]; //指向子节点
3 int v; //可以很多个变量,比如可以统计这个前缀的数量,或者标记是不是结尾等等
4 };
5 Trie *root;

初始化函数:

1 void init()
2 {
3 root = (Trie*)malloc(sizeof(Trie));
4 for(int i = 0;i < 26;i++)
5 root->next[i] = NULL;
6 }

创建字典树:

 1 void creat_Trie(char *str)  //创建字典树
 2 {
 3     int len = strlen(str);  //字符串的长度
 4     Trie *p = root, *q;// p 指向字典树,定义一个指针q
 5     for(int i=0; i<len; ++i)//遍历整个字符串
 6     {
 7         int id = str[i]-‘0‘;  //得到每个字符的值
 8         if(p->next[id] == NULL)//如果该值在字典树中是第一次出现
 9         {
10             q = (Trie *)malloc(sizeof(Trie));//开辟一个新节点
11             q->v = 1;    //初始v==1,遇到一个新节点,则把经过这个节点的字符串数量初始化为1
12             for(int j=0; j<MAX; ++j)//让其的每种可能的下一个节点都为空
13                 q->next[j] = NULL;
14             p->next[id] = q;//让p指向过去
15             p = p->next[id];//p指向开节点的后一节点
16         }
17         else
18         {
19             p->next[id]->v++;//如果存在,则让v++ , 意思是通过这个节点的字符串数量又多了一个
20             p = p->next[id];//下一个节点。。
21         }
22     }
23      // p->t = -1;   //若为结尾,则将v改成-1表示(视情况而定)
24 }

find函数:

 1 int findTrie(char *str)
 2 {
 3 int len = strlen(str);   //查找这个串是否在字典树中
 4 Trie *p = root;//让p 指向字典树的一个节点。
 5 for(int i=0; i<len; ++i)
 6 {
 7 int id = str[i]-‘0‘;  //根据需要选择是减去‘0‘还是‘a‘,或者是‘A‘
 8 p = p->next[id]; //注意,如果这里指向下一届点了,下面判断就只能是p == NULL  如果要是p->next[id] == NULL 就应该在循环末尾进行。
 9 if(p == NULL)   //若为空集,表示不存以此为前缀的串
10 return 0;
11 if(p->v == -1)   //字符集中已有串是此串的前缀
12 return -1;
13 }
14 return -1;   //此串是字符集中某串的前缀
15 } 

注意指针的 难调试性,写的时候千万不能写错了。。。

时间: 2024-08-03 23:05:46

Trie树模版的相关文章

Trie树标准模版

这是一个Trie树标准模版 By Leo 本人版权,请勿抄袭!! 先看教程:  1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.      Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率

Trie树(字典树) 个人模版

Trie树的基本实现 字母树的插入(Insert).删除( Delete)和查找(Find)都非常简单,用一个一重循环即可,即第i 次循环找到前i 个字母所对应的子树,然后进行相应的操作.实现这棵字母树,我们用最常见的数组保存(静态开辟内存)即可,当然也可以开动态的指针类型(动态开辟内存).至于结点对儿子的指向,一般有三种方法: 1.对每个结点开一个字母集大小的数组,对应的下标是儿子所表示的字母,内容则是这个儿子对应在大数组上的位置,即标号: 2.对每个结点挂一个链表,按一定顺序记录每个儿子是谁

hiho #1014 : Trie树

#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?” 身经百战的小Ho答道:“怎么会不能呢!你每给我一个字符串,我就依次遍历词典里的所有单词,检查你给我的字

Trie树的简单描述(需后续总结)

http://www.cnblogs.com/pony1993/archive/2012/07/18/2596730.html 字典树(Trie树) 字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高. 它有三个基本性质,根节点不包含字符,除根节点外每一个节点都只包含一个字符,从根节点到某一节点,路径上经过的字符连

Trie树(c++实现)

转:http://www.cnblogs.com/kaituorensheng/p/3602155.html http://blog.csdn.net/insistgogo/article/details/7828851 一.定义: Trie,又称字典树,是一种用于快速检索的二十六叉树结构.典型的空间换时间 二.结构图: 三.原理:        Trie把要查找的关键词看作一个字符序列,并根据构成关键词字符的先后顺序检索树结构: 特别地:和二叉查找树不同,在Trie树中,每个结点上并非存储一个

poj3630 Phone List (trie树模板题)

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26328   Accepted: 7938 Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogu

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

Trie树学习2

数组实现的Trie树 字符容量有限,可以使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib> #

trie树(字典树)

1. trie树,又名字典树,顾名思义,它是可以用来作字符串查找的数据结构,它的查找效率比散列表还要高. trie树的建树: 比如有字符串"ab" ,"adb","adc"   可以建立字典树如图: 树的根节点head不存储信息,它有26个next指针,分别对应着字符a,b,c等.插入字符串ab时,next['a'-'a']即next[0]为空,这是申请一个结点放在next[0]的位置,插入字符串db时,next['d'-'a']即next[3]