我的13721057
中有std::vector<Sequence>
个元素。我需要对这个向量进行排序并获取前25个元素。我想,既然你可以在O(N)
中构建一个堆,那么弹出25个元素(每个都是O(logN)
)比在O(NlogN)
中对整个向量进行排序必须更快。
然而,当我给代码计时:
clock_t tStart = clock();
sort(mostFrequent.begin(), mostFrequent.end(), greater<Sequence>());
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
VS
clock_t tStart = clock();
make_heap(mostFrequent.begin(), mostFrequent.end());
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
对整个矢量进行排序似乎要快得多。这是为什么?
答案 0 :(得分:12)
这不是一个完整的答案,但要获得13721057中的前25个元素,最好使用partial_sort
。
如果您只需要第25个元素,那么nth_element
。
作为旁注。为了按排序顺序获取小于X的第一个元素,我将使用lambda auto mid = std::partition
,然后std::sort(begin,mid)
。可能有更好的方法。
答案 1 :(得分:9)
无论我尝试什么,我都无法在Solaris或Linux(gcc 4.4)上重现您的结果。 make_heap
总是花费大约1/3的时间。
int
进行排序,然后再对更大的“昂贵复制”类进行排序。我认为这种差异的实际原因是你的<
和>
运算符的复杂程度不同,或者复制你的对象相对于我的方式比较它有点昂贵测试无法复制。