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