我想知道我应该对此代码进行哪些更改以减少其执行时间。

import java.util.*;

public class ExamPeekableQueueImpl <E extends Comparable<E>> implements ExamPeekableQueue<E> {

    LinkedList<E> li = new LinkedList<E>();

    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;
    }
}

另外我想知道是为了实现 queuesLinkedList 更快还是 ArrayList 或任何其他数据结构。

最佳答案

目前你有 O(1) 插入和 O(nlogn) getMin/getMax/getMedian 。您可以使用已排序的数据结构将 logn 从 getter 移动到插入部分。或者,您可以保持插入不变,并通过对列表进行线性搜索并仅存储最小值来优化 getMin/getMax。对于 getMedian 没有什么可做的,因为 需要 一个排序集。

进一步的优化是在每个插入步骤期间存储最小值/最大值并更新两个值。这在插入时不会有任何(非常量)变化,并将您的 getMin/getMax 减少到 O(1)。 (感谢 Tedil )

这同样适用于 getMedian ,您可以将排序列表与链接列表并行保存。然后,您可以简单地从该列表的中间挑选中位数。当然,这会将插入时间更改为 O(logn) 或更糟(取决于您使用的列表),并且还会使存储空间量增加一倍。所以它是一种比 getMin/getMax 更昂贵的优化。

关于java - 在 Java 中实现队列的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12143685/

10-12 01:38