列表的恒定时间反向拼接

时间:2015-09-23 12:47:49

标签: c++ boost stdlist

鉴于两个std::list<> s l1l2 我可以在l2的O(1)常数时间内将l1拼接到l1.splice(l1.end(), l2)的末尾。
有时,我需要反向拼接l2,如:

l2.reverse();
l1.splice(l1.end(), l2);

由于l2调用,此操作需要时间与reverse()的大小呈线性关系。

我正在寻找一种在O(1)而不是线性时间内进行反向拼接的方法。

std::list通常被实现为双向链接列表&#34;,所以至少在理论上它可能是可行的。此外,splice不接受反向迭代器。

有没有办法在O(1)中进行反向拼接
是否有一些替代实现允许这样做?在boost中我没有找到类似的东西。

1 个答案:

答案 0 :(得分:0)

一些研究提出了3种方法:

第一个是XOR Linked List,它是一个双向链表实现,它使用指针地址数学 - &#34; hack&#34;节省内存空间。在O(1)中也是naturally reversible

page描述了另一种算法,并且还引用了this paper introducing The Satellite Linked List