2

ファイルサイズが 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
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 または派生 (1 オクテット = 1 文字) エンコーディングを前提としていることにも注意してください。

于 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 に答える