[JAVA] Behebung des Problems des langsamen Direktzugriffs für linkedList, eine Auflistungstypklasse

Verwenden Sie nach dem Lesen des Artikels Mechanismen und Merkmale der in Java häufig verwendeten Collection-Implementierungsklassen ArrayList, um den Mechanismus zu implementieren, den Sie erstellen möchten. Ich habe mich gefragt, welche der verknüpften Listen besser ist, daher schreibe ich das Ergebnis der Überprüfung der Berechnungszeit.

Der Mechanismus, den ich versucht habe zu machen

Was ich versucht habe, war ein "Routenarray". Für die Funktion f, die für natürliche Zahlen größer oder gleich 2 definiert ist Wir definieren n2 </ sub> als n2 </ sub> = f (n1 </ sub>) unter Verwendung der natürlichen Zahl n1 </ sub>. Dies wird wiederholt, bis nm </ sub> außerhalb des Definitionsbereichs von f liegt. Zu diesem Zeitpunkt möchte ich n k (1 <= k <= m) </ sub> als Array aufzeichnen.

Suchen Sie nach dem Sichern der Sequenz nach den Elementen im Pfad und extrahieren Sie den kleinsten Wert aus dem Bereich, der die Bedingungen erfüllt (z. B. den Bereich, der nur bestimmt werden kann, wenn die gesamte Sequenz bestimmt ist, z. B. die 10 Zahlen in der Mitte des Arrays). Ich ziele.

Warum sollten Sie den Sammlungstyp verwenden?

Der Grund, warum Sie den Auflistungstyp anstelle eines regulären Arrays verwenden sollten, ist, dass *** die Länge des Arrays unbestimmt ist ***. In Anbetracht dieses Punktes denke ich, dass die verknüpfte Liste besser ist, weil es einfach ist, Sequenzen hinzuzufügen. Andererseits besteht die Sorge, dass die Berechnungsgeschwindigkeit langsam sein kann, wenn es sich um eine verknüpfte Liste handelt, da ein Elementzugriff auf das Array erforderlich ist, um den Mindestwert zu ermitteln.

Verhaltensrichtlinien

Betrachten Sie auf der Grundlage des oben Gesagten die zu verwendende Klasse.

-Überprüfen Sie die Geschwindigkeit der Elementsuche von linkedList nach dem Erstellen eines Arrays. -Wenn die Berechnungsgeschwindigkeit langsam ist, vergleichen Sie sie mit der Array-Additionsgeschwindigkeit von Arraylist. -Wenn die Berechnungsgeschwindigkeit toleriert werden kann, implementieren Sie sie mithilfe der verknüpften Liste.

Starten Sie die eigentliche Berechnung

Der Grund, warum die Elementsuche in linkedList langsam ist, besteht darin, dass linkedlist nicht den Index des gesamten Elements enthält, sondern nur die Informationen der Elemente davor und danach. Um das Element an einer beliebigen Position zu extrahieren, werden die Elemente am Anfang oder am Ende ausgewählt. Weil wir folgen müssen. Infolgedessen ist der Direktzugriff langsamer als die Arrayliste, die einen Index für das gesamte Element enthält. Was ich diesmal jedoch versuche, ist, eine bestimmte Anzahl von Elementen aus einem bestimmten Element zu extrahieren und den Mindestwert unter ihnen zu finden. Wenn in diesem Fall der Wert eines Elements erhalten werden kann und gleichzeitig die Informationen für das nächste Element erhalten werden können, gibt es dann keinen Geschwindigkeitsverlust?

Daher wird der folgende Code zum Vergleich mit der for-Anweisung und der erweiterten for-Anweisung verwendet.

test.java


import java.util.LinkedList;
import java.util.Iterator;

public class test {
    static final int LIMIT = 100_000;
    static LinkedList<Integer> array =  new LinkedList<Integer>();
    static long sum = 0;

    static {
        for (int i = 0; i < LIMIT; i++) {
            array.addLast(i);
        }
    }

    static void addArrayNumbersWithFor() {
        sum = 0L;
        for (int i = 0; i < LIMIT; i++) {
           sum += array.get(i);
        }
        
    }

    static void addArrayNumbersWithAppliedFor() {
        sum = 0L;
        for (int value : array) {
           sum += value;
        }
        
    }

    static double measureCalculationTimeWithFor() {
        //Startzeit in Millisekunden
        long ts1 = System.currentTimeMillis();
        //Ausführung verarbeiten
        addArrayNumbersWithFor();
        //Holen Sie sich die Endzeit in Millisekunden
        long te1 = System.currentTimeMillis();
        //Verarbeitungszeit Millisekunde
        long tmsec1 = te1 - ts1;
        //Verarbeitungszeit Sekunden
        double tsec1 = (double) tmsec1 / 1000.0;

        System.out.println(sum);

        return tsec1;
    }

    static double measureCalculationTimeWithAppliedFor() {
        //Startzeit in Millisekunden
        long ts1 = System.currentTimeMillis();
        //Ausführung verarbeiten
        addArrayNumbersWithAppliedFor();
        //Holen Sie sich die Endzeit in Millisekunden
        long te1 = System.currentTimeMillis();
        //Verarbeitungszeit Millisekunde
        long tmsec1 = te1 - ts1;
        //Verarbeitungszeit Sekunden
        double tsec1 = (double) tmsec1 / 1000.0;

        System.out.println(sum);

        return tsec1;
    }

    public static void main(String[] args) {
        System.out.println(test.measureCalculationTimeWithAppliedFor());
        System.out.println(test.measureCalculationTimeWithFor());
  }
}
Ergebnis ist, für Satz: 4.943 Sekunden Erweitert für Anweisung: 0,008 Sekunden

Wenn aus diesem Ergebnis eine einfache for-Anweisung verwendet wird, werden die Elemente immer in der Reihenfolge vom ersten Element in der Schleife erfasst, während im Fall der erweiterten for-Anweisung die Informationen des nächsten Elements vom vorherigen Element erhalten werden. Es ist ersichtlich, dass es erfasst wird und das nächste Element erfasst wird.

Zusammenfassung

Wenn Sie einem Array nacheinander Elemente hinzufügen möchten und nicht wissen, wie viele Elemente hinzugefügt werden sollen, sollten Sie die verknüpfte Liste verwenden. Der Engpass ist die langsame Geschwindigkeit des Direktzugriffs, aber es ist ersichtlich, dass es keine langsame Geschwindigkeit gibt, da die Elemente von Anfang an in der Reihenfolge erfasst werden, indem die erweiterte for-Anweisung verwendet wird. Ich habe es nicht mit einem normalen Array verglichen, aber es basiert auf der Annahme, dass der Sammlungstyp verwendet wird.