如何提升自定义队列效率

风雨扬尘 2013-09-28 08:17:37
代码如下,如何提高enqueue和dequeue的效率
package jp.co.wap.exam;

import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;

public class PersistentQueue<E> {
private List<E> queue;
public PersistentQueue(){
//modify this constructor if neccessary, but do not remove it
queue = new ArrayList<E>();
}
private PersistentQueue(List<E> queue){
//modify or remove this constructor if necessary
this.queue = queue;
}
//add other constructor if necessary
/**
* Returns the queue that adds an item into the tail of this queue without modifying this queue
* @param e
* @return
* @throws IllegalArgumentException
*/
public PersistentQueue<E> enqueue( E e){
//TODO: make this method faster
if (e == null){
throw new IllegalArgumentException();
}
List<E> clone = new ArrayList<E>(queue);
clone.add(e);
return new PersistentQueue<E>(clone);
}
/**
* Returns the queue that removes the object at the head of this queue without modifying this queue
*
* If this queue is empty,throws java.util.NoSuchElementException
* @return
* @throws
* /java.util.NoSuchElementException
*/
public PersistentQueue<E> dequeue(){
//TODO:make this method faster
if ( queue.isEmpty()){
throw new NoSuchElementException();
}
List<E> clone = new ArrayList<E>(queue);
clone.remove(0);
return new PersistentQueue<E>(clone);
}
public E peek(){
//modify this method if needed
if (queue.isEmpty()){
throw new NoSuchElementException();
}
return queue.get(0);
}
public int size(){
//modify this method if necessary
return queue.size();
}

public static void main(String[] args){
PersistentQueue<String> ps = new PersistentQueue<String>();
ps.enqueue("string");
System.out.print(ps.peek());
}
}
...全文
391 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
风雨扬尘 2013-10-06
  • 打赏
  • 举报
回复
引用 12 楼 zhongxianyao 的回复:
推荐使用LinkedList来做,LinkedList是实现了Deque接口的,而Deque是继承了Queue接口的,所以说用LinkedList可以像使用队列一样,FIFO
嗯,多谢啦!
风雨扬尘 2013-10-06
  • 打赏
  • 举报
回复
引用 11 楼 gaofuqi 的回复:
队列为什么不用LinkedList,这个是《Java编程思想》推荐的。
多谢!
编程点滴 2013-10-04
  • 打赏
  • 举报
回复
引用 7 楼 yangchen521 的回复:
[quote=引用 4 楼 dracularking 的回复:] 每个人的出发点可能不一样,一般队列的使用方式就进栈,出栈,清空等,你这个等于是有特殊使用需求,一般是构造一个特殊的队列,可供改变原内容的,比如可以改变队列中某具体位置元素内容的,这个需求貌似就是java.util.LinkedList<E>
其实这个示例不需要在任意位置插入和删除元素,就是一个FIFO,队尾插入,队头删除,用LinkedList当然也是可以的。这是某知名IT公司的一道应试题,就是要求尽可能提升enqueue和dequeue的速度。[/quote] 推荐使用LinkedList来做,LinkedList是实现了Deque接口的,而Deque是继承了Queue接口的,所以说用LinkedList可以像使用队列一样,FIFO
gaofuqi 2013-10-04
  • 打赏
  • 举报
回复
队列为什么不用LinkedList,这个是《Java编程思想》推荐的。 具体原理如下: LinkedList底层实现是链表(双向链表),检索效率低、插入、删除效率; ArrayList的底层实现是数组,检索效率高、插入、删除效率低。 从效率来看队列是先进先出,最频繁的操作应该是插入和移出,因此使用LinkedList的效率肯定比ArrayList高,还有楼主可以看一下LinkedList的源码,使用的双向循环链表,实现stack、单向队列、双向队列都能满足,而且效率肯定不会低,当然你也可以自己根据里面的算法原理,自己实现。
dracularking 2013-10-04
  • 打赏
  • 举报
回复
引用 7 楼 yangchen521 的回复:
[quote=引用 4 楼 dracularking 的回复:] 每个人的出发点可能不一样,一般队列的使用方式就进栈,出栈,清空等,你这个等于是有特殊使用需求,一般是构造一个特殊的队列,可供改变原内容的,比如可以改变队列中某具体位置元素内容的,这个需求貌似就是java.util.LinkedList<E>
其实这个示例不需要在任意位置插入和删除元素,就是一个FIFO,队尾插入,队头删除,用LinkedList当然也是可以的。这是某知名IT公司的一道应试题,就是要求尽可能提升enqueue和dequeue的速度。[/quote] 那你刚开始说的不能改变内容是指什么呢? 基于ArrayList的队列enqueue,dequeue速度慢是不是由于需要顺序移动其它元素?基于这个考虑
风雨扬尘 2013-09-30
  • 打赏
  • 举报
回复
引用 8 楼 eastoneking 的回复:
呵呵,尽可能啊。 这个很坑。 可不可以回答jni呢?
呵呵,估计不行
想喝咖啡的貓 2013-09-29
  • 打赏
  • 举报
回复
用ArrayList去实现队列就不可能快起来。
dracularking 2013-09-29
  • 打赏
  • 举报
回复
引用 3 楼 yangchen521 的回复:
[quote=引用 2 楼 dracularking 的回复:] 哪里感觉出效率低呢
你觉得还有没有进一步提升的空间?我觉得还是有一些的。比如每次进队的时候,由于不能改变原队列的内容,总是要重新new一个List出来,这样做是不是拖累了速度[/quote] 没有,只是想了解一下你的出发点 每个人的出发点可能不一样,一般队列的使用方式就进栈,出栈,清空等,你这个等于是有特殊使用需求,一般是构造一个特殊的队列,可供改变原内容的,比如可以改变队列中某具体位置元素内容的,这个需求貌似就是java.util.LinkedList<E>
风雨扬尘 2013-09-29
  • 打赏
  • 举报
回复
引用 2 楼 dracularking 的回复:
哪里感觉出效率低呢
你觉得还有没有进一步提升的空间?我觉得还是有一些的。比如每次进队的时候,由于不能改变原队列的内容,总是要重新new一个List出来,这样做是不是拖累了速度
临碣 2013-09-29
  • 打赏
  • 举报
回复
引用 7 楼 yangchen521 的回复:
[quote=引用 4 楼 dracularking 的回复:] 每个人的出发点可能不一样,一般队列的使用方式就进栈,出栈,清空等,你这个等于是有特殊使用需求,一般是构造一个特殊的队列,可供改变原内容的,比如可以改变队列中某具体位置元素内容的,这个需求貌似就是java.util.LinkedList<E>
其实这个示例不需要在任意位置插入和删除元素,就是一个FIFO,队尾插入,队头删除,用LinkedList当然也是可以的。这是某知名IT公司的一道应试题,就是要求尽可能提升enqueue和dequeue的速度。[/quote] 呵呵,尽可能啊。 这个很坑。 可不可以回答jni呢?
风雨扬尘 2013-09-29
  • 打赏
  • 举报
回复
引用 4 楼 dracularking 的回复:
每个人的出发点可能不一样,一般队列的使用方式就进栈,出栈,清空等,你这个等于是有特殊使用需求,一般是构造一个特殊的队列,可供改变原内容的,比如可以改变队列中某具体位置元素内容的,这个需求貌似就是java.util.LinkedList<E>
其实这个示例不需要在任意位置插入和删除元素,就是一个FIFO,队尾插入,队头删除,用LinkedList当然也是可以的。这是某知名IT公司的一道应试题,就是要求尽可能提升enqueue和dequeue的速度。
风雨扬尘 2013-09-29
  • 打赏
  • 举报
回复
引用 5 楼 AFer198215 的回复:
用ArrayList去实现队列就不可能快起来。
我接触java不久,不知在JDK中,哪些结构比ArrayList速度更快呢,能够实现FIFO的,期待指教,谢谢!!!
dracularking 2013-09-28
  • 打赏
  • 举报
回复
哪里感觉出效率低呢
尘缘udbwcso 2013-09-28
  • 打赏
  • 举报
回复
我怎么感觉可以就这样写呢 public class PersistentQueue<E> extends ArrayList<E>

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧