2

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

一种实现是:

伪代码

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

2 回答 2

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 或派生(一个八位字节 = 一个字符)编码。

于 2013-01-03T18:21:19.017 回答
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']++;
    }
}
于 2013-01-03T18:18:17.227 回答