ファイルサイズが 4GB 以上であっても最適化された方法で (大文字と小文字を区別せずに) A ~ Z の文字の出現を見つけるにはどうすればよいですか? C++/C で可能なさまざまな実装は何ですか?
1 つの実装は次のとおりです。
疑似コード
A[26]={0}
loop through each character ch in file
If isalpha(ch)
A[tolower(ch)-'A']+ = 1
End If
end loop
ファイルサイズが 4GB 以上であっても最適化された方法で (大文字と小文字を区別せずに) A ~ Z の文字の出現を見つけるにはどうすればよいですか? C++/C で可能なさまざまな実装は何ですか?
1 つの実装は次のとおりです。
疑似コード
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 または派生 (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']++;
}
}