使用映射函数映射具有值的键

时间:2018-10-03 05:43:45

标签: c mapreduce

看一个经典的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?

1 个答案:

答案 0 :(得分:0)

这通常可以通过某种字典来解决(就像可能使用的Java和伪代码示例一样)。例如,您可能使用二叉搜索树(可能是自平衡的红黑树),每个节点都包含一个单词和一个数。不平衡的BST很容易创建,但搜索效率却不高。另一个解决方案(易于实现,但运行起来可能会慢得多)将是拥有一个简单的结构,该结构持有一个指向字符串和计数的指针,并具有此类结构的数组。不管您是否对数组进行排序,最终都将需要大量复制,并且可能需要进行大量重新分配(从而导致运行时间很短)。