列表的复杂性类

Complexity Classes for a List

本文关键字:复杂性类 列表      更新时间:2023-10-16

为什么从数组或向量中删除某个东西是O(n)复杂度,而从列表中删除某一东西是0(1)复杂度?

当您从向量中移除一个项目,而它不在最后一个位置时,您必须将所有后续元素向左移动一个位置。之所以会发生这种情况,是因为向量的一个要求是它的所有元素都形成一个连续的内存块,所以不能有"洞"。对于列表,不需要元素在内存中存储的顺序,因此删除元素后不需要移动。

列表存储指向下一个和上一个条目的指针。所以,如果您想删除元素(已经有迭代器/指针指向它),只需更新2个指针并删除内存即可。向量连续存储内存,因此当您删除一个元素时,它必须将其后面的所有元素移动到新的内存位置(最好的情况是删除最后一个元素-不需要移动任何项目;最坏的情况是移除第一个元素-所有其他项目都需要移动)。

列出操作

x->prev->next = x->next;
x->next->prev = x->prev;
delete x;

矢量运算

for x to size - 1
    copy next memory block to previous

从数组中移除一个项(数组和向量使用连续内存)时,需要移动数组的其余部分。这是O(N)。在列表中,每个列表项都指向下一个和上一个,因此无论列表长度如何,项目的取消链接都是在O(1)中完成的。