数组、栈和队列的搜索性能如何?
我认为数组是最快和最直接的,因为我可以通过调用索引来立即访问任何元素。这个观点正确吗?那么栈和队列的性能如何?它们之间有什么比较?
数组、栈和队列的搜索性能如何?
我认为数组是最快和最直接的,因为我可以通过调用索引来立即访问任何元素。这个观点正确吗?那么栈和队列的性能如何?它们之间有什么比较?
数组(以及基于数组的集合,例如ArrayList
)在搜索性能方面很差,因为在最坏的情况下,您将比较每个项目(O(n)
)。
但是,如果您不介意修改元素的顺序,可以对数组进行排序(Arrays.sort(yourArray)
),然后在其上使用Arrays.binarySearch(yourArray, element)
,这提供了一个O(log n)
的性能概要(比O(n)
好得多)。
堆栈的时间复杂度为O(n)
,所以不行。
队列甚至没有被设计用于迭代,因此在这里查找对象将意味着消耗整个队列,这既不高效(O(n)
),也可能不是您想要的。
因此,在您提出的数据结构中,我会选择一个排序过的数组。
现在,如果您不介意考虑其他数据结构,您确实应该看看那些使用哈希函数的数据结构(HashSet
,HashMap
...)。
哈希函数非常擅长搜索元素,性能概要为O(1)
(使用您对象中良好的hashcode()
方法)。
ArrayList
(基于数组构建),一个Stack
(也是基于数组构建的)以及ArrayQueue
和ArrayDeque(也是基于数组构建的)。由于它们都使用相同的底层数据结构,因此它们的访问速度基本相同。对于暴力搜索,扫描或迭代它们的时间(它们都支持迭代)为O(n)。顺便说一句,即使HashMap也使用数组存储其条目,这就是为什么迭代其元素以查找值(例如containsValue
)也是O(n)的原因。栈、队列和数组都是三种不同且高效的数据结构,但作为一名生物信息学家,如果您想存储生物学数据,应该选择栈作为数据结构,因为递归过程的后进先出特性表明它是最合适的数据结构。递归实际上是栈的一个特征。在每个过程调用中,一个值可以轻松地被推入其中,并在退出过程时检索。因此,它实际上是一种易于使用的方法。
你不能将一个数据结构与另一个进行比较。每个数据结构都有其优点和缺点。
虽然数组很好,但由于其固定大小,您不能始终使用它们。它们用于插入、删除等操作,因为它们需要O(1)时间。
但是,当您只想从一侧访问和插入数据,并且不想在中间执行搜索、删除时,可以选择堆栈和队列。堆栈和队列仅在访问元素的方法上有所不同。在堆栈中,您从输入数据的同一侧访问数据[LIFO],需要O(1)时间。在队列中,您从另一个角落[FIFO]访问数据。可以访问中间的元素,但这不是它们的主要用途。