Middle
Mis on parem kasutada: ArrayList või LinkedList, kui ma tahan eemaldada elemendi keskmest nimekirjas?
sobes.tech AI
Vastus AI-lt
ArrayList.
Elementi keskelt eemaldamisel:
- ArrayList: Vajab kõikide järgnevate elementide nihutamist, mis halvimal juhul (kui eemaldatakse esimene element) võtab aega $O(n)$, kus $n$ on elementide arv. Keskmiselt jääb operatsioon $O(n)$-ks, kuna tuleb nihutada ainult pool elementidest. Tegelik jõudlus on sageli parem andmete parema paiknemise tõttu.
- LinkedList: Vajab iteratsiooni elementide kaudu, kuni leitakse vajalik sõlm ($O(n)$ halvimal juhul, kui algusest või lõpust alustatakse). Pärast sõlme leidmist, eemaldamine võtab $O(1)$.
Kuigi sõlme ise eemaldamine LinkedListis on kiirem, sõlme otsimine enne eemaldamist muudab kogu operatsiooni keskmiselt aeglasemaks kui ArrayListis.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListRemovalComparison {
public static void main(String[] args) {
int size = 100000; // Nimekirja suurus
int removeIndex = size / 2; // Eemaldamise indeks (keskel)
// ArrayList
List<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < size; i++) {
arrayList.add(i);
}
long startTimeArrayList = System.nanoTime();
arrayList.remove(removeIndex); // Keskmine eemaldamine
long endTimeArrayList = System.nanoTime();
long durationArrayList = (endTimeArrayList - startTimeArrayList);
System.out.println("ArrayList eemaldamise aeg: " + durationArrayList + " ns");
// LinkedList
List<Integer> linkedList = new LinkedList<>();
for (int i = 0; i < size; i++) {
linkedList.add(i);
}
long startTimeLinkedList = System.nanoTime();
linkedList.remove(removeIndex); // Keskmine eemaldamine
long endTimeLinkedList = System.nanoTime();
long durationLinkedList = (endTimeLinkedList - startTimeLinkedList);
System.out.println("LinkedList eemaldamise aeg: " + durationLinkedList + " ns");
}
}
Tulemused näitavad, et kui teate indeksit, on ArrayList tavaliselt parem valik, kuna see võimaldab kiiremat juurdepääsu indeksile, mis kompenseerib nihutamise kulud.
// ArrayList - juurdepääs indeksi järgi O(1), eemaldamine O(n) (nihutamine)
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
arrayList.remove(1); // "B" eemaldamine - nihutab "C"
// LinkedList - juurdepääs indeksi järgi O(n), eemaldamine O(1) (pärast sõlme leidmist)
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
linkedList.remove(1); // "B" eemaldamine - kõigepealt tuleb leida "B" sõlm (O(n)), siis eemaldada (O(1))
Kokkuvõttes, kui teate indeksit, on ArrayList sageli parem valik, kuna see võimaldab kiiremat juurdepääsu indeksile, mis kompenseerib nihutamise kulud.