计算文件中每个字母的出现次数?

时间:2013-01-03 18:15:00

标签: c++ c algorithm file optimization

如果文件大小只有4GB或更大,如何以优化的方式查找字母A-Z的出现(忽略大小写)?在C ++ / C中可能有哪些不同的实现?

一个实现是:

伪代码

A[26]={0}
loop through each character ch in file
If isalpha(ch)
     A[tolower(ch)-'A']+ = 1
End If
end loop

2 个答案:

答案 0 :(得分:9)

我认为没有太多优化。

  • 不是为每个元素计算tolower()-'A',而是计算每个字符的出现次数(在char[256]累加器中),然后进行大小写感知计算(可能更高效或不高效) , 试一试)。

  • 请务必使用缓冲输入(fopen,或者使用setvbuf分配更大的缓冲区)。

例如:

acum[256]={0}
loop through each character 'c' in file
     acum[c]++
end loop
group counts corresponding to same lowercase/uppercase letters

另外,请记住,这假设ASCII或派生(一个八位字节=一个字符)编码。

答案 1 :(得分:1)

这不会是4GB的瞬间。我知道如何更快地做你正在做的事情。

此外,您的代码不会处理制表符,空格或其他字符。您需要使用isalpha()并仅在计数返回true时递增计数。

请注意isalpha()非常快。但是,同样,这个代码不会在非常大的输入下瞬间完成。

TCHAR a[26] = { 0 };

for (int i = 0; i < length; i++)
{
    if (isalpha(text[i]))
    {
        a[tolower(text[i]) - 'a']++;
    }
}