交换后缀和集合前缀

时间:2013-03-17 21:38:00

标签: c++ c++11

我有一个列表L(在一般意义上,不是std::list)数字,我也有i这是L中最小元素的索引。我想交换由索引i分隔的两个分区。我应该执行哪些标准数据结构和操作,以便尽可能高效地执行此操作(最好是在恒定时间内)?

示例:让L成为9 6 -4 6 12。最小值为L[2] = -4,因此i = 2。交换两个分区后,我希望L-4 6 12 9 6

列表将非常大(最多10个 3 元素)并且我还必须遍历多次(在最坏的情况下最多10次 3 遍历),因为缓存问题,使用std::list不是一个好主意。另一方面,std::vector将使交换两个分区变得困难。 std::deque是一个不错的选择吗?

1 个答案:

答案 0 :(得分:1)

您的问题有两个方面:

1- 常量时间互换:从概念上讲,就交换而言,最佳方法是doubly linked liststd::list)。

由于您的数据很大,节点将始终保留在内存中的初始位置,并且您只会更改一些常量指针以执行您提到的交换类型。

2- 位置:我们都知道内存中连续分配的空间对缓存性能更好。这倾向于std::vector

中间是什么? 可通过自定义分配器分配的可调整大小的连续内存块。设计这些有很多种方法。一个example