小さな質問があります。LARGE unsigned char 配列内の特定の要素と、unsigned char 要素のみを含むベクトルをスキャンする最も速い方法は何ですか? 率直な答えは素晴らしいですが、詳細な詳細な答えは素晴らしいでしょう。高速とはどういう意味ですか? 基本的には、少なくとも 1 秒以内に特定の文字を検索します。私はそれがあまり教育を受けた定義ではないことを知っています...
注: 配列はソートされていません。
共通宣言:
unsigned char* Array = new unsigned char[ 50000 ];
std::vector< unsigned char > Vec( 50000 );
/*
* Fill Array & Vec with random bytes
*/
たとえば、配列で文字「a」を検索したい場合、次のループを記述して検索します。
注: 検索プロセスでは、複数の要素が検索されます。主に 256 です。したがって、そのマジック ナンバーを利用できます。
ループ方式の場合:
unsigned int Count = 0;
for ( unsigned int Index = 0; Index != 50000; ++ Index )
if( Array[ Index ] == 'a' ) Count ++;
std::count メソッド:
unsigned int Count = std::count ( Array, Array + 50000, 'a' );
配列内の特定の要素を検索するより高速な方法はありますか?
いくつかのアイデア - これについて私に親指を立てないでください! その唯一のアイデア。意見が欲しいです。
並べ替え
Array のコピーを作成して並べ替えると、速度が向上しますか? なぜコピーを作るのですか?元のコンテンツを保持する必要があるためです。目標は、基本的に文字の出現をスキャンしてカウントすることです。スピードが重要であることを忘れないでください。つまり、コピープロセスは高速でなければなりません。
Answer: No and its not worth it!
なんで?さて、これを読んでみましょう:
@キリルキーロフ:
依存します。単一の文字を検索する場合は、絶対にそうではありません。配列のコピーはコストのかかる操作です。それを並べ替える - さらに高価です。
配列が 1 つだけで、たとえば 100 個の異なる文字を検索する場合、この方法を使用するとパフォーマンスが向上する可能性があります。さて、これはあなたの使い方に大きく依存します。そして、この場合、誰もあなたに絶対に正しい答えを与えることはできません. それを実行してプロファイルする必要があります。
*詳細については、@Kiril Krov の有益な投稿までスクロールしてください。
回答: 特に SORTED でない場合に、この目標を達成するための本当に「速い」方法がないため、これまでのところ確実な答えはありません。ただし、スレッドは可能な解決策になる可能性があります。ただし、CPU には注意してください。これは@Andreaの提出された回答に基づいていました(詳細については、もう少し下にスクロールしてください)-正しく読んでほしいと思いました。