我有两个指向T
类型容器的指针。
第一个*buffer
具有固定大小(2的幂,由用户在运行时决定,默认为64)。
第二个*big
有一个未知的大小,可能很大(你不会说?)。
当*buffer
完全填满时,其元素会被添加到*big
并且*buffer
被清空(我仍然不知道是否删除并重新分配或删除每个元素) 。这个过程重复了几次。
在流程结束时,必须对*big
进行排序。如果在将所有元素添加到*big
时执行排序算法,如果在构造期间以某个频率执行排序算法,或者由于&#排序,则排序算法无关紧要。 34;智能插入" *buffer
中的*big
。
直到知道我已经想到了一种" merge-sort"算法
*buffer
实施为queue<T>
。将*big
实施为vector<queue<T>*>
。有什么方法可以预先分配吗?*buffer
后,请运行sort()
。big.push_back(buffer)
。*big
中的每个元素,如合并排序算法:取最上面的一个,与所有其他元素进行比较,从队列中弹出最小的元素并移动(可以我使用有效的移动?)到最终结果。你认为这是一个有效的解决方案,还是可能存在一些问题(当然有)?你能想到另一种(更有效的)解决方案吗?
答案 0 :(得分:1)
我仍然不知道是否删除并重新分配或删除每个元素
无需重新分配。
实施* big为
vector<queue<T>*>
。有什么方法可以预先分配它吗?
是的,可以使用reserve
成员函数预先分配向量。但如果你不知道它会有多大,那么你就不知道预分配多少了。
你能想到另一种(更有效的)解决方案吗?
一个非常简单的,因此很好的解决方案是使用std::multiset
作为大结构并完全跳过使用缓冲区。它与解决方案O(n log n)
具有相同的运行时复杂性。
答案 1 :(得分:0)
您可以将 std :: multiset 用于“大”。它元素存储为已排序,因此您无需手动调用排序。
对于'缓冲',您可以使用简单的 std :: vector ,并在std :: multimap中使用优化插入:
template< class InputIt >
void insert( InputIt first, InputIt last );
此类插入已经过优化,其复杂性为 Buffer_Size * log(Big_Size + Buffer_Size)