c - 如何计算字典中单词中前两个字母的出现频率?

标签 c

我有一个 143k 小写单词词典,我想计算前两个字母的频率 (即:aa* = 14、ab* = 534、ac = 714 ...za = 65、 ...zz = 0 )并将其放入二维数组中。

但是,我不知道如何在没有开关或一堆 if else 的情况下迭代它们,我尝试在谷歌上寻找解决方案,但我只能找到计算整个单词中的字母数量,而且大多只是东西在Python中。

我坐在这里思考了一段时间,思考如何才能做到这一点,但我的大脑一直在阻止这就是我想到的,但我真的不知道该去哪里。

int main (void) {
    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    char *arr[143091];
    
    FILE *fp = fopen("large", “r”);
    if (*fp == NULL)
    {
        return 1;
    }
    
    int i = 0;
    while ((read = getline(&line, &len, fp)) != -1)
    {
        arr[i] = line;
        i++;
    }
    
    char c1 = 'a';
    char c2 = 'a';
    i = 0;
    int j = 0;
    while (c1 <= 'z')
    {
        while (arr[k][0] == c1)
        {
            while (arr[k][1] == c2)
            {
                
            }
            c2++;
        }
        c1++;
    }
    fclose(fp);
    if (line)
        free(line);
    return 0;
}

我是个白痴还是我只是错过了一些非常基本的东西?我该如何解决这个问题?

编辑:我忘了提及字典只是小写,并且有一些边缘情况,例如 ae 并且某些单词有 ' (如 e'ere's)没有重音拉丁字符,它们都是 accii 小写

最佳答案

该代码假定输入每行一个单词且没有前导空格,并且将计算从 'a' 开始以两个 ASCII 字母开头的所有单词。 ..'z' 。由于问题中的陈述不完全清楚,我进一步假设字符编码是 ASCII 或至少与 ASCII 兼容。 (问题指出:“没有重音拉丁字符,它们都是 accii 小写”)

如果您想要包含仅由一个字母组成的单词或包含 ' 的单词,根据字符计算索引值会稍微复杂一些。在这种情况下,我将添加一个函数来根据字符值计算索引。 同样,对于非 ASCII 字母,数组索引的简单计算将不起作用。

程序逐行读取输入而不存储所有行,检查上面定义的输入并转换范围 'a' 中的前两个字符。 ..'z'索引 0 范围内的值..'z'-'a'计算二维数组中的出现次数。

#include <stdio.h>
#include <stdlib.h>

int main (void) {
    char *line = NULL;
    size_t len = 0;
    ssize_t read;

    /* Counter array, initialized with 0. The highest possible index will 
     * be 'z'-'a', so the size in each dimension is 1 more */
    unsigned long count['z'-'a'+1]['z'-'a'+1] = {0};
    
    FILE *fp = fopen("large", "r");
    if (fp == NULL)
    {
        return 1;
    }
    
    while ((read = getline(&line, &len, fp)) != -1)
    {
        /* ignore short input */
        if(read >= 2)
        {
            /* ignore other characters */
            if((line[0] >= 'a') && (line[0] <= 'z') &&
               (line[1] >= 'a') && (line[1] <= 'z'))
            {
                /* convert first 2 characters to array index range and count */
                count[line[0]-'a'][line[1]-'a']++;
            }
        }
    }
    
    fclose(fp);
    if (line)
        free(line);

    /* example output */
    for(int i = 'a'-'a'; i <= 'z'-'a'; i++)
    {
        for(int j = 'a'-'a'; j <= 'z'-'a'; j++)
        {
            /* only print combinations that actually occurred */
            if(count[i][j] > 0)
            {
                printf("%c%c %lu\n", i+'a', j+'a', count[i][j]);
            }
        }
    }

    return 0;
}

示例输入

foo
a
foobar
bar
baz
fish
ford

结果

ba 2
fi 1
fo 3

关于c - 如何计算字典中单词中前两个字母的出现频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68564322/

相关文章:

c++ - GCC Segmentation Fault Mac

c++ - 分析用 C 或 C++ 编写的程序

c++ - fread 可以是不可租的吗?

c++ - 用 C/C++ 编译一个 DLL,然后从另一个程序调用它

c - sed 执行失败

c - 括号和类型转换

python - 如何替换Windows中的posix闹钟

c - 当我们通过在 C 中调用 pipe() 函数获得两个文件描述符时,管道如何是单向的

android - 映射共享库时出错

c - 编译器在布局内存时是否考虑了内核内存空间?