一 题意:输入很多棵树(单词),统计每种树所占的百分比
二 算法:用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;
}
分享到:
相关推荐
在题目描述中提到的POJ1056、POJ1204、POJ2001、POJ2418、POJ2503、POJ2513和POJ1816等题目中,Trie树都起到了关键作用。 1. POJ1056 - 该题要求判断给定的二进制序列集合是否合法,即没有一个序列是另一个序列的...
今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie树(也称为前缀树或字典树)。这个题目来源于北京大学的在线判题系统POJ,旨在考察程序员对字符串处理和Trie树...
二叉树的应用,二叉树的应用,二叉树的应用,
【标题】"POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】"涉及的是一道编程竞赛题目,主要考察参赛者的数据结构与算法应用能力,特别是Trie树(字典树)、并查集(MergeSet)以及欧拉路径(Euler Path)这...
【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...
* trie 树:trie 树是指解决问题的 trie 树算法,如 poj2513。 四、简单搜索 简单搜索是指解决问题的简单搜索算法,包括深度优先搜索、广度优先搜索、简单搜索技巧和剪枝等。 * 深度优先搜索:深度优先搜索是...
标题中的“字典树练习 POJ 1056”是指一个编程问题,源自编程竞赛网站POJ(Programming Online Judge)的题目1056。POJ是一个在线平台,程序员可以在这里提交代码并测试其正确性,以解决给定的问题。这类问题通常...
* trie 树:例如 poj2513。 4. 简单搜索: * 深度优先搜索:例如 poj2488、poj3083、poj3009、poj1321、poj2251。 * 广度优先搜索:例如 poj3278、poj1426、poj3126、poj3087、poj3414。 * 简单搜索技巧和剪枝...
- **解释**:Trie树(字典树)是一种用于存储和检索字符串的高效数据结构。 ### 三、动态规划 #### 1. 基本动态规划 - **例题**:poj2488, poj3083, poj3009, poj1321, poj2251 - **解释**:基本动态规划问题通常...
标题“poj1251 最小生成树”是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这个题目主要涉及图论中的一个经典算法问题——最小生成树(Minimum Spanning Tree, MST)。在图论中,...
如Trie树(前缀树)、KMP算法,用于字符串匹配和索引构建,见poj2513和poj1961。 #### 排序 快速排序、归并排序和堆排序等,不仅用于排序,也常用于解决与逆序数相关的问题,如poj2388。 #### 并查集 用于处理集合...
10. **POJ 2528 线段树.txt**:这是第三个线段树相关的题目,解题报告可能会深入讲解线段树在不同场景下的应用。 通过阅读这些解题报告,你可以学习到各种高级算法的应用,如动态规划、搜索算法、数据结构(如线段...
标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...
6. **字典树(Trie)**: - (poj2513):一种高效的字符串检索数据结构。 ### 四、状态压缩 1. **状态压缩动态规划**: - (poj1837, poj1276):通过位运算来压缩状态,从而减少内存占用。 2. **背包问题**: - ...
- POJ 2513:Trie树的基本构造与查询。 ### 编程技巧 #### C++模板应用 - **题目示例**: - POJ 3096、POJ 3007:模板函数与类的灵活使用。 #### 特殊数据结构 - **题目示例**: - POJ 3393、POJ 1472:自定义...
在本题“POJ 3264”中,我们可能面临的是一个区间最值或者区间求和的计算任务。线段树的基本思想是将数组或序列分成多个部分(通常是二分),每个部分对应线段树的一个节点,通过节点间的合并操作,快速获取区间信息...
2. **数据结构**:链表、栈、队列、堆、哈希表、树(如二叉树、平衡树、B树、Trie树等)和图。 3. **动态规划**:理解状态转移方程,解决具有重叠子问题和最优子结构的问题。 4. **贪心算法**:在每一步选择局部最...
还可以借助哈希表或Trie树数据结构来快速查找和匹配单词。 在算法设计上,可以先预处理一个单词词典,将所有可能的正确单词存储起来。然后,对于每个输入的单词,检查它是否在词典中。如果不在,可以通过一系列的...
- **trie树**:用于高效字符串查询,包括静态和动态构建。 4. **搜索算法**: - **深度优先搜索**:如poj2488,常用于解决树或图的遍历问题。 - **广度优先搜索**:如poj3278,适用于寻找最短路径。 - **搜索...