鉴于两个std::list<>
s l1
和l2
我可以在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中我没有找到类似的东西。
答案 0 :(得分:0)
一些研究提出了3种方法:
第一个是XOR Linked List,它是一个双向链表实现,它使用指针地址数学 - &#34; hack&#34;节省内存空间。在O(1)中也是naturally reversible。
此page描述了另一种算法,并且还引用了this paper introducing The Satellite Linked List。