列表的复杂性类
Complexity Classes for a List
为什么从数组或向量中删除某个东西是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)中完成的。
相关文章:
- 如何在类列表中获取参考?
- 虚拟基类的派生类列表
- 流运算符和多态基类列表
- 在类列表上迭代
- 从其基类列表中调用重写的函数
- 在模板类列表/节点程序中获取错误
- 子类列表"master copies",寻找更好的设计
- 将子类列表转换为超类列表
- 使用值为 std::shared_ptr的映射是具有多索引类列表的良好设计选择
- 在模板基类列表中使用类本地类型别名
- 列表的复杂性类
- 值不会在类列表的向量中被修改
- C++传递包含子类元素的类列表
- 迭代子类列表错误
- C++基类列表以及如何确定类类型
- Boost.Python:来自 python 中C++对象:无法添加到基类列表中C++
- 如何访问私有类列表
- 构造由索引从类列表中选择的类,c++
- 错误:"类列表"<RGBApixel>没有名为"curr"链表的成员
- 用于可变模板的基类列表