【问题标题】:how do queues provide O(1) performance on takes/puts?队列如何在取/放上提供 O(1) 性能?
【发布时间】:2020-02-13 16:57:07
【问题描述】:

我假设通过允许消费者和生产者在不相互锁定的情况下访问队列的尾部/头部来实现获取/放置的恒定时间性能。这对于内存队列是如何实现的?持久队列的答案是否会改变(可能)?在对生产者和消费者各有 1 个限制的系统中,如何解决这个问题?系统什么时候允许并发访问呢?

【问题讨论】:

  • 这取决于您用于队列的数据结构。例如,双向链表的答案与循环数组的答案非常不同。此外,如果您特别询问并发/线程安全队列,这将有助于在问题中明确说明。
  • 根据您的建议更新问题

标签: data-structures queue time-complexity


【解决方案1】:

Queue 使用双向链表作为它的数据结构。事实上,Java 中的队列是这样声明的:

Queue<SomeClass> q = new LinkedList<>();

LinkedList 在 Java 中默认是双向链表

现在offer() 或头部插入始终是O(1),因为您不需要遍历整个列表,并且与poll() 相同,您删除尾部并返回它。

现在就并发访问而言,它不应该对代码的时间复杂度产生任何影响。

【讨论】:

  • 这不太对 - 在 Java 中 Queue 是一个接口,而不是一个数据结构,LinkedList 不是唯一实现该接口的数据结构; ArrayDeque 是另一个非常常见的。
猜你喜欢
  • 2014-04-13
  • 2018-11-13
  • 2011-05-02
  • 2013-11-12
  • 2017-06-08
  • 2014-03-11
  • 2021-01-08
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多