小编典典

为什么 std::list::reverse 有 O(n) 复杂度?

all

为什么std::listC++ 标准库中的类的反向函数具有线性运行时?我认为对于双向链表,反向函数应该是 O(1)。

反转双向链表应该只涉及切换头指针和尾指针。


阅读 64

收藏
2022-07-16

共1个答案

小编典典

假设,reverse可能是 O(1) 。(再次假设地)可能有一个布尔列表成员,指示链接列表的方向当前是否与创建列表的原始方向相同或相反。

不幸的是,这将降低基本上任何其他操作的性能(尽管不改变渐近运行时)。在每个操作中,需要参考一个布尔值来考虑是否跟随链接的“下一个”或“上一个”指针。

由于这可能被认为是相对不频繁的操作,因此标准(不规定实现,仅规定复杂性)指定复杂性可以是线性的。这允许“下一个”指针始终明确地表示相同的方向,从而加快常见情况的操作。

2022-07-16