Java 获取第i个元素时FIFO实现的数据结构
我想要一个数据结构,将是固定大小,并将作为先进先出。我的意思是,如果大小超过第一个元素,将被删除。每次插入后,我还要检查该结构的中间元素(即大小为21的第10个元素)Java 获取第i个元素时FIFO实现的数据结构,java,performance,fifo,Java,Performance,Fifo,我想要一个数据结构,将是固定大小,并将作为先进先出。我的意思是,如果大小超过第一个元素,将被删除。每次插入后,我还要检查该结构的中间元素(即大小为21的第10个元素) 我考虑使用ARARYDEQUE,但DEQI接口不考虑顺序。i、 e.获取第i个元素) 我将把它用于一个耗时的过程,性能对我来说很重要。我建议的数据结构是什么?您可以使用LinkedList LinkedList实现队列接口(FIFO),但您也可以在队列中的特定位置获取项目 例如: LinkedList<Object>
我考虑使用ARARYDEQUE,但DEQI接口不考虑顺序。i、 e.获取第i个元素)
我将把它用于一个耗时的过程,性能对我来说很重要。我建议的数据结构是什么?您可以使用
LinkedList
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
}
}
LinkedList队列=新建LinkedList();
公共void插入对象(对象o)
{
int middleElement=queue.size/2;
if(queue.size>20)//如果已满
{
queue.Poll();//删除第一个元素
queue.Offer(o);//添加元素
打印(queue.Get(middleElement));//打印中间元素
}
否则//如果未满
{
queue.Offer(o);//添加元素
打印(queue.Get(middleElement));//打印中间元素
}
}
让我们假设我们讨论的是通常包含大量元素的FIFO
- ArrayList不是一个好的选择,因为删除列表开头的元素是一个
操作。(对于包含N个元素的列表)O(N)
- LinkedList可能不是一个好的选择,因为获取第N个元素是一个
操作O(N)
O(1)
FIFO插入、O(1)
FIFO删除,以及O(1)
索引从FIFO开始获取元素i
。循环缓冲区行为使用两个索引实现,一个用于队列开始位置,另一个用于队列结束位置。插入和删除只涉及移动一个或另一个索引,而get(i)
归结为backingArray[(startPos+i)%backingArray.length]
的获取,并进行一些错误检查
如果您需要FIFO是可扩展的,您可以通过将备份阵列的大小增加一倍来实现这一点。。。并且仍然得到摊销O(1)
用于插入、删除和索引
我认为Apache Commons类符合您对固定大小FIFO案例的要求。它包括一个获取第i个元素的get(i)
方法。问题是链表上的get(i)
涉及以下i
链接。为什么不将ArrayList子类化并将自己的边界逻辑放入add
方法中呢?因为这样会有效地删除FIFO的头元素。