10-dars: Ikki ko'rsatkich
2-darajaKumush — usullar9–16 darslar
Bu darsdan keyin siz
- ikki ko’rsatkichning ikki shaklini — qarama-qarshi va sirpanuvchi oyna — ajratasiz
- ko’rsatkich qaysi yo’nalishda surilishini shartdan chiqarasiz
- usul qachon ishlamasligini ayta olasiz
Avval qo’lda
“Avval qo’lda” bo'limiga havolaAvval qo‘lda
Qog’ozga o’sish tartibida sakkizta son yozing va ikki chetiga barmoq qo’ying. Maqsad — yig’indisi aniq 20 bo’lgan juftlikni topish.
Har qadamda faqat bitta qoidaga amal qiling: yig’indi 20 dan kichik bo’lsa chap barmoqni o’ngga suring, katta bo’lsa o’ng barmoqni chapga. Nechta qadamda topdingiz?
Nimani sezishingiz kerak
Sakkizta son uchun ko’pi bilan yetti qadam ketdi, har juftni ko’rganda esa 28 ta bo’lardi. Sabab: har qadamda bitta variant emas, butun bir guruh chetlab o’tildi.
Kompyuter yopiq. Bu mashq tugamaguncha kod ochilmaydi.
Nega ishlaydi
“Nega ishlaydi” bo'limiga havolaikki ko'rsatkichtwo pointers
Ikkita indeks bilan ishlash usuli: ular ma’lum tartibda suriladi va
hech qachon orqaga qaytmaydi. Shu sababli jami ish n ga proporsional
bo’ladi.
Chap barmoqni o’ngga surganda siz shunchaki bitta juftlikdan voz kechmaysiz. Siz «chapdagi shu son bilan hech qanday juftlik bo’lmaydi» degan xulosaga kelasiz, chunki eng katta sherik ham yetmadi. Bir qadamda butun bir qator o’chadi.
Sekin yechim
“Sekin yechim” bo'limiga havolaYig’indisi X ga teng juftlik bormi? To’liq izlash har juftni ko’radi.
a = [2, 3, 5, 5, 7, 8]X = 10def qidir(): for i in range(len(a)): for j in range(i + 1, len(a)): if a[i] + a[j] == X: return (a[i], a[j]) return Noneprint(qidir())Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
a = [2, 3, 5, 5, 7, 8]X = 10def qidir(): for i in range(len(a)): for j in range(i + 1, len(a)): if a[i] + a[j] == X: return (a[i], a[j]) return Noneprint(qidir())Haqiqiy natija:
(2, 8)
Yechim to'g'ri, lekin u ro'yxat saralanganini umuman ishlatmaydi. Diqqat: break faqat ICHKI sikldan chiqadi — shu sababli bu yerda return ishlatilgan, aks holda tashqi sikl davom etib javobni qayta yozardi.
Javobni ko'rish
(2, 8)
Yechim to'g'ri, lekin u ro'yxat saralanganini umuman ishlatmaydi. Diqqat: break faqat ICHKI sikldan chiqadi — shu sababli bu yerda return ishlatilgan, aks holda tashqi sikl davom etib javobni qayta yozardi.
Nega sekin
“Nega sekin” bo'limiga havolaHar juftlik ko’riladi: n²/2. Ro’yxat esa saralangan — ya’ni bizda
ishlatilmayotgan qimmatli ma’lumot bor.
Sig‘adimi?
Bir soniyada taxminan 10⁸ oddiy amal bajariladi.
| Yechim | n = 1 000 | n = 5 000 | n = 200 000 |
|---|---|---|---|
Har juftni ko‘rishn^2 | 10⁶sig‘adi | 10⁷sig‘adi | 10¹⁰sig‘maydi |
Ikki ko‘rsatkichn | 1 000sig‘adi | 5 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 havolaIkki chetdan boshlaymiz. Yig’indi kichik bo’lsa kattaroq son kerak — chap siljiydi. Katta bo’lsa kichikroq son kerak — o’ng siljiydi.
a = [2, 3, 5, 5, 7, 8]X = 10chap, ong = 0, len(a) - 1javob = Nonewhile chap < ong: yigindi = a[chap] + a[ong] if yigindi == X: javob = (a[chap], a[ong]) break if yigindi < X: chap += 1 else: ong -= 1print(javob)Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
a = [2, 3, 5, 5, 7, 8]X = 10chap, ong = 0, len(a) - 1javob = Nonewhile chap < ong: yigindi = a[chap] + a[ong] if yigindi == X: javob = (a[chap], a[ong]) break if yigindi < X: chap += 1 else: ong -= 1print(javob)Haqiqiy natija:
(2, 8)
Birinchi urinishdayoq topildi. Har qadamda ko'rsatkichlardan bittasi albatta siljiydi, shuning uchun sikl ko'pi bilan n marta aylanadi.
Javobni ko'rish
(2, 8)
Birinchi urinishdayoq topildi. Har qadamda ko'rsatkichlardan bittasi albatta siljiydi, shuning uchun sikl ko'pi bilan n marta aylanadi.
Ikkinchi shakl: sirpanuvchi oyna
“Ikkinchi shakl: sirpanuvchi oyna” bo'limiga havolaKo’rsatkichlar qarama-qarshi emas, bir yo’nalishda ham yurishi mumkin. Bunda ular oraliq — «oyna» — chegaralarini bildiradi.
a = [2, 1, 5, 1, 3, 2]X = 8chap = 0yigindi = 0eng = 0for ong in range(len(a)): yigindi += a[ong] while yigindi > X: yigindi -= a[chap] chap += 1 if ong - chap + 1 > eng: eng = ong - chap + 1print(eng)Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
a = [2, 1, 5, 1, 3, 2]X = 8chap = 0yigindi = 0eng = 0for ong in range(len(a)): yigindi += a[ong] while yigindi > X: yigindi -= a[chap] chap += 1 if ong - chap + 1 > eng: eng = ong - chap + 1print(eng)Haqiqiy natija:
3
Yig'indisi 8 dan oshmaydigan eng uzun ketma-ket oraliq — uchta element. while ichkarida bo'lsa ham, chap faqat oldinga yuradi: jami ish n ga proporsional.
Javobni ko'rish
3
Yig'indisi 8 dan oshmaydigan eng uzun ketma-ket oraliq — uchta element. while ichkarida bo'lsa ham, chap faqat oldinga yuradi: jami ish n ga proporsional.
Sinab ko’r
“Sinab ko’r” bo'limiga havolaVizualda ikki ko’rsatkich o’rtaga yaqinlashadi. Har qadamda qaysi biri va nega surilganiga e’tibor bering.
Ikki ko'rsatkich — ikki chetdan o'rtaga
Yig'indi maqsaddan kichikmi yoki kattami — shu savol qaysi ko'rsatkich siljishini hal qiladi.
Chap va o'ng ko'rsatkichlar yig'indiga qarab bir-biriga yaqinlashadi va javobni bir yurishda topadi.
Algoritmning har qadami quyidagi ro‘yxatda matn sifatida ham berilgan — vizual faqat shu qadamlarni chizadi, yangi ma’lumot qo‘shmaydi.
- Yig'indisi 22 bo'lgan ikki son kerak. Ro'yxat saralangan — shuning uchun ikki chetdan boshlaymiz.
- 1 + 24 = 25, katta. Kichikroq qilish kerak — O'NG chapga siljiydi.
- 1 + 19 = 20, kichik. Kattaroq qilish kerak — CHAP o'ngga siljiydi.
- 4 + 19 = 23, katta. Kichikroq qilish kerak — O'NG chapga siljiydi.
- 4 + 15 = 19, kichik. Kattaroq qilish kerak — CHAP o'ngga siljiydi.
- 6 + 15 = 21, kichik. Kattaroq qilish kerak — CHAP o'ngga siljiydi.
- 8 + 15 = 23, katta. Kichikroq qilish kerak — O'NG chapga siljiydi.
- 8 + 11 = 19, kichik. Kattaroq qilish kerak — CHAP o'ngga siljiydi.
- Har juftni ko'rsak 28 ta taqqoslash bo'lardi. Ikki ko'rsatkich 7 tada tugatdi — chunki har qadamda bitta ko'rsatkich faqat OLDINGA yuradi.
Yig'indisi 22 bo'lgan ikki son kerak. Ro'yxat saralangan — shuning uchun ikki chetdan boshlaymiz.
Qadam0
Xatoni toping
“Xatoni toping” bo'limiga havolaTuzoq — xatoni toping
10 / 40
MasalaSaralangan ro'yxatda yig'indisi X bo'lgan juftlik bormi?
Taklif qilingan yechim
Bu javobning 3-qismi noto'g'ri. Bir vaqtda ikkalasini surish variantlarni ATAYLAB o'tkazib yuboradi. Yig'indi kichik bo'lsa faqat CHAP siljishi kerak: kattaroq son kerak, o'ngdagini kichraytirish esa yig'indini yanada kamaytiradi.
Javobning qaysi qismi noto'g'ri? Bosib belgilang.
Bir vaqtda ikkalasini surish variantlarni ATAYLAB o'tkazib yuboradi. Yig'indi kichik bo'lsa faqat CHAP siljishi kerak: kattaroq son kerak, o'ngdagini kichraytirish esa yig'indini yanada kamaytiradi.
Xato yechimni sekinlashtirmaydi — u shunchaki ba’zi juftliklarni ko’rmay o’tib ketadi. Ko’p testda javob baribir topiladi, shuning uchun xato uzoq vaqt yashirin qoladi. Aynan shunday xatolar uchun stress-test kerak (15-dars).
O’zingizni sinang
“O’zingizni sinang” bo'limiga havola1Ikki ko'rsatkich usuli qanday shartni talab qiladi?
Javobni ko'rish
Tartibni. Saralangan ro’yxatda «bu tomonda kattaroq» degan xulosa chiqarish mumkin — usulning butun mantiqi shunga suyanadi.
2Yig'indi X dan katta bo'lsa qaysi ko'rsatkich siljiydi va nega?
Javobni ko'rish
O’ng — chapga. Bizga kichikroq yig’indi kerak, uni esa faqat kattaroq sonni kichraytirish orqali olish mumkin.
3Sirpanuvchi oynada ichki while bo'lsa ham yechim nega O(n)?
Javobni ko'rish
Chunki chap faqat oldinga yuradi va butun ishlash davomida ko’pi bilan
n qadam qiladi. Ichki sikl umumiy hisobda n martadan ko’p
aylanmaydi.
4Ro'yxat saralanmagan bo'lsa nima qilasiz?
Javobni ko'rish
Yo saralaysiz (n log n), yo boshqa usul olasiz — masalan lug’at
(9-dars). Tanlov shartga bog’liq: element o’rni kerak bo’lsa saralash
indekslarni buzadi.
5«Oyna» shakli qanday masalalarda uchraydi?
Javobni ko'rish
Ketma-ket oraliq haqidagi savollarda: eng uzun oraliq, yig’indisi chegaradan oshmaydigan oraliq, takrorlanmaydigan belgilar oynasi. Belgisi — javob ketma-ket elementlardan iborat bo’lishi.
Masalalar
“Masalalar” bo'limiga havolaMasalalar
3 ta
- Sum of Two ValuesCSES 1640o'rta
Saralashdan oldin indekslarni saqlab qoling — javobda asl o‘rinlar so‘raladi.
- Subarray Sums ICSES 1660o'rta
Barcha sonlar musbat — demak oyna usuli ishlaydi.
- PlaylistCSES 1141o'rta
Oyna ichida takror bo‘lmasin. Takror chiqqanda chap chegarani qayerga surish kerak?
Lokal mashq: mashqlar/10-ikki-korsatkich/ — 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
Qog’ozga o’sish tartibida o’nta son yozing va yig’indisi 25 bo’lgan juftlikni ikki barmoq usuli bilan toping. Har qadamda qaysi barmoq nega surilganini yozib boring.
Mustahkam · 8–9-sinf — Matnli masala, o'zingiz tuzasiz
10-ikki-korsatkich masalasini yeching — u juftliklarni sanaydi,
takrorlangan sonlar bilan. Bir xil sonlar guruhi uchrasa nima
qilish kerakligini alohida o’ylang.
Chuqur · 10–11-sinf — Algoritmik, chegara holatlari bilan
Oyna shaklini murakkabroq shartda yozing: takrorlanmaydigan elementlardan iborat eng uzun ketma-ket oraliqni toping. Ichkarida to’plam yoki lug’at kerak bo’ladi — qaysi biri va nega?
Darsni belgilash uchun JavaScript kerak. Bu progressni saqlash uchun ishlatiladi — darslikning o'zi JavaScript'siz ham to'liq o'qiladi.