如果文件大小只有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
答案 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']++;
}
}