Asosiy mazmunga o'tish

15-dars: Chegara holatlari va stress-test

2-darajaKumush — usullar9–16 darslar

Bu darsdan keyin siz

  • har masalada chegara holatlari ro’yxatini yozib chiqasiz
  • ikki yechimni tasodifiy testlarda avtomatik solishtirasiz
  • farq topilgan eng kichik testni ajratib olasiz

Avval qo‘lda

~6 daqiqajuftlikdaSinfdoshning yozilgan yechimi

Sinfdoshingiz bilan yechimlaringizni almashing. Vazifa — bir-biringizni sindirish: shunday kirish o’ylab topingki, uning yechimi noto’g’ri javob bersin.

Kodni o’qishga urinmang. O’rniga chekkalarni sinang: bitta element, bo’sh kirish, hamma sonlar bir xil, hamma sonlar manfiy, eng katta chegara.

Nimani sezishingiz kerak

Sindirgan test deyarli har doim kichik bo’ladi. Bu tasodif emas: xato mantiqda bo’ladi, mantiq esa uchta sonda ham buziladi.

Kompyuter yopiq. Bu mashq tugamaguncha kod ochilmaydi.

Har masalada bir xil joylar qoqiladi. Ro’yxatni yodlash shart emas — uni yechim yozib bo’lgach ochib chiqish kifoya.

Holat Nima buziladi
n = 1 Qo’shnilar bo’yicha yuradigan sikllar bo’sh qoladi
Barcha elementlar bir xil Qat’iy taqqoslash (>) hech qachon rost bo’lmaydi
Barcha sonlar manfiy Nol bilan boshlangan hisoblagichlar noto’g’ri javob beradi
Javob nolga teng «Topilmadi» belgisi bilan chalkashadi
Eng katta chegara Vaqt yoki xotira chegarasidan chiqadi
Kirish saralangan yoki teskari saralangan Eng yomon holat aynan shu yerda

Masala: ketma-ket kunlardan iborat bo’sh bo’lmagan oraliqning eng katta yig’indisi. To’liq izlash barcha oraliqlarni ko’radi.

sekin.py
def sekin(a):  eng = a[0]  for i in range(len(a)):      y = 0      for j in range(i, len(a)):          y += a[j]          if y > eng:              eng = y  return engprint(sekin([-1, 3, -2, 5, 3, -5, 2, 2]))

Tez yechim bitta yurishda ishlaydi: har kunda «oldingi oraliqni davom ettiraymi yoki shu kundan yangisini boshlaymi?» degan qaror qabul qilinadi.

tez.py
def tez(a):  eng = joriy = a[0]  for x in a[1:]:      joriy = max(x, joriy + x)      eng = max(eng, joriy)  return engprint(tez([-1, 3, -2, 5, 3, -5, 2, 2]))

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

Bashorat qiling
def tez(a):  eng = joriy = a[0]  for x in a[1:]:      joriy = max(x, joriy + x)      eng = max(eng, joriy)  return engprint(tez([-1, 3, -2, 5, 3, -5, 2, 2]))
Javobni ko'rish
9

Eng yaxshi oraliq — 3, -2, 5, 3 va u 9 beradi. Ikkala yechim ham shu javobni qaytaradi.

Ko’p manbada bu yechim boshqacha yoziladi: joriy yig’indi manfiy bo’lsa nolga tashlanadi. Farq bitta belgida va u musbat sonli testlarda umuman ko’rinmaydi.

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

Bashorat qiling
def buzuq(a):  eng = joriy = 0  for x in a:      joriy = max(0, joriy + x)      eng = max(eng, joriy)  return engdef togri(a):  eng = joriy = a[0]  for x in a[1:]:      joriy = max(x, joriy + x)      eng = max(eng, joriy)  return engsinov = [-4, -2, -7]print(buzuq(sinov), togri(sinov))
Javobni ko'rish
0 -2

Buzuq variant nol qaytaradi — ya'ni «hech narsa tanlamayman» degan javob. Shart esa bo'sh bo'lmagan oraliqni talab qiladi, demak to'g'ri javob -2.

stress-teststress testing

Tasodifiy kichik testlar yasab, ikki yechimni yonma-yon yurgizish va javoblari farq qilgan birinchi testni ajratib olish.

Loyihada tayyor shablon bor va uni o’zgartirish kerak emas — u faqat mashq papkasining nomini biladi.

terminal
# terminalda:# python mashqlar/stress.py 15-eng-katta-yigindi# python mashqlar/stress.py 15-eng-katta-yigindi 500

Skript uch narsani takrorlaydi: generator.py dan kichik test oladi, sekin.py va tez.py ni yurgizadi, javoblarni solishtiradi. Farq chiqsa — to’xtaydi va testni ekranga chiqaradi.

Sig‘adimi?

Bir soniyada taxminan 10⁸ oddiy amal bajariladi.

Yechimn = 1 000n = 200 000
Barcha oraliqni ko‘rishn^210⁶sig‘adi10¹⁰sig‘maydi
Bir yurishdan1 000sig‘adi200 000sig‘adi

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

Vizualda stress-test ishlayapti. Uchta testda farq yo’q, to’rtinchisida esa chiqadi — va u atigi uchta sondan iborat.

Stress-test — xatoni mashina topadi

Har qadamda bitta tasodifiy test. Javoblar farq qilgan joyda to'xtaymiz.

Tasodifiy kichik testlarda ikki yechim solishtiriladi; farq chiqqan birinchi test ekranga chiqariladi.

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

  1. Generator kichik tasodifiy testlar yasaydi. Har testda ikkala yechim ishga tushadi va javoblar solishtiriladi.
  2. 1-test: ikkala javob ham 6. Farq yo'q, davom etamiz.
  3. 2-test: ikkala javob ham 6. Farq yo'q, davom etamiz.
  4. 3-test: ikkala javob ham 6. Farq yo'q, davom etamiz.
  5. FARQ TOPILDI. Sekin yechim -2 dedi, tez yechim 0. Test atigi uchta sondan iborat — xatoni qo'lda ko'rish mumkin.
  6. Sabab: tez yechim joriy yig'indini nolga tashlaydi, ya'ni «hech narsa tanlamaslik» variantini ham hisobga oladi. Shart esa bo'sh bo'lmagan oraliqni talab qiladi.
tasodifiy test
0123
javoblar
sekintez

Generator kichik tasodifiy testlar yasaydi. Har testda ikkala yechim ishga tushadi va javoblar solishtiriladi.

Test0

1/6

Tuzoq — xatoni toping

15 / 40

MasalaStress-test 500 ta tasodifiy testda farq topmadi. Xulosa?

Taklif qilingan mulohaza

Bu javobning 3-qismi noto'g'ri. Test xatoning BORLIGINI ko'rsatadi, yo'qligini emas. Generator faqat o'zi yasay oladigan testlarni beradi: barcha sonlar manfiy bo'lgan holat chiqmasa, o'sha holatdagi xato ham chiqmaydi. To'g'ri xulosa: «ishonch ortdi, isbot yo'q».

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

1Nega stress-test uchun testlar kichik bo'lishi kerak?

Javobni ko'rish

n = 5 dagi xato n = 100000 dagi xato bilan bir xil, lekin kichik testni o’qib, qo’lda tekshirib bo’ladi. Katta test faqat «xato bor» deydi, «qayerda» demaydi.

2Stress-test uchun nechta programma kerak?

Javobni ko'rish

Uchta: sekin yechim (etalon), tez yechim va generator. Uchtasidan bittasi yo’q bo’lsa usul ishlamaydi.

3Generator yomon yozilgan bo'lsa nima bo'ladi?

Javobni ko'rish

Stress-test hech qanday farq topmaydi va sizga soxta ishonch beradi. Generator masalaning xavfli joylarini qamrab olishi kerak: manfiy sonlar, takrorlar, chegaraviy o’lchamlar.

4«Barcha sonlar manfiy» holati qaysi turdagi xatoni ochadi?

Javobni ko'rish

Nol bilan boshlangan hisoblagichlarni. eng = 0 yoki joriy = 0 yozilgan har qanday yechim shu testda jimgina noto’g’ri javob beradi.

5500 ta testdan o'tgan yechim to'g'rimi?

Javobni ko'rish

Noma’lum. Ishonch ortdi, lekin isbot yo’q. Testlar xatoning borligini ko’rsatadi, yo’qligini esa faqat mulohaza ko’rsatishi mumkin — 16-darsning mavzusi.

Masalalar

3 ta

  • Maximum Subarray SumCSES 1643oson

    Darsdagi masalaning o‘zi. Barcha sonlar manfiy bo‘lgan testni albatta sinang.

  • Missing NumberCSES 1083oson

    Chegara holatlari: yo‘qolgan son birinchi yoki oxirgi bo‘lsa ham ishlaydimi?

  • Increasing ArrayCSES 1094oson

    Javob 10^9 · 2·10^5 gacha chiqishi mumkin. Bu son qayerga sig‘adi?

Lokal mashq: mashqlar/15-eng-katta-yigindi/ — 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

Chegara holatlari jadvalini daftaringizga ko’chiring. Keyin oldingi uch darsda yozgan yechimlaringizdan bittasini oling va jadvalning har qatorini unda sinab chiqing. Nechtasida qoqildingiz?

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

15-eng-katta-yigindi mashqini oching va tez.py ni ATAYLAB buzing — joriy ni nolga tashlaydigan variantga o’zgartiring. Keyin python mashqlar/stress.py 15-eng-katta-yigindi ni ishga tushiring. Nechanchi urinishda farq topildi?

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

Sinfdoshingiz bilan sindirish musobaqasi o’tkazing. Har biringiz bitta masalani yeching, keyin yechimlarni almashing va bir-biringiz uchun generator yozing. Sindirgan test topilsa — uni saqlab qo’ying: bunday testlar to’plami eng qimmatli o’quv materiali.

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