Kako sam osvojio 3 od 4 zlatne medalje na kompjuterskoj olimpijadi

Kako sam osvojio 3 od 4 zlatne medalje na kompjuterskoj olimpijadi

Pripremao sam se za finale Google HashCode Svjetskog prvenstva 2017. Ovo je najveće takmičenje s algoritamskim problemima koje je organizirao Google.

Počeo sam da učim C++ od nule u devetom razredu. Nisam znao ništa o programiranju, algoritmima ili strukturama podataka. U nekom trenutku sam napisao svoj prvi red koda. Sedam meseci kasnije, takmičenje u programiranju se pojavilo na horizontu. Hteo sam da vidim koliko dobro funkcioniše moj stil učenja programiranja. Bila je to savršena prilika.

Nakon dva dana takmičenja, došli su rezultati: osvojio sam zlatnu medalju.

Bio sam šokiran. Bio sam ispred takmičara sa 5 godina iskustva. Znao sam da sam naporno radio, ali ovo postignuće je premašilo sva moja očekivanja. Shvatio sam da je sportsko programiranje moja tema i zaronio sam u to.

Znam šta me je dovelo do uspjeha i želim to podijeliti sa vama.

Kako sam osvojio 3 od 4 zlatne medalje na kompjuterskoj olimpijadi

Članak je preveden uz podršku EDISON softvera, koji brine o zdravlju programera i njihovom doručkuI razvija prilagođeni softver.

Koji programski jezik odabrati

  • C++ - Topla preporuka! On je veoma brz. Implementacija algoritama traje malo vremena zbog STL-a. C++ je prihvaćen na svim takmičenjima. Napisao sam svoju prvu liniju koda u C++.
  • C - Naučite C++ zbog STL-a. Ako znate C, možete programirati i na C++.
  • Java je spor programski jezik. Ima klasu Big Integer, ali vam neće puno pomoći. Ako takmičenje ima vremensko ograničenje, sa Javom ćete ga sigurno premašiti. Java nije prihvaćena na svim takmičenjima.

Gdje možete vježbati

predlažem Sphere Online Judge (SPOJ). To je efikasan resurs u smislu kvantiteta i kvaliteta. Urednici i rješenja dostupni su online ako zapnete u procesu rješavanja problema. Pored ove stranice preporučujem SPOJ Toolkit и klasifikator problema za SPOJ.pl.

Prvo, morate usavršiti svoje znanje o osnovama

Kada se naviknete na sintaksu jezika, postoje problemi koje treba prevazići. Počnite s jednostavnim problemima koji zahtijevaju vježbu. U ovoj fazi, glavna stvar je odrediti svoj stil programiranja. Možda volite da pišete kod sa puno razmaka, možda ne. Možda stavljate zagrade u isti red kao i "ako", ili ih možda stavljate u zasebne redove.

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

Kada ga tražite, zapamtite dva osnovna principa:

  • Vaš kod bi trebao biti lak za implementaciju. Trebali biste se osjećati ugodno implementirajući rješenje koje ste smislili. Zašto? Jer tokom takmičenja, poslednja stvar koju želite je da se izgubite 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 ga shvatiti.
  • Vaš kod bi trebao biti lak za čitanje. Kada je kod lak za čitanje, lako ga je otkloniti. Suočimo se s tim – greške se dešavaju stalno. Znate onaj osjećaj kada imate još 10 minuta i ne možete pronaći prokletu grešku? Naravno da hoces. Da biste izbjegli ovu situaciju, napišite čitljiv kod. Kada počnete da ga otklanjate grešaka, kod će izgledati prirodno i lako za razumevanje.

Evo jednog mog primjera stil programiranja.

Kako poboljšati svoje razvojne vještine

Vježbajte, vježbajte i još vježbajte. Preporučujem vam da proradite na prvih 250 najrješivijih problema SPOJ. Riješite ih redom. Provedite barem sat vremena razmišljajući o rješenju za svaki od njih.

Nemojte reći: "Ovaj problem je pretežak za mene, pokušaću da rešim sledeći." Ovako razmišljaju gubitnici.

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

Šta ćete postići ovim pristupom? Naučite brzo implementirati svoje ideje koristeći kod. I proučavati klasične probleme i algoritme.

Drugo, morate savladati algoritme i strukture podataka

Slijedite hijerarhijski pristup. Da li ste počeli da trčite a da niste znali da hodate? br. Možete li izgraditi neboder bez čvrste osnove? Ne opet.

Ne možete zanemariti korake na putu učenja. Ako ih zanemarite, ostat će vam praznine u znanju. Vremenom će se samo pogoršati.

Počnite s osnovnim algoritmima i strukturama podataka

Teško je započeti. Možda zato što ne znate šta prvo da učite. Zbog toga Napravio sam video kurs “Algoritmi i strukture podataka”. Kada sam kreirao ovaj kurs, bazirao sam ga na tome kako bih želeo da me podučavaju. Reakcija je bila neverovatna! Više od 3000 studenata iz preko 100 zemalja prijavilo se za kurs u prvom mjesecu.

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

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

Svaki treći problem na kojem radite treba da vas nauči nečemu novom. Budite pažljiviji pri odabiru problema. Birajte teže probleme!

Kada završite sa ovih 250 zadataka iz SPOJ-a, imaćete osnovno razumevanje osnovnih tema sportskog programiranja. Uz duboko razumijevanje logike koja stoji iza osnovnih algoritama, algoritmi visokog nivoa će se činiti manje složenim. Na ovaj način možete maksimalno iskoristiti svoje znanje.

Kopajte dublje u svaku od glavnih tema

Ovo je vrijedan resurs sa puno informacija. Tamo ćete pronaći 10 najboljih algoritama i struktura podataka za svaku temu. Nakon 250 problema iz SPOJ-a, znat ćete mnogo sa ove liste. Ali takođe ćete naići na mnoge stvari za koje nikada ranije niste čuli. Stoga počnite proučavati ove teme uzlaznim redoslijedom.

Ako ne ojačate svoje znanje nakon što naučite nešto novo, brzo ćete sve zaboraviti.
Preporučujem da nakon što naučite novi algoritam, koristite ga u praksi. Radite kroz 2-3 zadatka. Potražite oznaku algoritma u SPOJ-u. Tamo ćete pronaći probleme koje ovaj algoritam treba riješiti. Prvo riješite ove probleme.

Savladajte dinamičko programiranje jer će vas odvesti do pobjede
Iz mog iskustva, svako takmičenje ima barem jedan problem dinamičko programiranje. Mnogi ljudi dobiju glavobolju kada čuju frazu “dinamičko programiranje” jer je uopće ne razumiju.

I ovo je dobro. Jer ako razumiješ dinamičko programiranje, onda ćeš pobijediti.

Volim dinamično programiranje, to mi je omiljena tema. Tajna dinamičkog programiranja je u donošenju globalno optimalnih izbora, a ne samo lokalnih. Morate rastaviti problem na jednostavnije podprobleme. Riješite svaki od ovih podproblema samo jednom. Zatim kreirajte rješenje koje kombinira riješene podprobleme. Pohlepni algoritam - suprotno od dinamičkog programiranja. To 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 tutorijali. Veoma su detaljni i razumljivi. Zahvaljujući njima uspeo sam da razumem binarno indeksirana stabla.

Radite naporno

Jeste li ikada čuli za sportiste koji pobjeđuju na Olimpijskim igrama bez godina vježbanja? Ja ne.

Svake godine pripreme za kompjutersku olimpijadu počinjale su u septembru, a završavale su se u aprilu.

Svaki dan ovih 8 mjeseci vježbao sam po 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 kada sam se vraćao kući iz škole, odlazio sam pravo u spavaću sobu, seo za kompjuter i počeo da analiziram novi problem. Ili sam učio novi algoritam koji sam trebao znati da riješim ovaj problem.

Ako želite da pobijedite, 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 kompjuterskoj olimpijadi

Jeste li znali da kada spavate, vaš mozak defragmentira informacije prikupljene tog dana? Čini se da slaže knjige po abecednom redu na polici za knjige. U suštini, 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 problem i zapamtite šta je potrebno da biste ga riješili. U ovoj fazi ne morate tražiti samo rješenje. Idi u krevet. Vaš mozak će početi da obrađuje ovaj problem. Kada se probudite, bićete iznenađeni kada shvatite da ste pronašli rešenje dok ste spavali.

Probajte sami. To je kao magija.

Napravio sam video blog

Kako sam osvojio 3 od 4 zlatne medalje na kompjuterskoj olimpijadi

Ovaj kratki paragraf nije vezan za sportsko programiranje. Ako ste u dvadesetim i pitate se kako ja vidim svijet, možda biste htjeli provjeriti moj video blog na Youtube-u. Govorim o svijetu, životu i informatici u njemu.

Radite pametno

To je tajna uspjeha. Trebaju ti ciljevi.

Ljudi smo i sviđa nam se odugovlačiti. Uvek želimo da odložimo ono što sada treba da se uradi. Gledanje Netflixa je uvijek ugodnije od suočavanja s problemima dinamičkog programiranja. Vi to znate i morate to popraviti.

Kako pobediti odugovlačenje

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

Evo kako sam prevazišao odugovlačenje. Pokrenuo sam papirni kalendar i svaki dan ispunio problemima koje sam želio riješiti. Probleme sam uvijek popunjavao dva dana unaprijed. Tako da sam znao kako da upravljam svojim vremenom u narednim danima.

Kako sam osvojio 3 od 4 zlatne medalje na kompjuterskoj olimpijadi

Tako da sam uvek bio motivisan. Trebalo je da riješim neke probleme i pronađem nove da ispunim naredne dane u kalendaru. Precrtavanje riješenih problema je odličan osjećaj. Znam da se i tebi sviđa.

Nabavite svoj papirni kalendar. Nemojte kreirati još jednu listu obaveza na svom telefonu na koju ćete zaboraviti sutra.

Kako efikasno otkloniti greške

Želite li postati profesionalac? Ako je odgovor da, onda morate "otkloniti greške u svom umu".
Ovo je daleko najefikasnija tehnika otklanjanja grešaka koju poznajem jer uopšte ne zahteva debuger. Vaš mozak ispituje više grana koda odjednom i daje vam mnogo širi pregled koda u odnosu na klasični debuger.

Možete se porediti sa velemajstorom koji igra šah i razmišlja 3 poteza unapred.

Koristim ovu tehniku ​​isključivo kao svoju početnu liniju odbrane. Onda koristim pravi debuger.

Da biste naučili kako da otklanjate greške u svojoj glavi, morate vježbati. Kada potvrdite rješenje problema i dobijete "pogrešan odgovor", nemojte ići direktno na dugme za otklanjanje grešaka. Ponovo pročitajte kod i razmislite: "Šta se dešava u ovom redu?", "Kako "ako" ovdje utiče na program?", "Kada izađemo iz petlje, koja je vrijednost iteratora?"

Ovako mislite svojom glavom. S vremenom ćete naučiti pisati kod i otklanjati greške u hodu.

O autoru

Kako sam osvojio 3 od 4 zlatne medalje na kompjuterskoj olimpijadi
Andrei Margeloiu je strastveni programer sa interesovanjem za preduzetništvo, startapove i prirodu. Možete ga kontaktirati na LinkedInu.

Prevod: Diana Sheremyeva

izvor: www.habr.com

Dodajte komentar