如何提高操作大型数组的性能?

时间:2016-10-07 19:31:37

标签: java arrays performance heap-memory java-io

我正在解决Hackerrank上的一个问题,我相信我的逻辑或多或少是正确的,但是较大的数据集会降低性能,从而给我一个错误的"回答。以下是问题的链接,以便您查看:

https://www.hackerrank.com/challenges/qheap1

我想知道如何提高此脚本的性能,以便允许更大的数据集。我有一个与扫描仪有关的预感,但我不知道为什么。

public class Solution {
    private static final int ADD = 1;
    private static final int DELETE = 2;
    private static final int GET = 3;
    private static final int TICK = 1;
    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner in = new Scanner(System.in);
        PrintStream out = System.out;
        int n = in.nextInt();
        int[] heap = new int[n];

        int a = 0;
        while (a < n) {
            a = 0;
            int q = in.nextInt();

            switch(q) {
                case(ADD):
                    int nextAdd = in.nextInt();
                    /*out.println("ADD " + next);*/
                    int b = 0;
                    while (b < n) {
                        /*out.println(heap[b]);*/
                        if (heap[b] == 0) {
                            heap[b] = nextAdd+TICK;
                            /*printArray(heap);*/
                            b = n-1;
                        }
                        b++;
                    }
                    /*printArray(heap);*/
                    break;
                case(DELETE):
                    int c = 0;
                    int nextDelete = in.nextInt();
                    while (c < n) {
                        if (heap[c]-TICK == nextDelete) {
                            heap[c] = 0;
                            c = n-1;
                        }
                        c++;
                    }
                    /*printArray(heap);*/
                    break;
                case(GET):  
                    Arrays.sort(heap);
                    int d = 0;
                    while (d < n) {
                        if (heap[d] != 0) {
                            out.println(heap[d]-TICK);
                            d = n-1;
                        }
                        d++;
                    }
                    /*printArray(heap);*/
                    break;
            }
            a++;
            /*printArray(heap);*/
        }
    }

    public static void printArray(int[] ar) {
        String str = "";
        for (int i : ar) {
            str += i + " ";
        }
        System.out.println(str);
    }
}

2 个答案:

答案 0 :(得分:1)

查看您的代码,我能发现的唯一立即问题是这一行的事实

out.println(heap[d]-TICK);

没有被评论出来。这可能意味着你的java程序(不,它不是脚本,请注意你的措辞!)正在进行大量的IO操作。与您计划中的其他任何内容相比,这些昂贵

所以,评论一下然后看看会发生什么。

答案 1 :(得分:1)

您的方法存在的主要问题是您没有使用堆(因为挑战需要),您在使用数组时花费了太多时间。

以下是通过所有测试的实现:

public static void main(String[] args) {
    final Scanner in = new Scanner(System.in);

    final int n = in.nextInt();
    final PriorityQueue<Integer> q = new PriorityQueue<>(n);
    for (int i = 0; i < n; i++) {
        final int command = in.nextInt();
        switch (command) {
        case 1:
            q.add(in.nextInt());
            break;
        case 2:
            q.remove(in.nextInt());
            break;
        case 3:
            System.out.println(q.peek());
            break;
        }
    }
}