サイズが 500 万を超えるベクトルがあり、そのたびにベクトルから最小のキーを持つ 1 つの要素を選択し、この要素に対して何らかの処理を行います。ただし、この特定の要素を処理すると、ベクトル内の残りのすべての要素も影響を受け、キーが更新されます。次回、ベクトルから最小のキーを持つ要素を取得したい場合は、ベクトルをもう一度並べ替える必要があります。問題は、ベクトルから最小の要素を取得する回数が 50 万回に達するため、プログラムの実行が非常に遅くなることです。より明確に理解できるように、次のコードを記述して説明します。
void function(vector<MyObj*>& A)
{ //A.size() is near 5 million, maybe even more such as 50 million.
make_heap(A.begin(), A.end(), compare); // compare function is self-defined.
for (int i=0; i<500000; i++)
{
MyObj* smallest_elem = A.front();
pop_heap(A.begin(), A.end());
A.pop_back();
Process_MyObj(smallest_elem); // here all of the elements
// in A will be affect, causing
// their keys changed.
make_heap(A.begin(), A.end()); // Since all elements' keys in A changed,
// so heap sorting A once again is
// necessary in my viewpoint.
}
}
コードをできるだけ効率的に実行する方法はありますか? 並列化など、アルゴリズムの限定的な改善ではなく、どんなアイデアでも大歓迎です。どうもありがとう!