0

マルコフ連鎖を含む C++ クラスの 2 番目の課題があります。割り当ては単純ですが、ファイルから文字を読み取るときに最適な実装を理解できません。

私は約300kのファイルを持っています。割り当てのルールの 1 つは、Map クラスと Vector クラスを使用することです。マップ (キーは文字列のみ) では、値はベクトルになります。ファイルから読み取るときは、キー ペアの収集を開始する必要があります。

例:

File1.txt
1234567890
1234567890

Select Markov k=3 の場合、マップには次のように表示されます。

key     vector
123  -> 4
456  -> 7
789  -> 0
0/n1 -> 2
234  -> 5
567  -> 8
890  -> /n
/n   -> NULL

教授の提案は char ごとに読み取ることなので、私のアルゴリズムは次のとおりです。

while (readchar != EOF){
tempstring += readchar
increment index
if index == Markovlevel {   
       get nextchar if =!EOF
       insert nextchar value in vector
       insert tempstring to Map and assign vector         
       unget char
}

}

その他の詳細は割愛します。私の主な質問は、318,000 文字がある場合、毎回条件を実行することになり、コンピューターの速度が大幅に低下することです (真新しい MAC プロ)。教授のサンプル プログラムは、このファイルを約 5 秒で実行します。

C++ でテキスト ファイルから固定長の単語を読み取る最適な方法がわかりません。

ありがとう!

4

2 に答える 2

5

ファイルの読み取りを繰り返すと、プログラムの速度が低下します。

バッファーに入れられた、たとえばサイズ 1024 のブロック単位でファイルを読み取ります。次に、割り当ての必要に応じてこのバッファを処理します。ファイルの処理が完了するまで、次のブロックに対して繰り返します。

于 2010-01-28T10:51:26.903 に答える
3

あなたは実際にプログラムの時間を計りましたか?318,000の条件文は、新しいMACプロにとっては簡単なことです。それはマイクロ秒しかかからないはずです。

時期尚早の最適化はすべての悪の根源です。プログラムを最初に機能させ、次に最適化を行います。

于 2010-01-28T10:50:50.273 に答える