在非常长的字符串中查找频率的最佳方法

我必须找到一种非常优化的方法来查找包含单词的非常长的文件中的字符频率(使用C / C ++时,忽略大小写,应该计算小写和大写)。 我已经知道一个是这个(这里我正在读取终端用户的输入,但在我的情况下我将从文件中读取,所以请不要去get()函数,请关注我的主要目标是获得一个比这更优化的方式(如果可能的话)):

int main() { char string[100]; int c = 0, count[26] = {0}; printf("Enter a string\n"); gets(string); while (string[c] != '\0') { /** Considering characters from 'a' to 'z' only and ignoring others */ if (string[c] >= 'a' && string[c] <= 'z') count[string[c]-'a']++; c++; } for (c = 0; c < 26; c++) { /** Printing only those characters whose count is at least 1 */ if (count[c] != 0) printf("%c occurs %d times in the entered string.\n", c + 'a', count[c]); } return 0; } 

但我想比它更优化它,因为它必须工作一个包含很多单词的非常长的文件,有人可以给我任何建议或想法吗? 谢谢。

渐近复杂度没有变得更好,并且通常算法已经基本上处于最低限度。

您可以做出的最重要的改变是调用较少的IO函数(并且您不会将调用gets为真实的); 使用fread并读取一个大的(比如4 KB)缓冲区 – 更大的尺寸通常是没有用的。

根据CPU和缓存,如果你已经将整个字符串放在内存中,它可能会让你获得一些东西,只需要count 256个元素的长度,并避免使用if作为字母字符(为更大的缓存占用交换少一个分支预测点)。 但我怀疑这可能是可测量的 – 您的代码现在应该完全受IO限制,与等待磁盘读取相比,处理所需的CPU时间完全可以忽略不计。