Kako sam osvojio 3 od 4 zlatne medalje na Računalnoj olimpijadi

Kako sam osvojio 3 od 4 zlatne medalje na Računalnoj olimpijadi

Pripremao sam se za Google HashCode World Championship Finals 2017. Ovo je najveće natjecanje s algoritamskim problemima koje organizira Google.

Počeo sam učiti C++ od nule u devetom razredu. Nisam znao ništa o programiranju, algoritmima ili strukturama podataka. U nekom sam trenutku napisao svoju prvu liniju koda. Sedam mjeseci kasnije na horizontu se nazire programersko natjecanje. Želio sam vidjeti koliko dobro funkcionira moj stil učenja programiranja. Bila je to savršena prilika.

Nakon dva dana natjecanja stigli su rezultati: osvojio sam zlatnu medalju.

Bio sam šokiran. Bio sam ispred konkurenata s 5 godina iskustva. Znao sam da sam naporno radio, ali ovo postignuće je nadmašilo sva moja očekivanja. Shvatio sam da je sportsko programiranje moja tema i bezglavo zaronio u njega.

Znam što me dovelo do uspjeha i želim to podijeliti s vama.

Kako sam osvojio 3 od 4 zlatne medalje na Računalnoj olimpijadi

Članak je preveden uz potporu EDISON Softwarea, koji brine o zdravlju programera i njihovom doručkuI razvija prilagođeni softver.

Koji programski jezik odabrati

  • C++ - Topla preporuka! Vrlo je brz. Implementacija algoritama oduzima malo vremena zbog STL-a. C++ je prihvaćen u svim natjecanjima. Napisao sam svoj prvi red koda u C++.
  • C - Naučite C++ zbog STL-a. Ako znate C, možete programirati i u C++.
  • Java je spor programski jezik. Ima klasu Big Integer, ali vam neće puno pomoći. Ako natjecanje ima vremensko ograničenje, s Javom ćete ga sigurno premašiti. Java nije prihvaćena na svim natjecanjima.

Gdje možete vježbati

Preporučujem Sudac Sphere Online (SPOJ). To je učinkovit resurs u smislu količine i kvalitete. Urednici i rješenja dostupni su online ako zapnete u procesu rješavanja problema. Osim ove stranice preporučujem SPOJ Toolkit и klasifikator problema za SPOJ.pl.

Prvo, morate usavršiti svoje znanje o osnovama

Nakon što se naviknete na sintaksu jezika, morate prevladati neke probleme. Počnite s jednostavnim problemima koji zahtijevaju praksu. U ovoj fazi, glavna stvar je odrediti svoj stil programiranja. Možda volite pisati kod s puno razmaka, možda ne volite. Možda stavljate zagrade u isti redak kao i "if" ili ih možda stavljate u zasebne retke.

Morate pronaći svoj stil programiranja jer je to VAŠ stil.

Kada ga tražite, zapamtite dva osnovna principa:

  • Vaš kod bi trebao biti jednostavan za implementaciju. Trebali biste se osjećati ugodno implementirajući rješenje koje ste smislili. Zašto? Jer tijekom natjecanja posljednja stvar koju želite je izgubiti se u svom kodu. Uvijek je bolje potrošiti dodatnih 5 minuta razmišljajući o tome kako pojednostaviti implementaciju koda nego potrošiti 10 minuta pokušavajući to shvatiti.
  • Vaš kod bi trebao biti jednostavan za čitanje. Kada je kod lako čitljiv, lako je otklanjati pogreške. Suočimo se s tim — pogreške se događaju stalno. Znate onaj osjećaj kada imate još 10 minuta i ne možete pronaći prokletu grešku? Naravno da jesi. Da biste izbjegli ovu situaciju, napišite čitljiv kod. Kada počnete otklanjati pogreške, kôd će se činiti prirodnim i lako razumljivim.

Evo i mog primjera stil programiranja.

Kako poboljšati svoje razvojne vještine

Vježbajte, vježbe i još više vježbe. Preporučujem da prođete kroz prvih 250 najrješivijih problema SPOJ. Riješite ih redom. Provedite barem sat vremena razmišljajući o rješenju svakog od njih.

Nemojte reći: "Ovaj problem je pretežak za mene, pokušat ću riješiti sljedeći." Ovako razmišljaju gubitnici.

Uzmite komad papira i olovku. Razmisli o tome. Možda možete pronaći rješenje, možda ne. Minimalno ćete razviti algoritamsko razmišljanje. Ako ne možete doći do rješenja unutar sat vremena, potražite gotovo rješenje na forumu ili u člancima.

Što ćete postići ovim pristupom? Naučite brzo implementirati svoje ideje pomoću koda. I proučavati klasične probleme i algoritme.

Drugo, morate svladati algoritme i strukture podataka

Slijedite hijerarhijski pristup. Jeste li počeli trčati, a niste znali hodati? Ne. Možete li izgraditi neboder bez čvrstih temelja? Ne opet.

Ne možete zanemariti korake na putu učenja. Ako ih zanemarite, ostat ćete s prazninama u znanju. S vremenom će biti samo gori.

Počnite s temeljnim algoritmima i strukturama podataka

Teško je započeti. Možda zato što ne znate što biste prvo učili. Zato Napravio sam video tečaj "Algoritmi i strukture podataka". Kada sam kreirao ovaj tečaj, temeljio sam se na tome kako bih želio da me podučavaju. Reakcija je bila nevjerojatna! Više od 3000 studenata iz više od 100 zemalja prijavilo se za tečaj u prvom mjesecu.

Ako radite na rješavanju lakih problema, nikada se nećete poboljšati.

Najučinkovitiji način da shvatite ono što ne znate je da to iskusite u praksi. Tako sam naučio. Naučio sam mnoge nove tehnike za koje nikad prije nisam čuo odabirom izazovnog zadatka.

Svaki treći problem na kojem radite trebao bi vas naučiti nečemu novom. Budite pažljiviji u odabiru svojih problema. Birajte teže probleme!

Nakon što riješite ovih 250 problema iz SPOJ-a, imat ćete osnovno razumijevanje temeljnih tema sportskog programiranja. Uz duboko razumijevanje logike iza osnovnih algoritama, algoritmi visoke razine će se činiti manje složenima. Na taj način možete maksimalno iskoristiti svoje znanje.

Istražite dublje svaku od glavnih tema

Ovo je vrijedan izvor s puno informacija. Tamo ćete pronaći 10 najboljih algoritama i struktura podataka za svaku temu. Nakon 250 problema iz SPOJ-a, s ovog popisa ćete puno znati. Ali također ćete naići na mnoge stvari za koje nikada prije niste čuli. Stoga počnite proučavati ove teme uzlaznim redoslijedom.

Ako ne ojačaš svoje znanje nakon što naučiš nešto novo, brzo ćeš sve zaboraviti.
Preporučujem da nakon što naučite novi algoritam, koristite ga u praksi. Odradite 2-3 zadatka. Potražite oznaku algoritma u SPOJ-u. Tamo ćete pronaći probleme za čije rješavanje je potreban ovaj algoritam. Najprije se pozabavite ovim problemima.

Savladajte dinamičko programiranje jer će vas ono odvesti do pobjede
Iz mog iskustva, svako natjecanje ima barem jedan problem dinamičko programiranje. Mnoge ljude zaboli glava kad čuju izraz "dinamičko programiranje" jer ga uopće ne razumiju.

I ovo je dobro. Jer ako razumijete dinamičko programiranje, onda ćete pobijediti.

Volim dinamičko programiranje, to mi je omiljena tema. Tajna dinamičkog programiranja je donošenje globalno optimalnih izbora, a ne samo lokalnih. Problem morate rastaviti na jednostavnije podprobleme. Svaki od ovih podproblema riješite samo jednom. Zatim izradite rješenje koje objedinjuje riješene podprobleme. Pohlepni algoritam - suprotno od dinamičkog programiranja. Zahtijeva donošenje lokalno optimalnih izbora u svakom koraku. A lokalno optimalan izbor može dovesti do lošeg globalnog rješenja.

Dok učite nove koncepte, provjerite TopCoder tutoriali. Vrlo su detaljni i razumljivi. Zahvaljujući njima uspio sam razumjeti binarno indeksirana stabla.

Naporno raditi

Jeste li ikada čuli za sportaše koji su osvojili Olimpijske igre bez godina vježbanja? Ja ne.

Svake godine pripreme za Računalnu olimpijadu započinjale su u rujnu, a završavale u travnju.

Svaki dan ovih 8 mjeseci vježbao sam 5 sati.

I da, ovih 5 sati sam proveo samo rješavajući algoritamske probleme. Sjećam se dana kada sam vježbao po 8, pa i 10 sati. Zašto? Jer mi se svidjelo. Svaki dan kad bih se vratio kući iz škole, otišao bih ravno u spavaću sobu, sjeo za računalo i počeo analizirati novi problem. Ili sam učio novi algoritam koji sam trebao znati da bih riješio ovaj problem.

Ako želite pobijediti, morate učiniti isto. Odaberite problem i držite ga se. Razmislite o tome dok hodate do supermarketa ili dok vozite.

Kako sam osvojio 3 od 4 zlatne medalje na Računalnoj olimpijadi

Jeste li znali da dok spavate, vaš mozak defragmentira informacije prikupljene tog dana? Čini se kao da slaže knjige abecednim redom na policu. U biti, vaš mozak razmišlja o raznim problemima s kojima se suočavate.

Ovo se može vješto iskoristiti. Prije spavanja pročitajte težak zadatak i sjetite se što je potrebno za njegovo rješavanje. U ovoj fazi ne trebate tražiti samo rješenje. Idi u krevet. Vaš će mozak početi obrađivati ​​ovaj problem. Kad se probudite, iznenadit ćete se kada shvatite da ste rješenje pronašli dok ste spavali.

Pokušajte sami. To je kao magija.

Napravio sam video blog

Kako sam osvojio 3 od 4 zlatne medalje na Računalnoj olimpijadi

Ovaj kratki odlomak nije povezan sa sportskim programima. Ako ste u dvadesetima i pitate se kako ja vidim svijet, možda biste željeli provjeriti moj video blog na Youtubeu. Govorim o svijetu, životu i informatici u njemu.

Radi pametno

Ovo je tajna uspjeha. Trebate ciljeve.

Ljudi smo i sviđa nam se prokrastinirovatʹ. Uvijek želimo odgoditi ono što treba učiniti upravo sada. Gledanje Netflixa uvijek je ugodnije nego suočavanje s problemima dinamičkog programiranja. Znate to i morate to popraviti.

Kako pobijediti odugovlačenje

Postavite si ciljeve. Uvijek ćete pronaći zanimljive probleme iz kojih možete naučiti nešto novo (pogledajte izvore koje sam gore spomenuo). Ali te probleme treba rješavati, a ne samo čitati.

Pa evo kako sam prevladao odugovlačenje. Počeo sam raditi papirnati kalendar i svaki dan ispunjavao problemima koje sam želio riješiti. Uvijek sam ispunjavao zadatke dva dana unaprijed. Tako sam znao raspolagati svojim vremenom sljedećih dana.

Kako sam osvojio 3 od 4 zlatne medalje na Računalnoj olimpijadi

Tako da sam uvijek bio motiviran. Trebao sam riješiti neke probleme i pronaći nove da ispunim sljedeće dane na kalendaru. Precrtavanje riješenih problema je odličan osjećaj. Znam da se i tebi sviđa.

Nabavite vlastiti papirnati kalendar. Nemojte stvarati još jedan popis obaveza na svom telefonu na koji ćete sutra zaboraviti.

Kako učinkovito otkloniti pogreške

Želite li postati profesionalac? Ako je odgovor da, onda trebate "otkloniti pogreške u svom umu."
Ovo je daleko najučinkovitija tehnika otklanjanja pogrešaka koju znam jer uopće ne zahtijeva program za uklanjanje pogrešaka. Vaš mozak ispituje više grana koda odjednom i daje vam mnogo širi pregled koda u usporedbi s klasični debugger.

Možete se usporediti s velemajstorom koji igra šah i misli 3 poteza unaprijed.

Ovu tehniku ​​koristim isključivo kao početnu liniju obrane. Zatim koristim pravi debugger.

Da biste naučili otklanjati pogreške u svojoj glavi, morate vježbati. Kada potvrdite rješenje problema i dobijete "pogrešan odgovor", nemojte ići ravno na gumb za ispravljanje pogrešaka. Ponovno pročitajte kod i razmislite: “Što se događa u ovom retku?”, “Kako “if” ovdje utječe na program?”, “Kada izađemo iz petlje, koja je vrijednost iteratora?”

Ovako razmišljaš svojom glavom. S vremenom ćete naučiti pisati kod i debugirati ga u hodu.

O autoru

Kako sam osvojio 3 od 4 zlatne medalje na Računalnoj olimpijadi
Andrei Margeloiu strastveni je programer s interesom za poduzetništvo, startupove i prirodu. Možete ga kontaktirati na LinkedInu.

Prijevod: Diana Sheremyeva

Izvor: www.habr.com

Dodajte komentar