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



如何以优化的方式找到字母a - z的出现(忽略大小写),即使文件大小高达4GB或更多?c++/C中可能有哪些不同的实现?

一个实现是:

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

我认为没有多少优化剩下了。

  • 不需要为每个元素计算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或派生(一个octet =一个字符)编码。

对于4GB来说,这不是即时的。我知道做你正在做的事的方法要快得多。

另外,你的代码不能处理制表符、空格或其他字符。您需要使用isalpha(),并且只有当它返回true时才增加计数。

注意isalpha()是非常快的。但是,同样地,当输入量很大时,这段代码不会是即时的。

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

相关内容

  • 没有找到相关文章