Middle
Тизмедеги ортосундагы элементти өчүргүм келсе, ArrayList же LinkedList колдонсумбы?
sobes.tech AI
AIден жооп
ArrayList.
Элементти ортоңкудан алып салуу үчүн:
- ArrayList: Бардык кийинки элементтерди жылдыруу талап кылынат, эң жаман учурларда (биринчи элементти алып салганда) убакыт $O(n)$ болот, анда $n$ — элементтердин саны. Орто эсеп менен, операция $O(n)$ бойдон калат, анткени тек гана жарымын жылдыруу керек. Чындыкта, иштетүү көбүнчө жакшыраак, анткени маалыматтардын жайгашуусу жакшыраак.
- LinkedList: Элементтер аркылуу өтүү керек, керек болгон түйүндү табуу үчүн ($O(n)$ эң жаман учурларда, эгер ал баштан же аягынан башталса). Түйүндү тапкандан кийин, алып салуу $O(1)$.
LinkedList ичинде түйүндү табуу жана андан кийин алып салуу операциясы орто эсеп менен ArrayListке караганда узак болот, анткени табуу $O(n)$, ал эми жылдыруу 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; // Тизмектин өлчөмү
int removeIndex = size / 2; // Жок кылуу индекси (ортосу)
// ArrayList
List<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < size; i++) {
arrayList.add(i);
}
long startTimeArrayList = System.nanoTime();
arrayList.remove(removeIndex); // Ортоңкудан алып салуу
long endTimeArrayList = System.nanoTime();
long durationArrayList = (endTimeArrayList - startTimeArrayList);
System.out.println("ArrayListтен алып салуу убактысы: " + 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); // Ортоңкудан алып салуу
long endTimeLinkedList = System.nanoTime();
long durationLinkedList = (endTimeLinkedList - startTimeLinkedList);
System.out.println("LinkedListтен алып салуу убактысы: " + durationLinkedList + " ns");
}
}
Жыйынтык көрсөтүп турат, эгер сиз индексин билсеңиз, ArrayList көбүнчө жакшыраак тандоо болуп саналат, анткени ал тезирээк индекске жетүү операциясын камсыз кылат, бул жылдыруу чыгымдарын жабат.
// ArrayList - индекс боюнча жетүү O(1), алып салуу O(n) (жылдыруу)
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
arrayList.remove(1); // "B" алып салуу - "C" жылдырылат
// LinkedList - индекс боюнча жетүү O(n), алып салуу O(1) (узун табгандан кийин)
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
linkedList.remove(1); // "B" алып салуу - биринчи "B" узунун табуу керек (O(n)), андан кийин алып салуу (O(1))
Жыйынтыктап айтканда, эгер сиз индексин билсеңиз, ArrayList көбүнчө жакшыраак тандоо, анткени ал тезирээк жетүү операциясын камсыз кылат, бул жылдыруу чыгымдарын жабат.