Asosiy qismga o‘tish

1. Algoritm murakkabligi

Nazariya

Muammo

Ikki dastur ham to‘g‘ri javob beradi, lekin biri 0,1 soniyada, ikkinchisi
40 daqiqada. Musobaqada ikkinchisi «Vaqt chegarasidan oshdi» oladi.
Demak, dasturni yozishdan oldin u qancha amal bajarishini
baholash kerak.

O-belgilash

Murakkablik — kirish hajmi n o‘sganda amallar soni qanday o‘sishi.
Doimiy ko‘paytuvchilar tashlanadi: muhimi o‘sish shakli.

BelgiNomiMisol
O(1)doimiya[0], x + y
O(log n)logarifmikikkilik qidiruv
O(n)chiziqlibitta sikl
O(n log n)—saralash
O(n²)kvadratikichma-ich ikkita sikl
O(2ⁿ)eksponensialbarcha kichik to‘plamlar

10⁸ qoidasi

Bir soniyada taxminan 10⁸ oddiy amal bajariladi (Python‘da
kamroq — 10⁷ atrofida). Shundan kelib chiqib chegaraga qarab
algoritm tanlanadi:

nMos murakkablik
n ≤ 10O(n!) ham bo‘ladi
n ≤ 20O(2ⁿ)
n ≤ 500O(n³)
n ≤ 5 000O(n²)
n ≤ 10⁶O(n log n) yoki O(n)
n ≤ 10⁹O(log n) yoki O(1)

Masala shartidagi cheklovlar — bu maslahat. «n ≤ 200 000» deb
yozilgan bo‘lsa, O(n²) yechim ataylab kesib tashlanadi.

Qanday sanaladi

for i in range(n):          # O(n)
    for j in range(n):      # ichida yana n
        ...                 # jami O(n²)

Ketma-ket kelgan qismlar qo‘shiladi (O(n) + O(n log n) = O(n log n)),
ichma-ich kelganlar ko‘paytiriladi.

Xotira ham hisoblanadi

[0] * 10**9 — bu bir necha gigabayt. Xotira chegarasi ham masalada
yozilgan bo‘ladi.

Misol

# O(n) — bitta sikl
yigindi = 0
for x in a:
    yigindi += x

# O(n^2) — ichma-ich
for i in range(n):
    for j in range(n):
        pass

Mashq masalalari

Nazorat savollari

1 Ichma-ich ikkita sikl (`for i in range(n)` ichida `for j in range(n)`) murakkabligi qanday? Bitta to‘g‘ri javob
2 n ≤ 200 000 bo‘lsa, qaysi murakkablik ulgurmaydi? Bitta to‘g‘ri javob
3 O-belgilashda doimiy ko‘paytuvchilar (masalan 3n dagi 3) hisobga olinmaydi. To‘g‘ri yoki noto‘g‘ri
4 Ikkilik qidiruvning murakkabligi qanday? (O(...) ko‘rinishida yozing) Qisqa javob — yoziladi
5 Qaysilari O(1) — doimiy vaqtli amallar? Bir nechta to‘g‘ri javob

Bir nechta javob to‘g‘ri bo‘lishi mumkin.

6 Ketma-ket kelgan O(n) va O(n log n) qismlarning umumiy murakkabligi qanday? Bitta to‘g‘ri javob
7 Bu sikl necha marta bajariladi? (n = 8) Kod nima chiqaradi
k = 0
n = 8
while n > 1:
    n //= 2
    k += 1
print(k)
8 Masala shartidagi cheklovlar (n ≤ 10⁶) qaysi algoritm kerakligini ko‘rsatadi. To‘g‘ri yoki noto‘g‘ri
9 Saralashning odatdagi murakkabligi qanday? Bo‘sh joyga yozing. Bo‘sh joyni to‘ldirish
sorted(a)  ->  O(n ____ n)
10 n ≤ 20 bo‘lgan masalada qaysi murakkablik ham qabul qilinadi? Bitta to‘g‘ri javob

Javoblar serverda tekshiriladi. Katta-kichik harf, apostrof shakli va ortiqcha bo‘shliq ahamiyatsiz.