Data structures 循环队列的缺点?

Data structures 循环队列的缺点?,data-structures,language-agnostic,queue,circular-buffer,Data Structures,Language Agnostic,Queue,Circular Buffer,最近,在一次采访中,我被问及使用循环队列的缺点。我想不出有什么。在互联网上搜索我发现的唯一答案是它比线性队列更难实现:)。还有其他缺点吗?在我看来,任何遍历队列的代码都必须跟踪第一个节点,以便检测遍历的结束。但是在多线程环境中,另一个线程可能会删除第一个节点,这将导致遍历线程进入无限循环。因此,遍历线程必须在其通过队列的循环期间保持第一个节点锁定。我想说循环队列的最大缺点是只能存储queue.length元素。如果将其用作缓冲区,则会限制历史深度 另一个较小的缺点是,如果不保留其他信息,很难区分

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

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

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


另一个较小的缺点是,如果不保留其他信息,很难区分空队和满队。

面试官想要的答案可能取决于上述问题以外的其他背景

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

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


或者,如果您使用具有周期性移位的线性队列而不是循环队列,则可能只是关于如何更好地利用您的语言提供的向量容器。

根据实现情况,您可能需要在循环队列中保留空节点,而线性队列可以完全填充。没有太多的缺点,除非每个节点都是巨大的!为什么节点必须留空?这取决于如何实现循环队列。如果在每个节点中存储数据,则无法轻松区分空列表和完整列表。@asheeshr-如果两个变量是“head”和“size”,而不是“head”和“tail”,则可以区分完整和空列表。您也可以使用“head”和“tail”来执行此操作,但在队列为空(或已满)时,为“tail”索引使用一个特殊值(例如-1)。如果可以“浪费”条目,则保留插槽也是可行的选择。这是CPU和内存的折衷。再说一次,在枚举期间使用任何类型的列表通常都有危险。例如,常规链表的尾部可能会被删除并移动到头部(在处理队列时并不少见),这可能会破坏迭代器。在多个进程之间共享内存的情况下,这不会发生吗?正如你明确提到的,我问threads@AshRj是的,在多个进程中肯定会发生这种情况。@NNEONNEON是的,我想是这样。在循环队列中,一旦创建队列,就不会添加或删除节点,只有指向头部和尾部的指针是高级的。没那么难。见对问题的评论。至少有两种方法可以做到这一点。。。