trie树统计词频输出前n个次数最多的,C语言
时间: 2023-12-14 07:38:17 浏览: 91
以下是使用 Trie 树实现词频统计并输出前 n 个出现次数最多的单词的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_WORD_LEN 50
#define MAX_N 100
// 定义 Trie 树结点
typedef struct trie_node {
int count; // 记录单词出现次数
struct trie_node* next[26]; // 指向下一个字符的指针数组
} trie_node;
// 插入单词到 Trie 树中
void insert_trie(trie_node* root, char* word) {
trie_node* cur = root;
for (int i = 0; i < strlen(word); i++) {
int index = word[i] - 'a';
if (!cur->next[index]) {
cur->next[index] = (trie_node*)malloc(sizeof(trie_node));
cur->next[index]->count = 0;
for (int j = 0; j < 26; j++) {
cur->next[index]->next[j] = NULL;
}
}
cur = cur->next[index];
}
cur->count++;
}
// 比较函数,用于排序
int cmp(const void* a, const void* b) {
return (*(trie_node**)b)->count - (*(trie_node**)a)->count;
}
// 获取 Trie 树中前 n 个出现次数最多的单词
void get_top_n(trie_node* root, trie_node** top_n, int* n) {
if (!root) {
return;
}
// 遍历 Trie 树,找到出现次数前 n 大的单词
for (int i = 0; i < 26; i++) {
if (root->next[i]) {
trie_node* cur = root->next[i];
if (cur->count > top_n[*n - 1]->count) {
top_n[*n - 1] = cur;
qsort(top_n, *n, sizeof(trie_node*), cmp);
}
get_top_n(cur, top_n, n);
}
}
}
// 打印前 n 个出现次数最多的单词
void print_top_n(trie_node** top_n, int n) {
printf("Top %d words:\n", n);
for (int i = 0; i < n; i++) {
if (top_n[i]->count == 0) {
break;
}
printf("%d: ", i + 1);
trie_node* cur = top_n[i];
char word[MAX_WORD_LEN];
int len = 0;
// 从 Trie 树中回溯到根节点,构造出单词
while (cur != NULL) {
word[len++] = 'a' + (cur - cur->next[0]);
cur = cur->parent;
}
for (int j = len - 2; j >= 0; j--) {
printf("%c", word[j]);
}
printf(" (%d occurrences)\n", top_n[i]->count);
}
}
int main() {
trie_node* root = (trie_node*)malloc(sizeof(trie_node));
root->count = 0;
for (int i = 0; i < 26; i++) {
root->next[i] = NULL;
}
// 读取文件中的单词并插入到 Trie 树中
FILE* fp = fopen("input.txt", "r");
char word[MAX_WORD_LEN];
while (fscanf(fp, "%s", word) != EOF) {
insert_trie(root, word);
}
fclose(fp);
// 获取前 n 个出现次数最多的单词
int n = 10;
trie_node** top_n = (trie_node**)malloc(n * sizeof(trie_node*));
for (int i = 0; i < n; i++) {
top_n[i] = root;
}
get_top_n(root, top_n, &n);
// 打印结果
print_top_n(top_n, n);
// 释放内存
for (int i = 0; i < n; i++) {
free(top_n[i]);
}
free(top_n);
return 0;
}
```
该代码使用 Trie 树统计文本中单词出现次数,并输出前 n 个出现次数最多的单词。其中,将单词插入到 Trie 树中的函数 `insert_trie` 使用了循环遍历单词的每一个字符,依次将其插入到 Trie 树中。获取前 n 个出现次数最多的单词的函数 `get_top_n` 使用了深度优先遍历 Trie 树的方法,递归查找出现次数前 n 大的单词。在打印前 n 个出现次数最多的单词时,将每个单词从 Trie 树的叶子节点回溯到根节点,构造出单词并打印。注意,该代码假定输入文件中所有单词都是小写字母构成的,且单词长度不超过 50。
阅读全文