Middle
Kas ir labāk izmantot: ArrayList vai LinkedList, ja es vēlos izdzēst elementu no vidus saraksta?
sobes.tech AI
Atbilde no AI
ArrayList.
Noņemot elementu no vidus saraksta:
- ArrayList: Prasideda visų vėlesnių elementų poslinkis, kas blogiausiu atveju (pašalinus pirmą elementą) užtrunka $O(n)$ laiką, kur $n$ yra elementų skaičius. Tačiau vidutiniškai operacija lieka $O(n)$, nes reikia perkelti tik pusę elementų. Faktinis našumas dažnai būna geresnis dėl geresnės duomenų lokalizacijos.
- LinkedList: Reikalauja pereiti per elementus iki reikalingo mazgo ($O(n)$ blogiausiu atveju, jei pradžia arba pabaiga). Po mazgo radimo, pašalinimas užtrunka $O(1)$.
Nors pats mazgo pašalinimas LinkedList yra greitesnis, mazgo paieška prieš pašalinimą daro bendrą operāciju vidutiniškai lėtesnę nei ArrayList.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListRemovalComparison {
public static void main(String[] args) {
int size = 100000; // Saraksta lielums
int removeIndex = size / 2; // Noņemšanas indekss (vidus)
// ArrayList
List<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < size; i++) {
arrayList.add(i);
}
long startTimeArrayList = System.nanoTime();
arrayList.remove(removeIndex); // Vidus noņemšana
long endTimeArrayList = System.nanoTime();
long durationArrayList = (endTimeArrayList - startTimeArrayList);
System.out.println("ArrayList noņemšanas laiks: " + 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); // Vidus noņemšana
long endTimeLinkedList = System.nanoTime();
long durationLinkedList = (endTimeLinkedList - startTimeLinkedList);
System.out.println("LinkedList noņemšanas laiks: " + durationLinkedList + " ns");
}
}
Rezultāti rāda, ka, ja zināt indeksu, ArrayList ir biežāk labāka izvēle, jo tas nodrošina ātrāku piekļuvi pēc indeksa, kas kompensē pārvietošanas izmaksas.
// ArrayList - piekļuve pēc indeksa O(1), noņemšana O(n) (pārvietošana)
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
arrayList.remove(1); // "B" noņemšana - pārvieto "C"
// LinkedList - piekļuve pēc indeksa O(n), noņemšana O(1) (pēc mazga atrašanas)
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
linkedList.remove(1); // "B" noņemšana - vispirms jāatrod "B" mazgs (O(n)), tad jānoņem (O(1))
Kopumā, ja zināt indeksu, ArrayList ir biežāk labāka izvēle, jo tas nodrošina ātrāku piekļuvi pēc indeksa, kas kompensē pārvietošanas izmaksas.