Kako sem osvojil 3 od 4 zlatih medalj na računalniški olimpijadi

Kako sem osvojil 3 od 4 zlatih medalj na računalniški olimpijadi

Pripravljal sem se na Google HashCode World Championship Finals 2017. To je največje tekmovanje z algoritemskimi problemi, ki ga organizira Google.

C++ sem se začel učiti iz nič v devetem razredu. Nič nisem vedel o programiranju, algoritmih ali podatkovnih strukturah. Na neki točki sem napisal svojo prvo vrstico kode. Sedem mesecev pozneje se je na obzorju že pokazalo programersko tekmovanje. Želel sem videti, kako dobro deluje moj stil učenja programiranja. Bila je popolna priložnost.

Po dveh dneh tekmovanja so prišli rezultati: osvojila sem zlato medaljo.

Bil sem šokiran. Bil sem pred tekmeci s 5-letnimi izkušnjami. Vedel sem, da sem trdo delal, a ta dosežek je presegel vsa moja pričakovanja. Ugotovil sem, da je športni program moja tema in se brezglavo potopil vanj.

Vem, kaj me je pripeljalo do uspeha, in to želim deliti z vami.

Kako sem osvojil 3 od 4 zlatih medalj na računalniški olimpijadi

Članek je bil preveden s podporo EDISON Software, ki skrbi za zdravje programerjev in njihov zajtrkin razvija programsko opremo po meri.

Kateri programski jezik izbrati

  • C++ - zelo priporočam! Je zelo hiter. Implementacija algoritmov traja malo časa zaradi STL. C++ je sprejet na vseh tekmovanjih. Svojo prvo vrstico kode sem napisal v C++.
  • C - Naučite se C++ zaradi STL. Če poznate C, lahko programirate tudi v C++.
  • Java je počasen programski jezik. Ima razred Big Integer, vendar vam ne bo veliko pomagal. Če ima tekmovanje časovno omejitev, jo boste z Javo zagotovo presegli. Java ni sprejeta na vseh tekmovanjih.

Kje lahko vadite

priporočam Spletni sodnik Sphere (SPOJ). Je učinkovit vir v smislu količine in kakovosti. Urejevalniki in rešitve so na voljo na spletu, če se vam zatakne pri reševanju težav. Poleg te strani priporočam Zbirka orodij SPOJ и klasifikator problemov za SPOJ.pl.

Najprej morate izpopolniti svoje znanje osnov

Ko se navadite na sintakso jezika, morate premagati nekaj težav. Začnite s preprostimi težavami, ki zahtevajo prakso. Na tej stopnji je glavna stvar določiti svoj stil programiranja. Morda radi pišete kodo z veliko presledki, morda ne. Morda boste oklepaje postavili v isto vrstico kot »če« ali pa jih boste postavili v ločene vrstice.

Najti morate svoj stil programiranja, ker je to VAŠ stil.

Ko ga iščete, si zapomnite dve osnovni načeli:

  • Vaša koda mora biti enostavna za implementacijo. Morali bi se počutiti udobno pri izvajanju rešitve, ki ste jo našli. Zakaj? Kajti med tekmovanjem je zadnja stvar, ki si jo želiš, izgubiti se v svoji kodi. Vedno je bolje porabiti dodatnih 5 minut za razmišljanje o tem, kako poenostaviti implementacijo kode, kot porabiti 10 minut za to, da bi jo ugotovili.
  • Vaša koda mora biti lahko berljiva. Ko je koda enostavna za branje, je enostavno odpravljati napake. Priznajmo si – napake se pojavljajo ves čas. Poznate tisti občutek, ko imate še 10 minut in ne najdete preklete napake? Seveda. Da bi se izognili tej situaciji, napišite berljivo kodo. Ko začnete odpravljati napake, bo koda videti naravna in lahko razumljiva.

Tukaj je moj primer stil programiranja.

Kako izboljšati svoje razvojne sposobnosti

Praksa, praksa in še več prakse. Priporočam, da pregledate prvih 250 najbolj rešljivih problemov SPOJ. Reši jih po vrsti. Vsaj eno uro razmišljajte o rešitvi vsakega od njih.

Ne recite: "Ta problem je zame pretežak, poskusil bom rešiti naslednjega." Tako razmišljajo poraženci.

Vzemite kos papirja in svinčnik. Premisli. Morda boste našli rešitev, morda ne. Razvili boste vsaj algoritemsko razmišljanje. Če rešitve ne najdete v eni uri, poiščite že pripravljeno rešitev na forumu ali v člankih.

Kaj boste dosegli s tem pristopom? Naučite se hitro implementirati svoje ideje z uporabo kode. In študirati klasične probleme in algoritme.

Drugič, obvladati morate algoritme in podatkovne strukture

Sledite hierarhičnemu pristopu. Ste začeli teči, ne da bi znali hoditi? št. Ali lahko zgradite nebotičnik brez trdnih temeljev? Ne že spet.

Ne morete prezreti korakov na učni poti. Če jih ne boste upoštevali, boste imeli vrzeli v znanju. Sčasoma bodo le še slabše.

Začnite s temeljnimi algoritmi in podatkovnimi strukturami

Težko je začeti. Morda zato, ker ne veš, kaj bi najprej študiral. Zato Ustvaril sem video tečaj "Algoritmi in podatkovne strukture". Ko sem ustvarjal ta tečaj, sem ga zasnoval na tem, kako bi želel, da me poučujejo. Odziv je bil neverjeten! V prvem mesecu se je na tečaj prijavilo več kot 3000 študentov iz več kot 100 držav.

Če delate na reševanju lahkih problemov, se ne boste nikoli izboljšali.

Najučinkovitejši način, da razumete tisto, česar ne veste, je, da to izkusite v praksi. Tako sem se naučil. Z izbiro zahtevne naloge sem se naučil veliko novih tehnik, za katere še nisem slišal.

Vsaka tretja težava, ki jo rešite, bi vas morala naučiti nekaj novega. Bodite previdnejši pri izbiri težav. Izberite težje probleme!

Ko boste rešili teh 250 nalog iz SPOJ, boste imeli osnovno razumevanje osrednjih tem športnega programiranja. Z globokim razumevanjem logike osnovnih algoritmov se bodo algoritmi na visoki ravni zdeli manj zapleteni. Tako lahko kar najbolje izkoristite svoje znanje.

Poglobite se v vsako od glavnih tem

Tukaj je dragocen vir z veliko informacijami. Tam boste našli 10 najboljših algoritmov in podatkovnih struktur za vsako temo. Po 250 problemih iz SPOJ-a boste s tega seznama vedeli marsikaj. Naleteli pa boste tudi na marsikaj, za kar še niste slišali. Zato začnite preučevati te teme v naraščajočem vrstnem redu.

Če po tem, ko se naučiš nekaj novega, ne utrdiš svojega znanja, boš vse hitro pozabil.
Priporočam, da ko se naučite novega algoritma, ga uporabite v praksi. Delajte skozi 2-3 naloge. Poiščite oznako algoritma v SPOJ. Tam boste našli težave, za reševanje katerih potrebujete ta algoritem. Najprej se lotite teh vprašanj.

Obvladajte dinamično programiranje, ker vas bo pripeljalo do zmage
Po mojih izkušnjah ima vsako tekmovanje vsaj eno težavo dinamično programiranje. Marsikoga zaboli glava, ko sliši izraz »dinamično programiranje«, ker ga sploh ne razume.

In to je dobro. Ker če razumete dinamično programiranje, potem boste zmagali.

Rad imam dinamično programiranje, to je moja najljubša tema. Skrivnost dinamičnega programiranja je sprejemanje globalno optimalnih izbir, ne samo lokalnih. Težavo morate razdeliti na preprostejše podprobleme. Vsako od teh podproblemov rešite samo enkrat. Nato ustvarite rešitev, ki združuje rešene podprobleme. Požrešen algoritem - nasprotje dinamičnega programiranja. Zahteva lokalno optimalne izbire na vsakem koraku. In lokalno optimalna izbira lahko vodi do slabe globalne rešitve.

Med učenjem novih konceptov preverite Vadnice TopCoder. So zelo podrobni in razumljivi. Zahvaljujoč njim sem lahko razumel binarno indeksirana drevesa.

Trdo delati

Ste že slišali za športnike, ki zmagajo na olimpijskih igrah brez let vadbe? Jaz ne.

Vsako leto so se priprave na računalniško olimpijado začele septembra in zaključile aprila.

Vsak dan teh 8 mesecev sem vadil po 5 ur.

In ja, teh 5 ur sem porabil samo za reševanje algoritemskih problemov. Spominjam se dni, ko sem vadil po 8 in celo 10 ur. Zakaj? Ker mi je bilo všeč. Vsak dan, ko sem se vrnil domov iz šole, sem šel naravnost v spalnico, sedel za računalnik in začel analizirati nov problem. Ali pa sem se učil novega algoritma, ki sem ga moral poznati za rešitev tega problema.

Če želite zmagati, morate storiti enako. Izberite težavo in se je držite. Pomislite na to med hojo do supermarketa ali med vožnjo.

Kako sem osvojil 3 od 4 zlatih medalj na računalniški olimpijadi

Ali ste vedeli, da vaši možgani med spanjem defragmentirajo informacije, zbrane tisti dan? Zdi se, kot da zlaga knjige po abecednem vrstnem redu na knjižno polico. V bistvu vaši možgani razmišljajo o različnih težavah, s katerimi se srečujete.

To je mogoče spretno uporabiti. Pred spanjem preberi težko nalogo in se spomni, kaj je potrebno za njeno rešitev. Na tej stopnji vam ni treba iskati same rešitve. Pojdi spat. Vaši možgani bodo začeli obdelovati to težavo. Ko se zbudite, boste presenečeni ugotovili, da ste rešitev našli med spanjem.

Poskusite sami. To je kot čarovnija.

Ustvaril sem video blog

Kako sem osvojil 3 od 4 zlatih medalj na računalniški olimpijadi

Ta kratek odstavek ni povezan s športnim programiranjem. Če ste v svojih dvajsetih in se sprašujete, kako jaz vidim svet, bi morda želeli preveriti moj video blog na Youtube. Govorim o svetu, življenju in informatiki v njem.

Delajte pametno

To je skrivnost uspeha. Potrebujete cilje.

Ljudje smo in to nam je všeč prokrastinirati. Vedno želimo odložiti tisto, kar je treba narediti zdaj. Gledanje Netflixa je vedno bolj prijetno kot ukvarjanje z dinamičnimi programskimi težavami. To veste in to morate popraviti.

Kako premagati odlašanje

Postavite si cilje. Vedno boste našli zanimive probleme, iz katerih se lahko naučite nekaj novega (preverite vire, ki sem jih omenil zgoraj). Toda te težave je treba rešiti, ne le brati.

Evo, kako sem premagal odlašanje. Začel sem pisati papirnati koledar in vsak dan napolnil s težavami, ki sem jih želel rešiti. Težave sem vedno izpolnil dva dni vnaprej. Tako sem znal razporediti svoj čas v naslednjih dneh.

Kako sem osvojil 3 od 4 zlatih medalj na računalniški olimpijadi

Tako sem bil vedno motiviran. Moral sem rešiti nekaj težav in poiskati nove, da bi zapolnil naslednje dni na koledarju. Prečrtanje rešenih problemov je odličen občutek. Vem, da je tudi tebi všeč.

Zagotovite si svoj papirnati koledar. V telefonu ne ustvarite še enega seznama opravil, na katerega boste jutri pozabili.

Kako učinkovito odpraviti napake

Ali želite postati profesionalec? Če je odgovor pritrdilen, potem ga morate »odpraviti v mislih«.
To je daleč najučinkovitejša tehnika odpravljanja napak, kar jih poznam, ker sploh ne potrebuje razhroščevalnika. Vaši možgani pregledajo več vej kode hkrati in vam dajo veliko širši pregled nad kodo v primerjavi z klasični razhroščevalnik.

Lahko se primerjate z velemojstrom, ki igra šah in misli 3 poteze vnaprej.

To tehniko uporabljam izključno kot prvo obrambno linijo. Nato uporabim pravi razhroščevalnik.

Če se želite naučiti odpravljati napake v svoji glavi, morate vaditi. Ko potrdite rešitev težave in dobite "napačen odgovor", ne pojdite takoj na gumb za odpravljanje napak. Ponovno preberite kodo in pomislite: »Kaj se dogaja v tej vrstici?«, »Kako »če« tukaj vpliva na program?«, »Ko zapustimo zanko, kakšna je vrednost iteratorja?«

Na ta način razmišljate sami. Sčasoma se boste naučili pisati kodo in jo sproti odpravljati.

O avtorju

Kako sem osvojil 3 od 4 zlatih medalj na računalniški olimpijadi
Andrei Margeloiu je navdušen programer, ki ga zanimajo podjetništvo, zagonska podjetja in delo na prostem. Lahko ga kontaktirate na LinkedInu.

Prevod: Diana Sheremyeva

Vir: www.habr.com

Dodaj komentar