DSA Material

Massivlar (Arrays)

Share to

Massivlar (arrays) — bu xotiraning ketma-ket joylashgan bloklaridir. Python'da list xuddi dinamik massivdek ishlaydi: ixtiyoriy elementga murojaat tez bo'ladi, oxiriga qo'shish (append) esa odatda tez bajariladi.

Kitobga moslik (3-bob: Massivlar va vektorlar)

Necaise kitobidan olib qaralganda, ushbu sahifa quyidagilarga mos keladi:

Bu yerda asosiy dizayn nuqtasi ikki tushunchani ajratishdir:

Aynan shu ajratish nima uchun oxiriga qo'shish amortizatsiyalangan O(1) ekanligini tushuntiradi.

Massiv amallarining umumiy ko'rinishi

Tasavvur modeli

Quyidagi g'oyalarni aniq tutib turing:

Massivlardan qachon foydalanish kerak

Massivlardan qachon foydalanmaslik kerak

Amallar

get(index)

Massiv xotirasi ketma-ket joylashgani uchun elementning manzili to'g'ridan-to'g'ri index asosida hisoblanadi. Hech qanday qadamlab o'tish (traversal) kerak emas.

Massivdan olish amali

def get(self, index):
    if index < 0 or index >= len(self.data):
        raise IndexError("index out of range")
    return self.data[index]

append(value)

append qiymatni oxiriga joylashtiradi. Ko'pchilik qo'shishlar doimiy vaqtda bajariladi. Kamdan-kam hollarda asosiy xotira kengayadi va ma'lumotlarni nusxalaydi, bu esa amortizatsiyalangan O(1) ni beradi.

Massivga qo'shish amali

def append(self, value):
    self.data.append(value)

insert(index, value)

index'dan oxirigacha bo'lgan elementlar bir katakka o'ngga suriladi, so'ngra yangi qiymat index'ga joylashtiriladi. Narxi suriladigan elementlar soniga chiziqli bog'liq.

Massivga oraga qo'shish amali

def insert(self, index, value):
    if index < 0 or index > len(self.data):
        raise IndexError("index out of range")
    self.data.insert(index, value)

delete(index)

index'dagi element olib tashlanadi va undan keyingi barcha elementlar bir katakka chapga suriladi.

Massivdan o'chirish amali

def delete(self, index):
    if index < 0 or index >= len(self.data):
        raise IndexError("index out of range")
    return self.data.pop(index)

To'liq amalga oshirilishi

class DynamicArray:
    def __init__(self):
        self.data = []

    def append(self, value):
        self.data.append(value)

    def get(self, index):
        if index < 0 or index >= len(self.data):
            raise IndexError("index out of range")
        return self.data[index]

    def set(self, index, value):
        if index < 0 or index >= len(self.data):
            raise IndexError("index out of range")
        self.data[index] = value

    def insert(self, index, value):
        if index < 0 or index > len(self.data):
            raise IndexError("index out of range")
        self.data.insert(index, value)

    def delete(self, index):
        if index < 0 or index >= len(self.data):
            raise IndexError("index out of range")
        return self.data.pop(index)

    def __len__(self):
        return len(self.data)

    def __repr__(self):
        return f"DynamicArray({self.data})"

Murakkablik jadvali

Amal Vaqt Nima uchun
Indeks bo'yicha o'qish O(1) Manzilni to'g'ridan-to'g'ri hisoblash
Indeks bo'yicha yangilash O(1) Mavjud katakni ustiga yozish
Oxiriga qo'shish (append) O(1) amortizatsiyalangan Vaqti-vaqti bilan o'lcham o'zgarishi va nusxalash
O'rtaga qo'shish O(n) O'ngga surish
O'rtadan o'chirish O(n) Chapga surish
Tartiblanmagan massivda qidirish O(n) Ketma-ket ko'rib chiqish

Keng tarqalgan andozalar

Ikki ko'rsatkich (Two pointers)

Tartiblangan massivlar va palindrom tekshiruvlari uchun foydali. Bir ko'rsatkich boshidan, ikkinchisi oxiridan boshlanadi; ular bir-biriga qarab harakatlanadi.

def is_palindrome(s):
    left, right = 0, len(s) - 1
    while left < right:
        if s[left] != s[right]:
            return False
        left += 1
        right -= 1
    return True

Suriluvchi oyna (Sliding window)

Takroriy yig'indini hisoblashning oldini olish uchun k o'lchamli joriy oynani kuzatib boring. Oynani har safar bir qadamga suring.

def max_sum_k(nums, k):
    if k > len(nums):
        return None

    window_sum = sum(nums[:k])
    best = window_sum

    for i in range(k, len(nums)):
        window_sum += nums[i] - nums[i - k]
        best = max(best, window_sum)

    return best

Chastotani sanash (Frequency counting)

Har bir elementning uchrash sonini sanash. Anagram tekshiruvlari, takror elementlarni aniqlash va gistogramma masalalari uchun foydali.

def is_anagram(a, b):
    if len(a) != len(b):
        return False

    count = {}
    for ch in a:
        count[ch] = count.get(ch, 0) + 1

    for ch in b:
        if ch not in count:
            return False
        count[ch] -= 1
        if count[ch] < 0:
            return False

    return True

Prefiks yig'indilar (Prefix sums)

To'plangan yig'indilarni oldindan hisoblab qo'ying, shunda O(n) tayyorgarlikdan keyin oraliq yig'indi so'rovlariga O(1) da javob berasiz.

def build_prefix(nums):
    prefix = [0] * (len(nums) + 1)
    for i in range(len(nums)):
        prefix[i + 1] = prefix[i] + nums[i]
    return prefix


def range_sum(prefix, left, right):
    return prefix[right + 1] - prefix[left]

Chegaraviy holatlar ro'yxati

Tipik xatolar