Qanday qilib men kompyuter olimpiadasida 3 ta oltin medaldan 4 tasini qo'lga kiritdim

Qanday qilib men kompyuter olimpiadasida 3 ta oltin medaldan 4 tasini qo'lga kiritdim

Men Google HashCode World Championship Finals 2017 musobaqasiga tayyorgarlik ko‘rayotgan edim. Bu Google tomonidan tashkil etilgan algoritmik masalalar bo‘yicha eng yirik musobaqadir.

Men C++ tilini XNUMX-sinfdan boshlab o‘rganishni boshladim. Men dasturlash, algoritmlar yoki ma'lumotlar tuzilmalari haqida hech narsa bilmasdim. Bir nuqtada men birinchi kod satrini yozdim. Etti oy o'tgach, dasturlash musobaqasi ufqda paydo bo'ldi. Men dasturlashni o'rganish uslubim qanchalik yaxshi ishlaganini ko'rmoqchi edim. Bu ajoyib imkoniyat edi.

Ikki kunlik musobaqadan so'ng natijalar keldi: men oltin medalni qo'lga kiritdim.

Men hayratda qoldim. 5 yillik tajribaga ega bo'lgan raqobatchilardan oldinda edim. Men qattiq mehnat qilganimni bilardim, lekin bu yutuq barcha kutganlarimdan oshib ketdi. Men sport dasturlari mening mavzuim ekanligini tushunib etdim va uni boshdan kechirdim.

Meni muvaffaqiyatga nima yetaklaganini bilaman va buni siz bilan baham ko'rmoqchiman.

Qanday qilib men kompyuter olimpiadasida 3 ta oltin medaldan 4 tasini qo'lga kiritdim

Maqola EDISON Software ko'magida tarjima qilingan dasturchilarning sog'lig'i va ularning nonushtasi haqida g'amxo'rlik qiladi, shuningdek maxsus dasturiy ta'minotni ishlab chiqadi.

Qaysi dasturlash tilini tanlash kerak

  • C++ - Tavsiya qilaman! U juda tez. Algoritmlarni amalga oshirish STL tufayli kam vaqt talab etadi. C++ barcha tanlovlarda qabul qilinadi. Men birinchi kod qatorimni C++ da yozdim.
  • C - STL tufayli C++ tilini o'rganing. Agar siz C tilini bilsangiz, C++ tilida ham dasturlashingiz mumkin.
  • Java - bu sekin dasturlash tili. Unda Big Integer klassi bor, lekin bu sizga unchalik yordam bermaydi. Agar musobaqada vaqt chegarasi bo'lsa, Java bilan siz albatta undan oshib ketasiz. Java barcha musobaqalarda qabul qilinmaydi.

Qayerda mashq qilish mumkin

Men Tavsiya qilaman Sphere Online Judge (SPOJ). Bu miqdor va sifat jihatidan samarali resursdir. Muammolarni hal qilish jarayonida qolib ketsangiz, muharrirlar va echimlar onlayn mavjud. Ushbu saytga qo'shimcha ravishda men tavsiya qilaman SPOJ asboblar to'plami и SPOJ.pl uchun muammo tasniflagichi.

Birinchidan, siz asosiy bilimlarni mustahkamlashingiz kerak

Tilning sintaksisiga o‘rganib qolganingizdan so‘ng, yengish kerak bo‘lgan muammolar mavjud. Amaliyotni talab qiladigan oddiy muammolardan boshlang. Ushbu bosqichda asosiy narsa dasturlash uslubingizni aniqlashdir. Ehtimol, siz juda ko'p bo'sh joy bilan kod yozishni yoqtirarsiz, balki yo'q. Ehtimol, siz qavslarni "agar" bilan bir qatorga qo'yishingiz mumkin yoki ularni alohida qatorlarga qo'yishingiz mumkin.

Siz o'zingizning dasturlash uslubingizni topishingiz kerak, chunki bu sizning uslubingiz.

Uni qidirayotganda ikkita asosiy tamoyilni eslang:

  • Sizning kodingizni amalga oshirish oson bo'lishi kerak. O'zingiz o'ylab topgan yechimni amalga oshirishda o'zingizni qulay his qilishingiz kerak. Nega? Chunki musobaqa paytida siz xohlagan oxirgi narsa kodingizda yo'qolib qolishdir. Kodni amalga oshirishni qanday soddalashtirish haqida o'ylashga 5 daqiqa vaqt sarflagandan ko'ra, har doim qo'shimcha 10 daqiqa sarflash yaxshiroqdir.
  • Sizning kodingiz o'qish oson bo'lishi kerak. Kodni o'qish oson bo'lsa, disk raskadrovka qilish oson. To‘g‘risini aytaylik, xatolar har doim sodir bo‘ladi. 10 daqiqa qolganda va la'nati xatoni topa olmayotganingizda bu tuyg'uni bilasizmi? Albatta qilasiz. Bunday vaziyatdan qochish uchun aniq kodni yozing. Uni tuzatishni boshlaganingizdan so'ng, kod tabiiy va tushunarli bo'lib ko'rinadi.

Mana mening misolim dasturlash uslubi.

Rivojlanish ko'nikmalaringizni qanday yaxshilash mumkin

Amaliyot, amaliyot va ko'proq amaliyot. Men sizga birinchi 250 ta eng ko'p echilishi mumkin bo'lgan muammolarni hal qilishni maslahat beraman SPOJ. Ularni tartibda hal qiling. Ularning har birining yechimi haqida kamida bir soat o'ylang.

“Bu muammo men uchun juda qiyin, keyingisini hal qilishga harakat qilaman”, demang. Yo'qotilganlar shunday deb o'ylashadi.

Bir varaq qog'oz va qalam oling. O'ylab ko'r. Ehtimol, siz yechim topishingiz mumkin, balki yo'q. Hech bo'lmaganda, siz algoritmik fikrlashni rivojlantirasiz. Agar bir soat ichida yechim topa olmasangiz, forumda yoki maqolalardan tayyor yechim qidiring.

Ushbu yondashuv bilan nimaga erishasiz? Kod yordamida g'oyalaringizni tezda amalga oshirishni o'rganing. Va klassik muammolar va algoritmlarni o'rganing.

Ikkinchidan, siz algoritmlar va ma'lumotlar tuzilmalarini o'zlashtirishingiz kerak

Ierarxik yondashuvga rioya qiling. Siz qanday yurishni bilmasdan yugurishni boshladingizmi? Yo'q. Osmono'par binoni mustahkam poydevorsiz qura olasizmi? Yana emas.

Siz o'rganish yo'lidagi qadamlarni e'tiborsiz qoldirolmaysiz. Agar siz ularga e'tibor bermasangiz, sizda bilim bo'shliqlari qoladi. Vaqt o'tishi bilan ular faqat yomonlashadi.

Asosiy algoritmlar va ma'lumotlar tuzilmalaridan boshlang

Boshlash qiyin. Balki siz avval nimani o'rganishni bilmasligingiz uchundir. Shunung uchun Men "Algoritmlar va ma'lumotlar tuzilmalari" video kursini yaratdim.. Ushbu kursni yaratishda men uni qanday o'qitishni xohlayotganimga asosladim. Reaktsiya aql bovar qilmas edi! Birinchi oyda 3000 dan ortiq mamlakatlardan 100 dan ortiq talaba kursga yozildi.

Agar siz oson muammolarni hal qilish ustida ishlasangiz, hech qachon yaxshilanmaysiz.

Siz bilmagan narsalarni tushunishning eng samarali usuli - uni amalda boshdan kechirishdir. Men shunday o'rgandim. Qiyin vazifani tanlash orqali men ilgari hech qachon eshitmagan ko'plab yangi texnikalarni o'rgandim.

Siz ishlayotgan har uchinchi muammo sizga yangi narsalarni o'rgatishi kerak. Muammolarni tanlashda ehtiyot bo'ling. Qiyinroq muammolarni tanlang!

SPOJ-dan ushbu 250 ta muammoni tugatganingizdan so'ng, siz sport dasturlashning asosiy mavzulari haqida asosiy tushunchaga ega bo'lasiz. Asosiy algoritmlar ortidagi mantiqni chuqur anglagan holda, yuqori darajadagi algoritmlar unchalik murakkab ko'rinmaydi. Shunday qilib, siz o'zingizning bilimingizdan maksimal darajada foydalanishingiz mumkin.

Asosiy mavzularning har birini chuqurroq o'rganing

Mana qimmatli manba juda ko'p ma'lumotlarga ega. U erda siz har bir mavzu uchun eng yaxshi 10 ta algoritm va ma'lumotlar tuzilmalarini topasiz. SPOJ-dan 250 ta muammodan so'ng, siz ushbu ro'yxatdan ko'p narsalarni bilib olasiz. Ammo siz ilgari hech qachon eshitmagan ko'p narsalarga qoqilib qolasiz. Shunday qilib, ushbu mavzularni o'sish tartibida o'rganishni boshlang.

Yangi narsalarni o‘rganib, bilimingizni mustahkamlamasangiz, hamma narsani tezda unutasiz.
Men yangi algoritmni o'rganganingizdan so'ng, uni amalda qo'llashni tavsiya qilaman. 2-3 ta vazifani bajaring. SPOJ da algoritm tegini qidiring. U erda siz ushbu algoritmni hal qilish uchun kerak bo'lgan muammolarni topasiz. Avval ushbu muammolarni hal qiling.

Dinamik dasturlashni o'rganing, chunki u sizni g'alabaga olib boradi
Mening tajribamga ko'ra, har bir musobaqada kamida bitta muammo bor dinamik dasturlash. Ko'pchilik "dinamik dasturlash" iborasini eshitganida boshi og'riydi, chunki ular buni umuman tushunmaydilar.

Va u yaxshi. Chunki dinamik dasturlashni tushunsangiz, u holda g'alaba qozonasiz.

Menga dinamik dasturlash yoqadi, bu mening sevimli mavzuim. Dinamik dasturlashning siri faqat mahalliy emas, balki global miqyosda maqbul tanlovlarni amalga oshirishdir. Muammoni oddiyroq kichik muammolarga bo'lishingiz kerak. Ushbu kichik masalalarning har birini faqat bir marta hal qiling. Keyin hal qilingan kichik muammolarni birlashtirgan yechim yarating. Ochko'z algoritm - dinamik dasturlashning aksi. Bu har bir bosqichda mahalliy optimal tanlovlarni amalga oshirishni talab qiladi. Va mahalliy optimal tanlov yomon global yechimga olib kelishi mumkin.

Yangi tushunchalarni o'rganayotganda, tekshiring TopCoder darsliklar. Ular juda batafsil va tushunarli. Ular tufayli men tushuna oldim ikkilik indeksli daraxtlar.

Qattiq mehnat qiling

Ko'p yillik mashg'ulotlarsiz Olimpiadada g'olib chiqqan sportchilar haqida eshitganmisiz? Men emas.

Har yili kompyuter olimpiadasiga tayyorgarlik sentabr oyida boshlanib, aprel oyida tugaydi.

Ushbu 8 oy davomida har kuni 5 soat mashq qildim.

Ha, men bu 5 soatni faqat algoritmik masalalarni yechishga sarfladim. Men 8 va hatto 10 soat mashq qilgan kunlarimni eslayman. Nega? Chunki bu menga yoqdi. Har kuni maktabdan uyga qaytganimda to'g'ri yotoqxonaga bordim, kompyuterga o'tirdim va yangi muammoni tahlil qila boshladim. Yoki men bu muammoni hal qilish uchun bilishim kerak bo'lgan yangi algoritmni o'rganayotgan edim.

Agar g'alaba qozonishni istasangiz, siz ham shunday qilishingiz kerak. Muammoni tanlang va unga yopishib oling. Supermarketga ketayotganda yoki haydash paytida bu haqda o'ylab ko'ring.

Qanday qilib men kompyuter olimpiadasida 3 ta oltin medaldan 4 tasini qo'lga kiritdim

Siz uxlayotganingizda miyangiz o'sha kuni to'plangan ma'lumotlarni defragmentatsiya qilishini bilarmidingiz? U kitob javoniga alifbo tartibida kitob qo‘yib o‘tirgan ko‘rinadi. Asosan, sizning miyangiz siz duch kelayotgan turli muammolar haqida o'ylaydi.

Bu mohirlik bilan ishlatilishi mumkin. Yotishdan oldin qiyin muammoni o'qing va uni hal qilish uchun nima kerakligini eslang. Ushbu bosqichda siz yechimning o'zini izlashingiz shart emas. Uxlagani yotish. Sizning miyangiz bu muammoni qayta ishlashni boshlaydi. Uyg'onganingizda, siz uxlab yotganingizda yechimni topganingizni tushunib hayron qolasiz.

O'zingiz sinab ko'ring. Bu sehrga o'xshaydi.

Men video blog yaratdim

Qanday qilib men kompyuter olimpiadasida 3 ta oltin medaldan 4 tasini qo'lga kiritdim

Ushbu qisqa paragraf sport dasturlari bilan bog'liq emas. Agar siz yigirma yoshda bo'lsangiz va men dunyoni qanday ko'rishimga qiziqsangiz, tekshirib ko'ring Youtube-dagi video blogim. Unda dunyo, hayot va informatika haqida gapiraman.

Aqlli ish

Bu muvaffaqiyat siri. Sizga maqsadlar kerak.

Biz odamlarmiz va bizga yoqadi prokristinovat. Biz har doim hozir qilinishi kerak bo'lgan ishlarni kechiktirishni xohlaymiz. Netflix-ni tomosha qilish har doim dinamik dasturlash muammolarini hal qilishdan ko'ra yoqimliroq. Siz buni bilasiz va uni tuzatishingiz kerak.

Kechiktirishni qanday engish mumkin

O'zingizga maqsadlar qo'ying. Siz har doim yangi narsalarni o'rganishingiz mumkin bo'lgan qiziqarli muammolarni topasiz (yuqorida aytib o'tgan manbalar bilan tanishib chiqing). Ammo bu muammolarni faqat o'qish emas, balki hal qilish kerak.

Shunday qilib, men kechiktirishni qanday yengdim. Men qog'oz kalendarni boshladim va har kuni o'zim hal qilmoqchi bo'lgan muammolar bilan to'ldirdim. Men har doim muammolarni ikki kun oldin to'ldirdim. Shunday qilib, keyingi kunlarda vaqtimni qanday boshqarishni bildim.

Qanday qilib men kompyuter olimpiadasida 3 ta oltin medaldan 4 tasini qo'lga kiritdim

Shunday qilib, men doimo motivatsiya bo'ldim. Men taqvimdagi keyingi kunlarni to'ldirish uchun ba'zi muammolarni hal qilishim va yangilarini topishim kerak edi. Yechilgan muammolarni kesib o'tish ajoyib his qiladi. Bilaman, sizga ham yoqadi.

O'zingizning qog'oz kalendaringizni oling. Telefoningizda ertaga unutib qo'yadigan boshqa ishlar ro'yxatini yaratmang.

Qanday qilib samarali disk raskadrovka qilish kerak

Professional bo'lishni xohlaysizmi? Agar shunday bo'lsa, unda siz "ongingizda disk raskadrovka qilishingiz" kerak.
Bu men bilgan eng samarali disk raskadrovka texnikasi, chunki u umuman tuzatuvchini talab qilmaydi. Sizning miyangiz bir vaqtning o'zida bir nechta kod tarmoqlarini tekshiradi va sizga kod bilan solishtirganda ancha kengroq ma'lumot beradi klassik tuzatuvchi.

Siz o'zingizni shaxmat o'ynaydigan va 3 ta oldinga o'ylaydigan grossmeyster bilan solishtirishingiz mumkin.

Men bu texnikani faqat o'zimning dastlabki himoya chizig'im sifatida ishlataman. Keyin men haqiqiy tuzatuvchidan foydalanaman.

Boshingizda disk raskadrovka qilishni o'rganish uchun siz mashq qilishingiz kerak. Muammoning yechimini tasdiqlaganingizda va "noto'g'ri javob" olganingizda, to'g'ridan-to'g'ri disk raskadrovka tugmasiga o'tmang. Kodni qayta o'qing va o'ylab ko'ring: "Ushbu qatorda nima sodir bo'lmoqda?", "Bu erda "agar" dasturga qanday ta'sir qiladi?", "Biz tsikldan chiqqanimizda, iteratorning qiymati qanday?"

Shu tarzda siz o'zingiz uchun o'ylaysiz. Vaqt o'tishi bilan siz kod yozishni va uni tezda tuzatishni o'rganasiz.

Muallif haqida

Qanday qilib men kompyuter olimpiadasida 3 ta oltin medaldan 4 tasini qo'lga kiritdim
Andrey Margeloiu - tadbirkorlik, startaplar va ochiq havoga qiziqadigan ishtiyoqli dasturchi. Siz u bilan bog'lanishingiz mumkin LinkedIn-da.

Tarjimasi: Diana Sheremyeva

Manba: www.habr.com

a Izoh qo'shish