Java OutOfMemory während des Sortierens

PashaMinigun:

Ich habe eine Aufgabe über eine Pyramide baut mit Liste von Zahlen, aber es gibt ein Problem mit einem Test. In meiner Aufgabe brauche ich eine Liste zu sortieren. Ich benutze Collections.sort ():

Collections.sort(inputNumbers, (o1, o2) -> {
            if (o1 != null && o2 != null) {
                return o1.compareTo(o2);
            } else {
                throw new CannotBuildPyramidException("Unable to build a pyramid");
            }
        });

Aber dieser Test fehl

@Test(expected = CannotBuildPyramidException.class)
    public void buildPyramid8() {
        // given
            List<Integer> input = Collections.nCopies(Integer.MAX_VALUE - 1, 0);

        // run
        int[][] pyramid = pyramidBuilder.buildPyramid(input);

        // assert (exception)
    }

mit OutOfMemoryError statt meiner eigenen CannotBuildPyramidException (es wird in einem anderen Verfahren nach dem Sortieren geworfen werden). Ich verstehe, dass es wegen des Timsort in Collections.sort () -Methode ist. Ich habe versucht, HeapSort zu verwenden, aber ich couldn auch Swap-Elemente, weil meine Eingabeliste als Arrays.asList initialisiert wurde () und wenn ich Set () -Methode ich UnsupportedOperationException bekommen. Dann habe ich versucht, meine Liste zu gemeinsamer Arraylist zu konvertieren

ArrayList<Integer> list = new ArrayList<>(inputNumbers);

aber ich habe OutOfMemoryError wieder. Es ist nicht zu bearbeiten Tests erlaubt. Ich weiß nicht, was mit diesem Problem zu tun. Im mit Java8 und IntelliJ IDEA SDK

Heapüberlaufs:

Beachten Sie, dass die Liste erstellt Collections.nCopies(Integer.MAX_VALUE - 1, 0)verwendet eine winzige Menge an Speicher und ist unveränderlich . Die Dokumentation sagt „Gibt eine unveränderliche Liste , bestehend aus n Kopien des angegebenen Objekts. Das neu zugewiesene Datenobjekt ist winzig (es enthält eine einzelne Referenz auf das Datenobjekt)“ . Und wenn man sich anschaut , die Umsetzung , sehen Sie , es tut genau das, was man aus dieser Beschreibung erwarten würde. Es gibt ein ListObjekt , das nur vorgibt , groß zu sein, nur die Größe und das Element hält einmal und Rückkehr dieses Elements , wenn es um einen Index gefragt.

Das Problem mit dem Collections.sortist dann zweifach:

Sie müssen also eine andere Art und Weise zu sortieren finden. Eines, das an Ort und Stelle arbeitet und nicht Swap etwas für diesen Eingang (was richtig ist, wie die Liste bereits sortiert ist). Sie könnten zum Beispiel den Einsatz Blase Art, die an diesem Eingang O (n) Zeit und O (1) Platz in Anspruch nimmt und versucht, keine Swaps hier.

Btw, über das Speicherproblem bekommen „wegen Timsort“ : Timsort ist wirklich nicht schuld. Sie erhalten nicht einmal auf den Timsort Teil, wie es der Vorbereitungs copy-to-Array ist, der das Speicherproblem verursacht. Und darüber hinaus ist Timsort smart und würde erkennen , dass die Daten bereits sortiert und dann nichts tun würde. Wenn Sie also haben tatsächlich an dem Timsort Teil, oder wenn Sie direkt in die Liste anwenden könnten, würde Timsort kein Problem verursachen.

Ich denke du magst

Origin http://10.200.1.11:23101/article/api/json?id=443442&siteId=1
Empfohlen
Rangfolge