在实现堆栈和队列时,数组相对于链表的优势是什么?



当可以使用linked-list完成时,为什么我们要使用数组来实现堆栈和队列? 我刚刚学会了使用链表实现堆栈和队列,所以自然而然地使用数组对我来说到目前为止没有意义,更具体地说,我们可以受益于O(1)只是操作指针的推送弹出,而不必担心数组的大小,除非它变得太大。

如果你正在实现一个纯堆栈(你只访问第一个项目(,或者一个纯队列(你只访问第一个或最后一个(,那么你有 O(1( 访问权限,无论你是把它实现为数组还是链表

。如前所述,使用数组的缺点是,当数据结构超出已分配的范围时,必须调整大小。但是,您可以通过始终将大小加倍来降低调整大小的频率。如果最初分配足够的空间来处理典型的堆栈大小,则调整大小并不频繁,在大多数情况下,一次调整大小操作就足够了。如果您担心分配的内存过多,您可以随时添加一些逻辑,如果分配的内存量远远超过数据结构中的项目数,这些逻辑将减小大小。

链表有明确的好处,但每次添加到链表都需要分配(以及删除、解除分配(,这需要一些时间,还可能导致堆碎片。此外,每个链表节点都有一个next指针,使每个项目的内存量超过数组所需的内存量。最后,每个单独的分配都有一些内存开销。总而言之,n项的链接列表将比n项数组占用更多的内存。

因此,每种方法都有优点和缺点。我不会说两者都可以被认为是"最好的",但是有很好的理由用数组而不是链表来实现这些数据结构。如果实现正确,基于数组的堆栈或队列可以比链表实现更快、更节省内存。

在一个数组中,如果你想进入某个元素(假设10(,你必须在括号内写下数组的名称及其索引。但是,在链表中,您必须从头部开始,然后逐步完成,直到到达元素。因此,访问数组中的元素比链表更快,因为链表需要线性时间来执行搜索。

数组和列表都有自己的优点/缺点;当你需要什么时,这取决于你! 例如,

数组中,我们可以在您需要时获得 O(1( 复杂度的元素链表的情况下,最小O(n(,如果你认为这是一个优势 在链表上,缺点是数组的大小需要 预先确定这可能是实现现实世界时的问题 问题,因为在实现问题之前很难知道输入/输入列表的大小,有时需要在运行时增加/放大列表

因此可以看出,您需要根据您正在处理的情况考虑这些优点/缺点,并且需要慷慨地使用这些数据结构! :D

最新更新