trie树词频统计,根据频率降序排列并输出前n项,c语言具体代码
时间: 2023-12-06 12:39:32 浏览: 94
C语言大作业:词频统计程序
5星 · 资源好评率100%
下面是C语言实现Trie树词频统计,并按照频率降序排列并输出前n项的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 100005 // 字符串最大长度
#define MAXM 1000005 // Trie树节点最大数量
#define MAXK 26 // 字符集大小
typedef struct Node {
int cnt; // 记录单词出现次数
struct Node* son[MAXK];
} Node;
Node* root; // Trie树根节点
int idx = 0; // Trie树节点计数器
char str[MAXN]; // 输入字符串
int n; // 字符串数量
int k; // 输出前k个高频单词
Node* create_node() {
Node* p = (Node*)malloc(sizeof(Node));
p->cnt = 0;
memset(p->son, 0, sizeof(p->son));
return p;
}
void insert(char* s) {
Node* p = root;
for (int i = 0; s[i]; ++i) {
int u = s[i] - 'a';
if (!p->son[u]) {
p->son[u] = create_node();
}
p = p->son[u];
}
++p->cnt;
}
void dfs(Node* p, int dep, char* s) {
if (p->cnt > 0) {
s[dep] = '\0';
printf("%s %d\n", s, p->cnt);
}
for (int i = 0; i < MAXK; ++i) {
if (p->son[i]) {
s[dep] = i + 'a';
dfs(p->son[i], dep + 1, s);
}
}
}
void solve() {
char s[MAXN];
dfs(root, 0, s);
}
int cmp(const void* a, const void* b) {
return (*(int*)b - *(int*)a);
}
void output() {
int* arr = (int*)malloc(sizeof(int) * n);
int cnt = 0;
dfs(root, 0, str);
for (int i = 0; i < idx; ++i) {
if (root[i].cnt > 0) {
arr[cnt++] = root[i].cnt;
}
}
qsort(arr, cnt, sizeof(int), cmp);
printf("前%d个高频单词为:\n", k);
for (int i = 0; i < k; ++i) {
printf("%d\n", arr[i]);
}
free(arr);
}
int main() {
scanf("%d%d", &n, &k);
root = create_node();
for (int i = 1; i <= n; ++i) {
scanf("%s", str);
insert(str);
}
output();
return 0;
}
```
上述代码中,我们使用Trie树实现了字符串的词频统计,然后使用深度优先搜索遍历Trie树,输出每个单词及其出现次数。最后,我们使用快速排序对出现次数进行排序,输出前k个高频单词。
阅读全文