/ | 顺序表 | 链表 |
---|---|---|
底层实现 | 通过动态数组在堆上申请空间,连续存储 | 动态链表,在堆区分配空间 |
空间利用率 | 因为是连续的空间,所以不易造成内存碎片,空间利用率高 | 结点不连续,易造成内存碎片,空间利用率低(比如一个节点的数据域占一字节,指针占四字节,那么空间利用率就会小与1/5,这比起顺序表来说空间利用率很低) |
查询元素 | 未排序情况下时间复杂度为O(n),排序之后利用二分查询时间复杂度为O(logn) | 时间复杂度为O(n) |
插入和删除 | 插入: ①空间足够的情况下:在最后插入时间复杂度O(1),在中间插入需要将原来的数据往后移动再添加元素。②空间不足的情况下:需要申请内存和释放内存,然后再对之前的数据进行拷贝。删除: 在最后删除的时间复杂度为O(1),在中间删除:将后面的数据向前移动,不需要释放内存,时间复杂度为O(n)。除此之外为了避免频繁的出现内存不足而进行增容操作,可以调用Reserve函数(增容函数),之开辟空间,不放数据。初始化顺序表的空间按照原来的2倍增加,从而提高顺序表的利用率。 | 插入:(需要内存申请) Insert O(1);Push_front O(1);Push_back O(1); 删除:(需要内存释放) Pop_front() O(1);Pop_back() O(1); Erase O(1); |
什么时候该用顺序表?
如果需要高效的随机存取,不在乎插入和删除的效率(很少进行插入和删除操作)就是选v用顺序表。此外顺序表具有空间局部性,如果一个存储器的位置被访问,那么将来它附近的位置的数据也会被访问,会降低程序执行的事件,提高程序执行的效率。
什么时候该使用链表?
如果需要大量的删除和插入操作,随机存取很少使用就是选用链表