私は現在Fisher-Yatesシャッフルを使ってランダム化しているstd::list
を持っています(http://en.wikipedia.org/wiki/Fisher-Yates_shuffle参照)。要約すると、私のコードはリストの次のステップを実行します:std :: listを無作為化したときのパフォーマンスを改善する
list
の各要素をループします。- ランダムに選択された要素を、現在の位置からそれ自身を含めてスワップします。
リストはランダムアクセスを提供しないため、これは手順1でリスト全体を反復処理していることを意味し、各要素について、反復処理を繰り返しています。 。これは私のプログラムのパフォーマンスの大きなボトルネックなので、私はそれを改善しようとしています。他の理由で私はコンテナとしてlist
を使用し続ける必要がありますが、ランダム化機能の開始時にvector
に変換し、最後にlist
に変換することを検討しています。私のリストには通常300〜400のアイテムが含まれているので、コンテナ間の変換コストは、アイテムを順番に移動するのを避けるためには価値があると思います。
私の質問です:これはコードを最適化する最良の方法のようですか?より良い方法がありますか?
コード自体の表示は、コードの内容を説明するよりも役立ちます。 – Marlon
std :: list要素の入れ替えは、std :: vectorsと比較して高価です。スワップを行う前にリストをベクターにコピーしてみてください。 – Max
おそらく両端キューがオプションになりますか?リストとベクトルのセマンティクスをサポートしているので、STLのrandom_shuffleを使うことができます – PeskyGnat