获取第i个元素时FIFO实现的数据结构

时间:2014-02-28 13:44:47

标签: java performance fifo

我想要一个固定大小的数据结构,并将作为FIFO工作。我的意思是如果 size 超过第一个元素将被删除。在每次插入之后,我想检查该结构的中间元素(即大小为21的第10个元素)

我考虑使用ArrayDeque但是Deque接口不考虑顺序。即获得第i个元素)

我会将它用于耗时的过程,性能对我来说很重要。为了我的目的,建议的数据结构是什么?

2 个答案:

答案 0 :(得分:1)

让我们假设我们正在讨论通常包含大量元素的FIFO。

  • ArrayList不是一个好选择,因为删除列表开头的元素是O(N)操作。 (对于包含N个元素的列表)

  • LinkedList 可能不是一个好选择,因为获取第N个元素是O(N)操作。

我认为你需要一个由数组支持的循环缓冲区。从FIFO开始,这将为您提供O(1) FIFO插入,O(1) FIFO移除以及元素O(1)的{​​{1}}索引get。使用两个索引来实现循环缓冲行为,一个用于队列开始的位置,一个用于结束的位置。插入和删除只涉及移动一个或另一个索引,i归结为get(i)的提取并进行一些错误检查。

如果您需要FIFO可扩展,您可以通过将后备阵列的大小加倍来实现这一点......并且仍然可以分摊backingArray[(startPos + i) % backingArray.length]以进行插入,删除和索引。


我认为Apache Commons CircularFifoQueue类符合您对固定大小FIFO情况的要求。它包含一个O(1)方法来获取第i个元素。

答案 1 :(得分:0)

您可以使用LinkedListhttp://docs.oracle.com/javase/1.5.0/docs/api/java/util/LinkedList.html

LinkedList实现队列接口(FIFO),但您也可以在队列中的特定位置获取项目

例如:

LinkedList<Object> queue = new LinkedList<Object>();

public void insertObject(Object o)
{
   int middleElement = queue.size/2;
   if(queue.size > 20) //If full
   {
        queue.Poll(); //remove the first element
        queue.Offer(o); //Adds the element
        print(queue.Get(middleElement)); //Print the middle element

   }
   else //If not full
   {
      queue.Offer(o); //Adds the element
      print(queue.Get(middleElement)); //Print the middle element

   }
}