Asosiy qismga o‘tish

2. Qidiruv va ma’lumot tuzilmasini tanlash

Nazariya

Chiziqli qidiruv

Eng sodda usul — hammasini ko‘rib chiqish:

for i, x in enumerate(a):
    if x == izlangan:
        print(i)
        break

Bu O(n). Bitta qidiruv uchun yaxshi, lekin q ta so‘rov bo‘lsa
O(n·q) chiqadi: n = q = 200 000 bo‘lsa, 4·10¹⁰ amal — ulgurmaydi.

To‘g‘ri tuzilma masalani hal qiladi

# Sekin: har so‘rovda butun ro‘yxat ko‘riladi
if x in royxat:        # O(n)

# Tez: bir marta to‘plam quriladi, keyin har so‘rov deyarli bepul
toplam = set(royxat)   # O(n) — bir marta
if x in toplam:        # O(1) — har so‘rovda

Sanash masalalari

«Nechta har xil son bor», «qaysi element eng ko‘p uchraydi»,
«ikkita bir xil son bormi» — bularning hammasi lug‘at yoki to‘plam
bilan bir o‘tishda yechiladi:

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

Ikkita son yig‘indisi

Klassik masala: massivda yig‘indisi S ga teng ikkita son bormi?

Sodda yechim — ichma-ich ikkita sikl, O(n²). Lug‘at bilan esa bir
o‘tishda:

korilgan = set()
for x in a:
    if S - x in korilgan:
        print("bor")
        break
    korilgan.add(x)

Bu O(n). Fikr oddiy: har bir son uchun «juftim oldin uchraganmi?» deb
so‘raymiz.

Misol

n, q = map(int, input().split())
a = set(map(int, input().split()))
for _ in range(q):
    x = int(input())
    print('ha' if x in a else 'yoq')

Mashq masalalari

✓KodMasalaQiyinlik
AL02-1 Bormi? Boshlang‘ich
AL02-2 Qavslar muvozanati Oson
AL02-3 Aylanadagi sanoq O‘rta
AL02-4 Eng ko‘p uchragan son Boshlang‘ich
AL02-5 Yangi mehmon Boshlang‘ich

Nazorat savollari

1 Saralanmagan massivda chiziqli qidiruvning murakkabligi qanday? Bitta to‘g‘ri javob
2 q ta so‘rov bo‘lsa, ro‘yxatda qidirishning umumiy murakkabligi qanday? Bitta to‘g‘ri javob
3 `set` ga aylantirish bir marta O(n) vaqt oladi, keyin har bir qidiruv deyarli bir amal. To‘g‘ri yoki noto‘g‘ri
4 Nima chiqadi? Kod nima chiqaradi
a = [1, 2, 3, 2, 1]
print(len(set(a)))
5 Qaysi masalalar lug‘at yoki to‘plam bilan bir o‘tishda yechiladi? Bir nechta to‘g‘ri javob

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

6 Ikkita son yig‘indisi masalasida juftni qanday izlaymiz? Bo‘sh joyni to‘ldirish
for x in a:
    if ____ - x in korilgan:
        print('bor')
7 Yig‘indisi S bo‘lgan juftlikni topishning eng tez usuli qaysi? Bitta to‘g‘ri javob
8 n = 200000 va q = 200000 bo‘lsa, O(n·q) taxminan nechta amal? (10 darajasida, masalan 10^10) Qisqa javob — yoziladi
9 To‘plamda elementlar tartibi saqlanadi va `a[0]` bilan olish mumkin. To‘g‘ri yoki noto‘g‘ri
10 «Massivda takror element bormi?» — eng sodda tez yechim qaysi? Bitta to‘g‘ri javob

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