【问题标题】:Disadvantage of circular queue?循环队列的缺点?
【发布时间】:2013-02-01 04:28:28
【问题描述】:

最近,在一次采访中,有人问我使用循环队列的缺点。我什么都想不出来。在互联网上搜索我发现的唯一答案是它比线性队列难以实现:)。还有其他缺点吗?

【问题讨论】:

  • 根据实现的不同,您可能必须在循环队列中将节点留空,而线性队列可能会被完全填充。没有太大的劣势,除非每个节点都很大!
  • 为什么节点必须留空?
  • 这取决于你如何实现循环队列。如果您在每个节点中存储数据,那么就没有简单的方法来区分空列表和完整列表。
  • @asheeshr - 如果 2 个变量是“head”和“size”而不是 head 和 tail,您可以区分 full 和 empty。您也可以使用“head”和“tail”来执行此操作,但是当队列为空(或已满)时,对“tail”索引使用特殊值(例如 -1)。保留插槽也是一个可行的选择,只要“浪费”一个条目是可以的。这是 CPU 与内存的权衡。

标签: data-structures language-agnostic queue circular-buffer


【解决方案1】:

面试官正在寻找的答案可能取决于上述问题中没有的其他上下文。

例如,循环队列通常被考虑用于高度并发的生产者/消费者系统。当队列已满时,队列前面和后面的操作可能会竞争相同的缓存行,这在这样的上下文中可能是个问题。

或者面试官想让你谈谈,与基于循环数组的队列相比,在垃圾收集语言中创建无锁链接队列要容易得多。

或者,如果您使用带有周期性移位的线性队列而不是循环队列,那么您可以如何更好地利用您的语言提供的向量容器。

【讨论】:

    【解决方案2】:

    我想说循环队列的最大缺点是您只能存储 queue.length 元素。如果您将其用作缓冲区,则会限制您的历史深度。

    另一个较小的缺点是在不保留额外信息的情况下很难区分空队列和满队列。

    【讨论】:

    • 没那么难。请参阅问题上的 cmets。至少有两种方法可以做到...
    【解决方案3】:

    在我看来,任何遍历队列的代码都必须跟踪第一个节点才能检测到遍历的结束。但是在多线程环境中,另一个线程可能会删除第一个节点,这会导致遍历线程进入无限循环。因此,遍历线程必须在其通过队列的循环期间保持第一个节点锁定。

    【讨论】:

    • 再一次,在枚举期间使用任何类型的列表通常都有危险。例如,常规链表的尾部可能会被删除并移动到头部(在处理队列时并不罕见),这可能会破坏迭代器。
    • 在多个进程之间共享内存的情况下不会发生这种情况吗?我问你明确提到 threads
    • @AshRj 是的,它肯定会发生在多个进程中。
    • @Nneonneo 是的,我想这是真的。
    • 在循环队列的情况下,一旦队列被创建,就不会增加或删除节点,只会前进指向头部和尾部的指针。
    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 2012-08-05
    • 2014-01-05
    • 1970-01-01
    • 2014-01-04
    • 2011-04-02
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多