我想知道我应该对这段代码做些什么改变以减少它的执行时间.
import java.util.*;
public class ExamPeekableQueueImpl > implements ExamPeekableQueue {
LinkedList li = new LinkedList();
public ExamPeekableQueueImpl(){
}
public void enqueue(E e){
if(li.isEmpty()){
li.add(0, e);
}
else
li.add(e);
}
public E dequeue(){
li.pollFirst();
return null;
}
public void printlist(){
System.out.println(li.toString());
}
public E peekMedian(){
int var = (((li.size())/2)+1);
Collections.sort(li);
//Integer var2 = li.get(var);
System.out.println("the median is:" + li.get(var-1));
return null;
}
public E peekMaximum(){
Collections.sort(li);
System.out.println("the maximum is:" + li.getLast());
return null;
}
public E peekMinimum(){
Collections.sort(li);
System.out.println("the minimum is:" + li.getFirst());
return null;
}
public int size(){
li.size();
return 0;
}
}
另外我想知道的是,对于实现队列,LinkedList是更快还是ArrayList或任何其他数据结构.
解决方法:
目前你有插入O(1)和getMin / getMax / getMedian的O(nlogn).您可以使用排序数据结构将登录从getter移动到插入部分.或者您可以保持插入不变并通过在列表中进行线性搜索并仅存储最小值来优化getMin / getMax.对于getMedian,没有什么可做的,因为你需要一个有序的集合.
进一步的优化是存储最小值/最大值并在每个插入步骤期间更新两个值.这将不会对插入进行任何(非常量)更改,并将getMin / getMax减少为O(1). (感谢Tedil)
这同样适用于getMedian,您可以在其中保存与链接列表并行的排序列表.然后,您可以简单地从该列表中间选择中位数.当然,这会将插入时间更改为O(logn)或更糟(取决于您使用的列表),并且还会使存储空间量增加一倍.因此,它比getMin / getMax更优化.
标签:java,queue
来源: https://codeday.me/bug/20190620/1248205.html
本文探讨了一种通过改进数据结构和算法以降低队列操作执行时间的方法。具体介绍了如何优化getMin/getMax/getMedian等操作,并讨论了LinkedList与ArrayList在队列实现上的性能差异。
1万+

被折叠的 条评论
为什么被折叠?



