看一个经典的Map()和Reduce()函数示例,我正在编写一个程序,该程序将.txt文件作为输入,然后计算文档中每个单词的出现频率。我对这两个函数进行了大量研究,并发现了许多使用Java或通用伪代码的示例,但是有一部分我无法理解。这就是我现在拥有的:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void map(char *name, char *content){
char *str = (char*)malloc((9999)*sizeof(char));
str = content;
char* token;
token = strtok(str, " ,.");
while(token)
{
token = strtok(NULL, " ,.");
}
}
int main(int argc, char *argv[]){
int i =0;
char line[9999]; //= (char*)malloc((argc)*sizeof(char));
FILE *fp = fopen(argv[1], "r");
while (fgets(line, 150, fp) != NULL)
{
map(argv[1], line);
}
fclose(fp);
return 0;
}
map函数能够逐行标记文档中的每个单词,但是我不了解的部分是如何映射值。典型的“ emit(token,1)”将如何转换为C?
答案 0 :(得分:0)
这通常可以通过某种字典来解决(就像可能使用的Java和伪代码示例一样)。例如,您可能使用二叉搜索树(可能是自平衡的红黑树),每个节点都包含一个单词和一个数。不平衡的BST很容易创建,但搜索效率却不高。另一个解决方案(易于实现,但运行起来可能会慢得多)将是拥有一个简单的结构,该结构持有一个指向字符串和计数的指针,并具有此类结构的数组。不管您是否对数组进行排序,最终都将需要大量复制,并且可能需要进行大量重新分配(从而导致运行时间很短)。