数据结构思维笔记(六)双链表

本文对比了双链表、ArrayList和LinkedList的数据结构性能,详细分析了它们在不同操作(如add、get、remove等)上的时间复杂度,以及如何根据应用场景选择合适的数据结构。
1.双链表数据结构

ListDeque接口的双链表实现。[…] 所有的操作都能像双向列表那样执行。索引该列表中的操作将从头或者尾遍历列表,使用更接近指定索引的那个。

  • 每个节点包含下一个节点的链接和上一个节点的链接。
  • LinkedList对象包含指向列表的第一个和最后一个元素的链接。

所以我们可以从列表的任意一端开始,并以任意方向遍历它。因此,我们可以在常数时间内,在列表的头部和末尾添加和删除元素!

2.ArrayList,LinkedList和双链表的对比
MyArrayListMyLinkedList双链表
add(末尾)1n1
add(开头)n(剩余的都往后)11
add(一般)nnn
get / set1nn
indexOf / lastIndexOfnnn
isEmpty / size111
remove(末尾)1n1
remove(开头)n11
remove(一般)nnn

3.结构的选择

对于头部插入和删除,双链表的实现优于ArrayList。对于尾部插入和删除,都是一样好。所以,ArrayList唯一优势是getset,链表中它需要线性时间,即使是双链表(根据实际需要解决的问题来看)。

如果你知道,你的应用程序的运行时间取决于getset元素的所需时间,则ArrayList可能是更好的选择。如果运行时间取决于在开头或者末尾附加添加和删除元素,LinkedList可能会更好。

但请记住,这些建议是基于大型问题的增长级别。还有其他因素要考虑:

  • 如果这些操作不占用你应用的大部分运行时间 - 也就是说,如果你的应用程序花费大部分时间来执行其他操作 - 那么你对List实现的选择并不重要。
  • 如果你正在处理的列表不是很大,你可能无法获得期望的性能。对于小型问题,二次算法可能比线性算法更快,或者线性可能比常数时间更快。而对于小型问题,差异可能并不重要。
  • 另外,别忘了空间。到目前为止,我们专注于运行时间,但不同的实现需要不同的空间。在ArrayList中,这些元素并排存储在单个内存块中,所以浪费的空间很少,并且计算机硬件通常在连续的块上更快。在链表中,每个元素需要一个节点,带有一个或两个链接。链接占用空间(有时甚至超过数据!),并且节点分散在内存中,硬件效率可能不高。

总而言之,算法分析为数据结构的选择提供了一些指南,但只有:

  • 你的应用的运行时间很重要,
  • 你的应用的运行时间取决于你选择的数据结构,以及,
  • 问题的规模足够大,增长级别实际上预测了哪个数据结构更好。

作为一名软件工程师,在较长的职业生涯中,你几乎不必考虑这种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值