`
yzmduncan
  • 浏览: 330340 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

数据结构之——Trie树

阅读更多


      Trie树,又称单词查找树,典型用于统计和排序大量字符串,查询效率比哈希表高。(空间复杂度高)

它有3个基本特性:
  1)根节点不包含字符,除根节点外每一个节点都只包含一个字符。
  2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
  3)每个节点的所有子节点包含的字符都不相同。

Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

 

Trie树的结构体:

struct Trie_Node
{
	int id;//数据域
	Trie_Node *next[26];//孩子结点
	Trie_Node()
	{
		id = -1;
		memset(next,0,sizeof(next));
	}
}*root;

 

Trie树的更新操作(插入、查询某字符串的数据)

int getNum(char *t)
{
	Trie_Node *p = root;
	int i = 0,del;
	while(t[i] != '\0')
	{
		del = t[i] - 'a';
		if(p->next[del] == NULL)
			p->next[del] = new Trie_Node();//动态建树,也可以换成静态
		p = p->next[del];
		i++;
	}
	if(p->id == -1)
		p->id = num++;
	return p->id;
}

 

POJ2513

题目大意:有n根筷子(n=250000),每根筷子两头涂有颜色。现在问能否将所有筷子连起来,并且每两根筷子的连接点颜色都相同。

分析:题意不难理解,现在做一个转换:将每种颜色作为一个结点,每根筷子两头的颜色之间连有一条边。这样,就形成了下面的图:

 

     这样问题就转化为:要求全部走完且经过每条边一次且仅一次,即一笔画问题。 这就成了欧拉路的判断:

1.判断该图是否连通;

2.该图的每个点的度要么全为偶数,要么有且仅有两个度为奇数。

判断图是否是连通图,可以用并查集。计算每个点的度,就是统计单词出现的次数。因此联想到用Trie树统计单词出现的次数,每次将单词在Trie树中查找,若该单词在trie树中第一次出现,则给它一个标号(相当于hash)。

 

POJ3630(1056)

题目大意:给出n个电话号码(n=10000),每个电话号码长度不超过10。要求是否满足:每个电话号码不能是其它号码的前缀。

分析:在Trie树中放置一个标志位,表示从根节点到该结点是否是已经输入的号码。

bool findAndInsert(char *t)
{
	Trie_Node *p = root;
	int i = 0,del;
	while(t[i] != '\0')
	{
		if(p->exist)
			return true;		//别的字符串是当前字符串的前缀
		del = t[i] - '0';
		if(p->next[del] == NULL)
		{
			p->next[del] = &node[nodeNum];
			nodeNum++;
		}
		p = p->next[del];
		i++;
	}
	for(i = 0; i < 10; i++)		//当前字符串是别的字符串的前缀
	{
		if(p->next[i] != NULL)
			return true;
	}
	p->exist = true;
	return false;
}

 

POJ2001

题目大意:现在人们喜欢用缩写,比如carbon可以缩写为carb,但不能缩写为car。因为有car这个准确的单词。给你n个单词(n=1000),每个单词长度不超过20。求出每个单词的最短缩写。

分析:在Trie树中加入一个计数器num,表示以这个字符串为前缀的单词有几个。在查询时,根据传入的单词一层层的往下找,找到num=1就说明这个是第一次被使用,停止输出。

#include <iostream>
const int MAX = 1001;
char str[MAX][21];
int nodeNum;

struct Trie_Node
{
	int num;	//to remember how many words can reach here
	Trie_Node *next[26];
	Trie_Node()
	{
		num = 0;
		memset(next,NULL,sizeof(next));
	}
};
Trie_Node node[MAX*10],head;

void insert(char *t)
{
	int i=0,del;
	Trie_Node *p = &head;
	while(t[i] != '\0')
	{
		del = t[i] - 'a';
		if(p->next[del] == NULL)
		{
			p->next[del] = &node[nodeNum];
			nodeNum++;
		}
		p->next[del]->num++;
		p = p->next[del];
		i++;
	}
}

void query(char *t)
{
	int i = 0;
	Trie_Node *p = &head;
	while(t[i] != '\0')
	{
		printf("%c",t[i]);
		p = p->next[t[i]-'a'];
		if(p->num == 1)
			break;
		i++;
	}
	printf("\n");
}

int main()
{
	int i = 0;
	nodeNum = 1;
	while(scanf("%s",str[i]) != EOF)
	{
		insert(str[i]);
		i++;
	}
	for(int j = 0; j < i; j++)
	{
		printf("%s ",str[j]);
		query(str[j]);
	}
	return 0;
}

 

 

 

  • 大小: 14.9 KB
分享到:
评论

相关推荐

    数据结构实验报告-----trie树

    **数据结构实验报告——Trie树** Trie树,又称为前缀树或字典树,是一种用于存储字符串的有效数据结构。它通过将字符串的字符分解并存储在树的节点中,来实现高效的字符串查找、插入和删除操作。在Trie树中,每个...

    数据结构课程设计——树的遍历

    "数据结构课程设计——树的遍历"这一主题聚焦于树这种非线性数据结构的一个核心操作:遍历。两江大学出版社可能提供了深入的教程或实践项目,让学生通过实际操作来理解和掌握树的遍历方法。 树是一种由节点(也称为...

    数据结构课设Trie树

    在这个“数据结构课设&lt;英语词典的维护和识别&gt;Trie树”中,我们聚焦于一种特殊的数据结构——Trie(又称前缀树或字典树),它在处理字符串集合时表现出色,尤其在英文词典的维护和识别上。 Trie树是一种关联数组的...

    数据结构习题集——目前最完整的数据结构1800题包括完整答案

    字符串作为一种特殊的数据结构,也会出现在习题中,比如KMP算法、Trie树等。 树结构的习题可能涵盖二叉搜索树、完全二叉树、满二叉树的性质,以及树的遍历(前序、中序、后序)。平衡树如AVL树的平衡调整,红黑树的...

    数据结构教案——PPT与程序代码

    6. 探索高级数据结构,如堆、哈希表、B树、Trie树等,以及它们在特定问题中的应用。 这个资料包为学习数据结构提供了丰富的实践素材,无论你是初学者还是希望巩固基础,都能从中获益。通过结合PPT讲解和代码实现,...

    数据结构——使用C++语言描述

    - B+树:数据库索引中常用的数据结构。 - 字符串处理:KMP算法、Trie树(字典树)。 这些章节涵盖了数据结构的主要内容,通过学习,可以深入理解数据结构的概念,并能利用C++实现各种数据结构,从而提高编程能力...

    数据结构教学PPT———

    除了基本数据结构,高级数据结构如堆、哈希表、B树、Trie树等也会被涵盖。这些结构在实际应用中扮演着重要角色,如哈希表用于快速查找,B树适用于大容量数据的存储和检索,Trie树则常见于字符串搜索。 最后,PPT还...

    linkfqy#CSDN_blog_backup#【模板】Trie树(基于指针)1

    很常见的字符串处理数据结构……参考博客:字符串统计神器——Trie树以前没有怎么认真学过Trie,现在重新打了一遍用了指针实现,感觉好看多了。

    php-leetcode题解之实现Trie前缀树.zip

    本资源“php_leetcode题解之实现Trie前缀树”聚焦于PHP语言,针对LeetCode中的一道经典问题——Trie(前缀树)的实现进行了解答。 Trie,也被称为字典树或前缀树,是一种用于存储字符串的数据结构,尤其适合进行...

    实现trie树的C/C++模板

    在计算机科学领域,Trie树(又称前缀树或字典树)是一种用于存储具有共同前缀的字符串的高效数据结构。它广泛应用于各种场景,如自动补全、拼写检查以及IP路由表等。本文将详细介绍如何在C/C++中实现一个基本的Trie...

    哈工程——数据结构实验代码&报告(最新版)

    哈工程的这个资料集可能还会包含一些高级数据结构,如Trie树(字典树)用于字符串查找,B树和B+树用于数据库索引,或者Fibonacci堆用于优先队列。这些数据结构在大数据处理、数据库系统和网络路由等领域有广泛的应用...

    算法与数据结构——C语言描述(第2版)电子教案-作者+张乃孝

    《算法与数据结构——C语言描述(第2版)》是张乃孝先生撰写的一本经典教材,专注于讲解计算机科学中的核心概念:算法和数据结构。这本书以C语言为工具,深入浅出地阐述了各种数据结构的实现原理及其在实际问题中的...

    字符串处理——字典树.rar

    本资源“字符串处理——字典树.rar”聚焦于一种高效的数据结构——字典树(Trie),它在字符串处理中发挥着关键作用。通过学习字典树,我们可以更好地理解和解决与字符串相关的问题。 字典树,又称前缀树或PAT树,...

    C语言从入门到精通视频教程下载第18章 数据管理者——数据结构.zip

    9. **高级数据结构**:除了上述基础数据结构,还有堆、散列表(哈希表)、B树、Trie树等更复杂的结构,它们在数据库、文件系统、缓存策略等方面有广泛应用。 通过这个视频教程,你不仅会学习到C语言中数据结构的...

    算法和数据结构——左程云.zip

    《算法和数据结构——左程云》是一份深入探讨计算机科学核心领域的资源包,由知名专家左程云编著。这份资料集主要聚焦于算法与数据结构的学习,这对于任何计算机科学专业的学生或软件开发者来说都是必不可少的基础...

    散列索引多分支Trie树快速路由查找算法

    2. **基于Trie树的算法**:Trie树是一种用于存储字符串的树形数据结构。在路由查找中,每个节点对应于一个IP地址的一部分,从而形成一条从根到叶子节点的路径。这种结构支持高效的最长前缀匹配,但随着路由表的增长...

    算法与数据结构-C语言版

    《算法与数据结构-C语言版》是针对计算机科学领域中至关重要的两个概念——算法和数据结构的深入学习资料。陈守孔版的课程通常以其详尽的解释和实用的示例而闻名,对于初学者和有经验的程序员来说都是宝贵的学习资源...

    一种新型整数集上的动态统计数据结构——Irie.pdf

    本文介绍了一种名为Irie的新数据结构,该数据结构是基于字典树Trie的改进版本,专为处理整数集合上的动态统计操作设计。Irie树不仅继承了Trie树用于存储字符串时的高效性,还通过其独特的结构设计实现了对整数集进行...

Global site tag (gtag.js) - Google Analytics