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
“Avval qo’lda” bo'limiga havolaAvval qo‘lda
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.
Navbat va deque
“Navbat va deque” bo'limiga havolanavbatqueue
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.
from collections import dequenavbat = deque([1, 2, 3])navbat.append(4)print(navbat.popleft(), navbat.popleft())print(list(navbat))Haqiqiy natija:
1 2 [3, 4]
append oxiriga qo'shadi, popleft boshidan oladi. Ikkalasi ham ro'yxatni surmaydi — deque ichkarida bo'laklarga bo'lingan holda saqlanadi.
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.
Sekin yechim
“Sekin yechim” bo'limiga havolaMasala: har k soatlik oraliq uchun eng yuqori haroratni toping. Birinchi
fikr — har oyna uchun max() chaqirish.
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.
harorat = [1, 3, -1, -3, 5, 3]k = 3javob = [max(harorat[i:i + k]) for i in range(len(harorat) - k + 1)]print(javob)Haqiqiy natija:
[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.
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.
Nega sekin
“Nega sekin” bo'limiga havolamax() har safar butun oynani ko’radi: n × k amal. k katta bo’lganda
bu deyarli n² ga aylanadi.
Sig‘adimi?
Bir soniyada taxminan 10⁸ oddiy amal bajariladi.
| Yechim | n = 1 000 | n = 200 000 |
|---|---|---|
Har oyna uchun max()n^2 | 10⁶sig‘adi | 10¹⁰sig‘maydi |
Deque bilann | 1 000sig‘adi | 200 000sig‘adi |
Yashil — yechim o‘tadi. Sariq — chegarada, konstanta va til muhim bo‘lib qoladi. Qizil — bu yechim bilan bormaydi, boshqasini qidiring.
Tez yechim
“Tez yechim” bo'limiga havolaDeque 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.
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.
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)Haqiqiy natija:
[3, 3, 5, 5]
Javob avvalgisi bilan bir xil. Dequeda qiymatlar emas, INDEKSLAR saqlanadi — chunki elementning oynadan chiqib ketganini faqat indeks orqali bilish mumkin.
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.
Nega bu BFS uchun kerak
“Nega bu BFS uchun kerak” bo'limiga havolaKeyingi 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.
Sinab ko’r
“Sinab ko’r” bo'limiga havolaVizualda 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.
- Oyna kengligi 3. Har oyna uchun maksimumni topamiz — jami 4 ta javob.
- 1 dequega qo'shildi. Oyna hali to'lmadi.
- 1 orqadan chiqarildi: 3 undan katta va uzoqroq turadi. 1 boshqa hech qachon maksimum bo'la olmaydi.
- 3 dequega qo'shildi. Oyna hali to'lmadi.
- Oyna to'ldi. Deque boshidagi 3 — shu oynaning maksimumi.
- Oyna to'ldi. Deque boshidagi 3 — shu oynaning maksimumi.
- -3 orqadan chiqarildi: 5 undan katta va uzoqroq turadi. -3 boshqa hech qachon maksimum bo'la olmaydi.
- -1 orqadan chiqarildi: 5 undan katta va uzoqroq turadi. -1 boshqa hech qachon maksimum bo'la olmaydi.
- 3 orqadan chiqarildi: 5 undan katta va uzoqroq turadi. 3 boshqa hech qachon maksimum bo'la olmaydi.
- Oyna to'ldi. Deque boshidagi 5 — shu oynaning maksimumi.
- Oyna to'ldi. Deque boshidagi 5 — shu oynaning maksimumi.
- Tayyor. Har indeks dequega bir marta kirdi va bir marta chiqdi: 10 amal. Har oyna uchun max() chaqirilganda esa n * k bo'lardi.
Oyna kengligi 3. Har oyna uchun maksimumni topamiz — jami 4 ta javob.
Amal0
Xatoni toping
“Xatoni toping” bo'limiga havolaTuzoq — 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.
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.
Qolgan uch qadam so’zma-so’z to’g’ri va yechim ko’p testda ishlaydi ham — chunki takrorlanmaydigan sonlarda farq bilinmaydi. Xato faqat takrorli testda chiqadi.
O’zingizni sinang
“O’zingizni sinang” bo'limiga havola1Stek 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
“Masalalar” bo'limiga havolaMasalalar
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
“Topshiriq” bo'limiga havolaTopshiriq — 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.