在列表

时间:2016-01-04 15:04:43

标签: c++ algorithm sorting

我有两个指向T类型容器的指针。

第一个*buffer具有固定大小(2的幂,由用户在运行时决定,默认为64)。

第二个*big有一个未知的大小,可能很大(你不会说?)。

*buffer完全填满时,其元素会被添加到*big并且*buffer被清空(我仍然不知道是否删除并重新分配或删除每个元素) 。这个过程重复了几次。

在流程结束时,必须对*big进行排序。如果在将所有元素添加到*big时执行排序算法,如果在构造期间以某个频率执行排序算法,或者由于&#排序,则排序算法无关紧要。 34;智能插入" *buffer中的*big

直到知道我已经想到了一种" merge-sort"算法

  1. *buffer实施为queue<T>。将*big实施为vector<queue<T>*>。有什么方法可以预先分配吗?
  2. 填写*buffer后,请运行sort()
  3. big.push_back(buffer)
  4. 在流程结束时,合并*big中的每个元素,如合并排序算法:取最上面的一个,与所有其他元素进行比较,从队列中弹出最小的元素并移动(可以我使用有效的移动?)到最终结果。
  5. 你认为这是一个有效的解决方案,还是可能存在一些问题(当然有)?你能想到另一种(更有效的)解决方案吗?

2 个答案:

答案 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)