我有一个列表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
是一个不错的选择吗?
答案 0 :(得分:1)
您的问题有两个方面:
1- 常量时间互换:从概念上讲,就交换而言,最佳方法是doubly linked list(std::list
)。
由于您的数据很大,节点将始终保留在内存中的初始位置,并且您只会更改一些常量指针以执行您提到的交换类型。
2- 位置:我们都知道内存中连续分配的空间对缓存性能更好。这倾向于std::vector
。
中间是什么? 可通过自定义分配器分配的可调整大小的连续内存块。设计这些有很多种方法。一个example。