【发布时间】:2014-03-10 18:59:18
【问题描述】:
我有一个大小超过500万的向量,每次我想从向量中取出一个键最小的元素,并对这个元素做一些处理。然而,随着这个特定元素的处理,向量中的所有剩余元素也将受到影响,以便它们的键更新。所以下次如果我想从向量中取出键最小的元素,我必须再次对向量进行排序。问题是从向量中拾取最小元素的次数会高达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.
}
}
有没有办法让代码尽可能高效地运行?欢迎任何想法,而不是对算法的有限改进,例如并行或其他任何东西。非常感谢!
【问题讨论】:
-
处理如何影响所有其他元素是否有任何模式?真的是全部(在这种情况下,您的下限显然是 O(N))还是只是一些?可以同时增加和减少吗?
标签: c++ performance sorting parallel-processing binary-heap