数组、堆栈和队列之间的性能差异

Posted

技术标签:

【中文标题】数组、堆栈和队列之间的性能差异【英文标题】:Performance difference between arrays, stacks and queues 【发布时间】:2015-07-04 10:50:13 【问题描述】:

数组、栈和队列的搜索性能如何?

我认为数组是最快和最直接的,因为我可以通过使用它的索引调用它来立即访问任何元素。它是否正确?堆栈和队列的性能如何?他们如何比较?

【问题讨论】:

你的问题很笼统,你能说得更具体些吗? 我的老师让我比较一侧的数组和另一侧的堆栈和队列。比较应该解决以下三个问题:数组与堆栈和队列:a-它们的角色 b-访问限制 c-易于搜索 d-插入或删除操作。 在 Java 中,您提到的所有集合都有一个数组实现。对于蛮力搜索,性能应该基本相同。您可以假设某些操作比其他操作更昂贵,但是它们都具有相同的 O(N) 来搜索 N 个元素,因此您基于理论得出的任何关于差异的结论都不太可能有用恕我直言。 【参考方案1】:

数组(以及基于数组的集合,例如ArrayList)不利于搜索性能,因为在最坏的情况下,您最终会比较每个项目(O(n))。 但是,如果您不介意修改元素的顺序,您可以对数组进行排序 (Arrays.sort(yourArray)),然后在其上使用Arrays.binarySearch(yourArray, element),它提供了O(log n) 性能配置文件(比O(n) 好得多)。

堆栈位于O(n),所以不。

队列甚至不打算被迭代,所以在这里寻找一个对象意味着消耗整个队列,这是 1. 不高效 (O(n)) 和 2. 可能不是你想要的。

所以在你建议的数据结构中,我会选择一个排序数组。

现在,如果您不介意考虑其他数据结构,您真的应该看看那些使用哈希函数的人(HashSetHashMap...)。 哈希函数非常擅长搜索元素,在O(1) 中具有性能配置文件(在您的对象中具有良好的hashcode() 方法)。

【讨论】:

谢谢大家的回答,我还是不知道怎么写。。这是我老师的作业。我不明白一些答案,因为我还是 Java 的初学者 :) 很遗憾,我们无法为您完成作业。我们可以回答问题,但您需要证明您理解。【参考方案2】:

我会尽量用很简单的方式回答。

堆栈和队列用于临时存储数据,以便您可以一一处理内容。就像购买电影票的队列或一堆煎饼一样,您一次处理一个元素。

数组用于存储数据以及从开头、结尾或中间访问元素。对于搜索,数组会是更好的选择。

您可以搜索堆栈和队列中的元素吗?可能。但这不是它们的用途。

【讨论】:

【参考方案3】:

这取决于您的搜索(或哪种搜索算法)是如何实现的。 StackQueue 也可能有助于一些搜索应用程序,例如 - BFSDFS。但在正常情况下,当您使用线性搜索时,您可以考虑使用数组或ArrayList

【讨论】:

【参考方案4】:

在 Java 中,您有 ArrayList(建立在数组上)、Stack(建立在数组上)和 ArrayQueue 和 ArrayDeque(也建立在数组上)因为它们都使用相同的底层数据结构它们的访问速度基本相同。

对于蛮力搜索,扫描或迭代它们的时间(它们都支持迭代)是 O(n) 顺便说一句,即使 HashMap 使用数组来存储它的条目,这就是为什么迭代它的元素以找到一个价值,例如containsValue 也是 O(n)。

虽然您可以拥有一个更自然地放在 ArrayList 中的排序数组,但您同样可以争辩说 PriorityQueue 会最有效地找到并删除下一个元素。 Stack 非常适合查找最近添加的元素。

要回答问题,您必须确定提出问题的人所做的假设。如果没有这些进一步的假设,您将不得不说它们都可以被利用。在这种情况下,我会使用 ArrayList,因为它是最容易理解的恕我直言。

【讨论】:

【参考方案5】:

栈、队列和数组都是三种不同的高效数据结构,但是作为生物信息学家,如果你想存储生物数据,你应该选择栈作为数据结构,因为递归过程的先进先出特性表明它是最合适的数据结构。递归其实是栈的一个特性。在每个过程调用中,可以轻松地将一个值推入其中,并且在您退出过程时可以检索该值。所以它实际上是一种使用方法。

【讨论】:

【参考方案6】:

您无法将一种数据结构与另一种数据结构进行比较。每个人都有自己的优势和劣势。

虽然数组很好,但你不能一直使用它们,因为它们的大小是固定的。它们用于插入、删除等,因为它们需要 O(1) 时间。

但是当您只想从一种方式访问​​和插入数据并且不想执行搜索时,您可以在堆栈和队列之间进行删除。堆栈和队列仅在访问元素的方法上有所不同。在堆栈中,您从输入数据的同一侧访问数据 [LIFO] 需要 O(1) 时间。在队列中,您从其他角落 [FIFO] 访问数据。可以访问介于两者之间的元素,但这不是它们的用途。

【讨论】:

以上是关于数组、堆栈和队列之间的性能差异的主要内容,如果未能解决你的问题,请参考以下文章

栈和队列数据结构博客园

简单方法快速记忆数组栈和队列函数

PHP 堆栈和队列

stl栈和队列的内部实现

Leetcode题解——数据结构之栈和队列

数组的push()pop()shift()和unshift()方法