Sobes.tech
Middle

Ro'yxatning o'rtasidan elementni o'chirishni istasangiz, ArrayList yoki LinkedList dan qaysi biri yaxshiroq?

sobes.tech AI

AIdan javob

ArrayList.

Listaning o‘rtasidan elementni olib tashlash:

  • ArrayList: Barcha keyingi elementlarni siljitishni talab qiladi, bu eng yomon holatda (birinchi elementni olib tashlashda) $O(n)$ vaqt oladi, bu yerda $n$ elementlar soni. Biroq, o‘rtacha holatda, operatsiya $O(n)$ qoladi, chunki faqat yarmi elementlarni siljitish kerak bo‘ladi. Haqiqiy ishlash ko‘rsatkichi odatda yaxshiroq bo‘ladi, chunki ma’lumotlarning yaxshiroq lokalizatsiyasi mavjud.
  • LinkedList: Kerakli tugunni topish uchun elementlar bo‘ylab iteratsiya qilishni talab qiladi ($O(n)$ eng yomon holatda, agar iteratsiya boshidan yoki oxiridan boshlansa). Tugunni topgach, uni olib tashlash $O(1)$.

LinkedListda tugunni o‘zi olib tashlash tezroq bo‘lsa-da, uni topish uchun qidiruv o‘rtacha holatda ArrayListga qaraganda sekinroq bo‘ladi.

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ListRemovalComparison {

    public static void main(String[] args) {
        int size = 100000; // Ro‘yxat hajmi
        int removeIndex = size / 2; // Olib tashlash indeksi (o‘rtacha)

        // ArrayList
        List<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            arrayList.add(i);
        }

        long startTimeArrayList = System.nanoTime();
        arrayList.remove(removeIndex); // O‘rtacha joydan olib tashlash
        long endTimeArrayList = System.nanoTime();
        long durationArrayList = (endTimeArrayList - startTimeArrayList);

        System.out.println("ArrayListdan olib tashlash vaqti: " + 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); // O‘rtacha joydan olib tashlash
        long endTimeLinkedList = System.nanoTime();
        long durationLinkedList = (endTimeLinkedList - startTimeLinkedList);

        System.out.println("LinkedListdan olib tashlash vaqti: " + durationLinkedList + " ns");
    }
}

Benchmark natijalari shuni ko‘rsatadiki, o‘rtadagi elementni olib tashlash uchun, ArrayList odatda tezroq bo‘ladi, nazariy siljitish murakkabligiga qaramay. Bu, LinkedListda indeks bo‘yicha qidiruv ($O(n)$) ArrayListdagi siljitishdan sekinroq bo‘lishidan kelib chiqadi.

// ArrayList - indeks bo‘yicha kirish O(1), olib tashlash O(n) (siljitish)
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
arrayList.remove(1); // "B" ni olib tashlash - "C" ni siljitish talab qilinadi

// LinkedList - indeks bo‘yicha kirish O(n), olib tashlash O(1) (tug‘unni topgach)
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
linkedList.remove(1); // "B" ni olib tashlash - avval "B" tug‘unni topish (O(n)), keyin olib tashlash (O(1))

Xulosa qilib aytganda, o‘rtadagi elementni olib tashlash operatsiyasi uchun, indeksni bilsangiz, ArrayList odatda, indeks bo‘yicha kirish operatsiyasining tezligi bilan afzalroq, bu siljitish xarajatlarini qoplaydi.