数组,堆栈和队列的搜索性能是什么?
我认为数组是最快和最直接的,因为我可以通过使用索引调用它来立即访问任何元素。它是否正确?堆栈和队列的性能如何?他们如何比较?
答案 0 :(得分:2)
数组(以及基于数组的集合,例如ArrayList
)对搜索性能不利,因为在最坏的情况下,您最终会比较每个项目(O(n)
)。
但是如果您不介意修改元素的顺序,可以对数组进行排序(Arrays.sort(yourArray)
),然后对其使用Arrays.binarySearch(yourArray, element)
,这会提供O(log n)
性能配置文件(更好的是O(n)
)。
堆栈位于O(n)
,所以没有。
队列甚至不打算迭代,因此在这里寻找一个对象意味着消耗整个队列,即1.不具有性能(O(n)
)和2.可能不是你想要的。 / p>
因此,在您建议的数据结构中,我会选择一个排序数组。
现在,如果你不介意考虑其他数据结构,你真的应该看看那些使用哈希函数的人(HashSet
,HashMap
...)。
散列函数非常擅长搜索元素,其中包含O(1)
中的性能配置文件(对象中有一个很好的hashcode()
方法)。
答案 1 :(得分:2)
我会尝试以一种非常简单的方式回答。
堆栈和队列用于临时存储数据,以便您可以逐个处理内容。就像购买电影票的队列或一堆煎饼一样,你可以一次处理一个元素。
数组用于存储数据以及从开头,结尾或之间访问元素。对于搜索,数组将是更好的选择。
你能搜索堆栈和队列中的元素吗?有可能。但这并不是他们的用途。
答案 2 :(得分:1)
这取决于您的搜索(或搜索算法)的实现方式。 Stack
或Queue
也可能对某些搜索应用很有帮助,例如 - BFS
,DFS
。但在正常情况下,当您使用线性搜索时,您可以考虑关于数组或ArrayList
。
答案 3 :(得分:1)
在Java中,您有ArrayList
(基于数组构建),Stack
(基于数组构建)和ArrayQueue
以及ArrayDeque(也构建在数组上)As它们都使用相同的底层数据结构,它们的访问速度基本相同。
对于强力搜索,扫描或迭代它们的时间(所有这些都支持迭代)是O(n)顺便说一句,即使HashMap使用数组来存储它的条目,这就是为什么迭代它的要找到一个值的元素,例如containsValue
也是O(n)。
虽然你可以拥有一个更自然地位于ArrayList中的排序数组,但你可以同样认为PriorityQueue会最有效地找到并删除下一个元素。 Stack非常适合查找最近添加的元素。
要回答这个问题,你必须确定问题提出者的假设。没有这些进一步的假设,你不得不说它们都可以被利用。在这种情况下,我会使用ArrayList,因为它是最容易理解的恕我直言。
答案 4 :(得分:1)
堆栈,队列和数组都是三种不同且高效的数据结构,但作为生物信息学家,如果您要存储生物数据,则应选择堆栈作为数据结构,因为递归过程的后进先出特性表明它是最适合的数据结构。递归实际上是堆栈的特征。在每个过程调用中,可以轻松地将值推入其中,并且在您退出过程时可以将其检索。因此,使用方法实际上是一件容易事。
答案 5 :(得分:0)
看到您无法将一种数据结构与另一种数据结构进行比较。每个人都有自己的优点和缺点。
虽然数组是好的,但是由于它们的固定大小,您不能一直使用它们。它们用于插入,删除等操作,因为它们需要O(1)时间。
但是,当您只想从一种方式访问和插入数据而又不想执行搜索时,则在这两者之间删除就可以进行堆栈和排队。堆栈和队列仅在访问元素的方法上有所不同。在堆栈中,您从同一侧访问数据,然后输入数据[LIFO]需要O(1)时间。在队列中,您可以从其他角落[FIFO]访问数据。可以访问介于两者之间的元素,但这不是它们的用途。