`
kenby
  • 浏览: 724686 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

poj 2418 trie树统计单词出现的个数

 
阅读更多

一 题意:输入很多棵树(单词),统计每种树所占的百分比

 

二 算法:用trie树轻松解决,trie树的典型应用就是统计单词出现的个数。

 

三 代码如下,ps:清华大学《数据结构-C语言版》的trie树实现很傻逼,我不知道它如何

解决前缀字符串的问题,比如统计aaa和aaabb的出现次数

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//#define DEBUG

#ifdef DEBUG
#define debug(...) printf( __VA_ARGS__) 
#else
#define debug(...)
#endif

struct trie_node {
	struct trie_node 	*child[256];	/* 分支节点的孩子指针 */
	int  				count;	/* 用于记录单词出现的次数,若count大于0,说明
				   				   从根节点到此节点的父节点构成了一个单词,这个
				   				   单词的次数就是count */
};

int n;	/* 树的总数 */

struct trie_node *init_trie_tree()
{
	return (struct trie_node *)calloc(1, sizeof(struct trie_node));
}

void insert(struct trie_node *root, char *word)
{
	struct trie_node 	*node;
	char 				*p;

	node = root;
	debug("%s.......\n", word);
	for (p = word; *p; p++) {
		debug("开始插入%c\n", *p);
		if (node->child[*p] == 0) {
			debug("%c不存在,创建新节点\n", *p);
			node->child[*p] = (struct trie_node *)calloc(1, sizeof(struct trie_node));
		}
		else {
			debug("%c存在\n", *p);
		}
		node = node->child[*p];
	}
	//到达记录统计单词次数的节点
	node->count++;
	debug("%s有%d个\n\n", word, node->count);
}

/* 借助pos指针来遍历每个单词,初始时pos指向worddump的第一个位置
 * 若往孩子节点走,则pos后移,若往兄弟节点走,则pos保持不动 
 */
void dfs_travel(struct trie_node *root)
{
	static char 	worddump[31];
	static int 	 	pos;
	int 			i;

	if (root->count) {	/* 如果count不为0,则肯定找到了一个单词 */
		worddump[pos] = '\0';
		if (worddump[0]) {
			printf("%s %0.4f\n", worddump, ((float)root->count*100)/(float)n);
		}
	}
	for (i = 0; i < 256; i++) {
		if (root->child[i]) {
			debug("找到%c\n", i);
			worddump[pos++] = i; 	/* 往下遍历,pos跟着后移,供孩子节点使用 */
			dfs_travel(root->child[i]);
			pos--;	/* 恢复位置,供下一个兄弟节点使用 */
			debug("回退1个位置\n");
		}
	}
}

int main()
{
	char 				line[31];
	struct trie_node 	*root;

	n = 0;
	root = init_trie_tree();
	while (gets(line)) {
		insert(root, line);
		n++;
	}
	dfs_travel(root);

	return 0;
}
分享到:
评论

相关推荐

    Trie树题解1

    在题目描述中提到的POJ1056、POJ1204、POJ2001、POJ2418、POJ2503、POJ2513和POJ1816等题目中,Trie树都起到了关键作用。 1. POJ1056 - 该题要求判断给定的二进制序列集合是否合法,即没有一个序列是另一个序列的...

    POJ2525-Text Formalization【TrieTree】

    今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie树(也称为前缀树或字典树)。这个题目来源于北京大学的在线判题系统POJ,旨在考察程序员对字符串处理和Trie树...

    poj 2418 二叉树

    二叉树的应用,二叉树的应用,二叉树的应用,

    POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】

    【标题】"POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】"涉及的是一道编程竞赛题目,主要考察参赛者的数据结构与算法应用能力,特别是Trie树(字典树)、并查集(MergeSet)以及欧拉路径(Euler Path)这...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ算法题目分类

    * trie 树:trie 树是指解决问题的 trie 树算法,如 poj2513。 四、简单搜索 简单搜索是指解决问题的简单搜索算法,包括深度优先搜索、广度优先搜索、简单搜索技巧和剪枝等。 * 深度优先搜索:深度优先搜索是...

    字典树练习 POJ 1056

    标题中的“字典树练习 POJ 1056”是指一个编程问题,源自编程竞赛网站POJ(Programming Online Judge)的题目1056。POJ是一个在线平台,程序员可以在这里提交代码并测试其正确性,以解决给定的问题。这类问题通常...

    poj题目分类

    * trie 树:例如 poj2513。 4. 简单搜索: * 深度优先搜索:例如 poj2488、poj3083、poj3009、poj1321、poj2251。 * 广度优先搜索:例如 poj3278、poj1426、poj3126、poj3087、poj3414。 * 简单搜索技巧和剪枝...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **解释**:Trie树(字典树)是一种用于存储和检索字符串的高效数据结构。 ### 三、动态规划 #### 1. 基本动态规划 - **例题**:poj2488, poj3083, poj3009, poj1321, poj2251 - **解释**:基本动态规划问题通常...

    poj1251 最小生成树

    标题“poj1251 最小生成树”是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这个题目主要涉及图论中的一个经典算法问题——最小生成树(Minimum Spanning Tree, MST)。在图论中,...

    poj各种分类

    如Trie树(前缀树)、KMP算法,用于字符串匹配和索引构建,见poj2513和poj1961。 #### 排序 快速排序、归并排序和堆排序等,不仅用于排序,也常用于解决与逆序数相关的问题,如poj2388。 #### 并查集 用于处理集合...

    POJ 部分题解 解题报告

    10. **POJ 2528 线段树.txt**:这是第三个线段树相关的题目,解题报告可能会深入讲解线段树在不同场景下的应用。 通过阅读这些解题报告,你可以学习到各种高级算法的应用,如动态规划、搜索算法、数据结构(如线段...

    POJ 1751 求最小生成树prim算法(JAVA)

    标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...

    acm训练计划(poj的题)

    6. **字典树(Trie)**: - (poj2513):一种高效的字符串检索数据结构。 ### 四、状态压缩 1. **状态压缩动态规划**: - (poj1837, poj1276):通过位运算来压缩状态,从而减少内存占用。 2. **背包问题**: - ...

    经典 的POJ 分类

    - POJ 2513:Trie树的基本构造与查询。 ### 编程技巧 #### C++模板应用 - **题目示例**: - POJ 3096、POJ 3007:模板函数与类的灵活使用。 #### 特殊数据结构 - **题目示例**: - POJ 3393、POJ 1472:自定义...

    线段树练习POJ 3264

    在本题“POJ 3264”中,我们可能面临的是一个区间最值或者区间求和的计算任务。线段树的基本思想是将数组或序列分成多个部分(通常是二分),每个部分对应线段树的一个节点,通过节点间的合并操作,快速获取区间信息...

    POJ 我收集的解题报告(100多道)

    2. **数据结构**:链表、栈、队列、堆、哈希表、树(如二叉树、平衡树、B树、Trie树等)和图。 3. **动态规划**:理解状态转移方程,解决具有重叠子问题和最优子结构的问题。 4. **贪心算法**:在每一步选择局部最...

    POJ1035-Spell checker

    还可以借助哈希表或Trie树数据结构来快速查找和匹配单词。 在算法设计上,可以先预处理一个单词词典,将所有可能的正确单词存储起来。然后,对于每个输入的单词,检查它是否在词典中。如果不在,可以通过一系列的...

    POJ题目简单分类(ACM)

    - **trie树**:用于高效字符串查询,包括静态和动态构建。 4. **搜索算法**: - **深度优先搜索**:如poj2488,常用于解决树或图的遍历问题。 - **广度优先搜索**:如poj3278,适用于寻找最短路径。 - **搜索...

Global site tag (gtag.js) - Google Analytics