Asosiy mazmunga o'tish

12-dars: Navbat va deque

2-darajaKumush — usullar9–16 darslar

Bu darsdan keyin siz

  • navbat va stek farqini bilasiz va qaysi biri kerakligini tanlaysiz
  • list.pop(0) nega sekin ekanini tushuntirasiz
  • deque bilan sirpanuvchi oyna maksimumini O(n) da topasiz

Avval qo‘lda

~5 daqiqaguruh bilanHech narsa, faqat joy

Sakkiz kishi qatorga tursin. O’qituvchi «kirdi» desa boshidagi chiqib ketadi, «keldi» desa oxiriga yangi odam qo’shiladi.

Endi bitta shartni o’zgartiring: boshidagi chiqqanda qolganlar hammasi bir qadam oldinga yursin. Yigirma marta takrorlab, jami nechta qadam bosilganini sanang.

Nimani sezishingiz kerak

Ikkinchi holatda har chiqishda yetti kishi qimirladi. Python ro’yxatida pop(0) aynan shu: qolgan hamma element bittaga suriladi. Deque esa qatorni joyida qoldiradi.

Kompyuter yopiq. Bu mashq tugamaguncha kod ochilmaydi.

navbatqueue

Elementlar bir uchidan qo’shilib, ikkinchi uchidan olinadigan tuzilma. «Birinchi kelgan birinchi ketadi» qoidasi bilan ishlaydi.

dequedouble-ended queue

Ikki tomonlama navbat: ikkala uchidan ham qo’shish va olish mumkin, har amal o’zgarmas vaqtda bajariladi.

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
from collections import dequenavbat = deque([1, 2, 3])navbat.append(4)print(navbat.popleft(), navbat.popleft())print(list(navbat))
Javobni ko'rish
1 2
[3, 4]

append oxiriga qo'shadi, popleft boshidan oladi. Ikkalasi ham ro'yxatni surmaydi — deque ichkarida bo'laklarga bo'lingan holda saqlanadi.

Masala: har k soatlik oraliq uchun eng yuqori haroratni toping. Birinchi fikr — har oyna uchun max() chaqirish.

sekin.py
harorat = [1, 3, -1, -3, 5, 3]k = 3javob = [max(harorat[i:i + k]) for i in range(len(harorat) - k + 1)]print(javob)

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
harorat = [1, 3, -1, -3, 5, 3]k = 3javob = [max(harorat[i:i + k]) for i in range(len(harorat) - k + 1)]print(javob)
Javobni ko'rish
[3, 3, 5, 5]

To'rtta oyna, to'rtta javob. Bir qatorga sig'di — lekin qo'shni ikki oyna k-1 ta elementni birga ishlatadi va ularning hammasi qaytadan o'qiladi.

max() har safar butun oynani ko’radi: n × k amal. k katta bo’lganda bu deyarli ga aylanadi.

Sig‘adimi?

Bir soniyada taxminan 10⁸ oddiy amal bajariladi.

Yechimn = 1 000n = 200 000
Har oyna uchun max()n^210⁶sig‘adi10¹⁰sig‘maydi
Deque bilann1 000sig‘adi200 000sig‘adi

Yashil — yechim o‘tadi. Sariq — chegarada, konstanta va til muhim bo‘lib qoladi. Qizil — bu yechim bilan bormaydi, boshqasini qidiring.

Deque ichida indekslar saqlanadi va ularga mos haroratlar kamayuvchi tartibda turadi. Shu sababli dequening boshidagi indeks har doim joriy oynaning maksimumi bo’ladi.

Ikkita qoida yetadi. Yangi element kelganda undan kichik yoki tenglari orqadan chiqariladi — ular endi hech qachon maksimum bo’la olmaydi. Oynadan chiqib ketgan indeks esa boshdan olinadi.

tez.py
from collections import dequeharorat = [1, 3, -1, -3, 5, 3]k = 3oyna = deque()javob = []for i in range(len(harorat)):  while oyna and harorat[oyna[-1]] <= harorat[i]:      oyna.pop()  oyna.append(i)  if oyna[0] <= i - k:      oyna.popleft()  if i >= k - 1:      javob.append(harorat[oyna[0]])print(javob)

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
from collections import dequeharorat = [1, 3, -1, -3, 5, 3]k = 3oyna = deque()javob = []for i in range(len(harorat)):  while oyna and harorat[oyna[-1]] <= harorat[i]:      oyna.pop()  oyna.append(i)  if oyna[0] <= i - k:      oyna.popleft()  if i >= k - 1:      javob.append(harorat[oyna[0]])print(javob)
Javobni ko'rish
[3, 3, 5, 5]

Javob avvalgisi bilan bir xil. Dequeda qiymatlar emas, INDEKSLAR saqlanadi — chunki elementning oynadan chiqib ketganini faqat indeks orqali bilish mumkin.

Keyingi darajadagi BFS (19-dars) grafni qatlam-qatlam kezadi va uning yuragida aynan navbat turadi: ko’rilgan uchlar oxiriga qo’shiladi, ishlanadigan uch boshidan olinadi.

Shuning uchun bu darsdagi bitta odat — navbat uchun deque ishlatish — uchinchi darajada butun bir mavzuni saqlab qoladi.

Vizualda deque boshidagi katak har doim joriy oynaning maksimumi bo’lib turadi. Orqadan nima chiqib ketayotganiga e’tibor bering.

Deque — sirpanuvchi oynadagi maksimum

Deque boshidagi katak har doim joriy oynaning maksimumi bo'lib turadi.

Deque ichida indekslar kamayuvchi harorat tartibida saqlanadi; boshidagi element — oyna maksimumi.

Algoritmning har qadami quyidagi ro‘yxatda matn sifatida ham berilgan — vizual faqat shu qadamlarni chizadi, yangi ma’lumot qo‘shmaydi.

  1. Oyna kengligi 3. Har oyna uchun maksimumni topamiz — jami 4 ta javob.
  2. 1 dequega qo'shildi. Oyna hali to'lmadi.
  3. 1 orqadan chiqarildi: 3 undan katta va uzoqroq turadi. 1 boshqa hech qachon maksimum bo'la olmaydi.
  4. 3 dequega qo'shildi. Oyna hali to'lmadi.
  5. Oyna to'ldi. Deque boshidagi 3 — shu oynaning maksimumi.
  6. Oyna to'ldi. Deque boshidagi 3 — shu oynaning maksimumi.
  7. -3 orqadan chiqarildi: 5 undan katta va uzoqroq turadi. -3 boshqa hech qachon maksimum bo'la olmaydi.
  8. -1 orqadan chiqarildi: 5 undan katta va uzoqroq turadi. -1 boshqa hech qachon maksimum bo'la olmaydi.
  9. 3 orqadan chiqarildi: 5 undan katta va uzoqroq turadi. 3 boshqa hech qachon maksimum bo'la olmaydi.
  10. Oyna to'ldi. Deque boshidagi 5 — shu oynaning maksimumi.
  11. Oyna to'ldi. Deque boshidagi 5 — shu oynaning maksimumi.
  12. Tayyor. Har indeks dequega bir marta kirdi va bir marta chiqdi: 10 amal. Har oyna uchun max() chaqirilganda esa n * k bo'lardi.
harorat
1031-12-335435
deque
javob

Oyna kengligi 3. Har oyna uchun maksimumni topamiz — jami 4 ta javob.

Amal0

1/12

Tuzoq — xatoni toping

12 / 40

MasalaSirpanuvchi oynadagi maksimumni O(n) da toping.

Taklif qilingan yechim

Bu javobning 1-qismi noto'g'ri. Qiymat saqlansa, uchinchi qadamni bajarib bo'lmaydi: elementning oynadan chiqib ketganini bilish uchun uning O'RNI kerak, qiymati esa buni aytmaydi. Bir xil qiymat ikki joyda uchrasa, qaysi biri chiqib ketganini ham ajratib bo'lmaydi. To'g'risi: dequeda indekslar saqlanadi.

Javobning qaysi qismi noto'g'ri? Bosib belgilang.

1Stek va navbat orasidagi farq nima?

Javobni ko'rish

Stekda oxirgi kelgan birinchi ketadi, navbatda birinchi kelgan birinchi ketadi. Ikkalasi ham bir uchidan qo’shadi, farqi olish tomonida.

2list.pop(0) nega sekin?

Javobni ko'rish

Ro’yxat xotirada ketma-ket saqlanadi. Boshidagi element olinsa, qolganlarning hammasi bittaga suriladi — ya’ni har chaqiruv O(n).

3Nega dequeda qiymatlar emas, indekslar saqlanadi?

Javobni ko'rish

Elementning oynadan chiqib ketganini faqat o’rni orqali bilish mumkin. Qiymat bu haqda hech narsa aytmaydi, ayniqsa takrorlar bo’lsa.

4Deque ichidagi haroratlar qanday tartibda turadi?

Javobni ko'rish

Kamayuvchi tartibda. Shu sababli boshidagi element har doim joriy oynaning maksimumi bo’ladi va uni qidirish kerak emas.

5Bu dars keyingi darajaning qaysi mavzusiga tayyorgarlik?

Javobni ko'rish

BFS ga (19-dars). U grafni qatlam-qatlam kezadi va navbatsiz ishlamaydi; pop(0) bilan yozilgan BFS esa katta grafda vaqt chegarasidan o’tmaydi.

Masalalar

3 ta

  • Sliding Window MedianCSES 1076qiyin

    Deque yetmaydi — ikkita tartiblangan yarim kerak. Avval maksimum variantini yozing.

  • Josephus Problem ICSES 2162oson

    Navbat bilan to‘g‘ridan-to‘g‘ri modellashtiring: boshidan oling, biri chiqadi, biri oxiriga qaytadi.

  • QueueCodeforces 353Dqiyin

    Avval qadamma-qadam modellashtiring, keyin nechta qadam kerakligini formula bilan chiqaring.

Lokal mashq: mashqlar/12-oyna-maksimum/ — masala matni, testlar va tekshir.py. Avval sekin.py ni o‘zingiz yozing, keyin tayyorini oching.

Topshiriq — darajangizni tanlang

Asos · 5–7-sinf — Vizual va aniq ko'rsatmali

4 2 7 1 5 3 va k = 3 uchun har oyna maksimumini qog’ozda toping. Keyin deque qanday o’zgarishini qadamma-qadam yozib chiqing: har qadamda ichida nima turibdi?

Mustahkam · 8–9-sinf — Matnli masala, o'zingiz tuzasiz

12-oyna-maksimum masalasini yeching. k = 1 va k = n chegara holatlarida ham to’g’ri ishlashini tekshiring.

Chuqur · 10–11-sinf — Algoritmik, chegara holatlari bilan

list.pop(0) va deque.popleft() ni o’lchang: 200 ming elementli navbatni ikki usulda bo’shating va vaqtni yozing. Farq necha barobar chiqdi va bu jadvaldagi bashorat bilan mos keldimi?

Darsni belgilash uchun JavaScript kerak. Bu progressni saqlash uchun ishlatiladi — darslikning o'zi JavaScript'siz ham to'liq o'qiladi.