Ako som získal 3 zo 4 zlatých medailí na počítačovej olympiáde

Ako som získal 3 zo 4 zlatých medailí na počítačovej olympiáde

Pripravoval som sa na Google HashCode World Championship Finals 2017. Toto je najväčšia súťaž s algoritmickými problémami, ktorú organizuje Google.

C++ som sa začal učiť od nuly v deviatom ročníku. Nevedel som nič o programovaní, algoritmoch alebo dátových štruktúrach. V určitom okamihu som napísal svoj prvý riadok kódu. O sedem mesiacov neskôr sa na obzore objavila programátorská súťaž. Chcel som vidieť, ako dobre funguje môj štýl učenia sa programovania. Bola to ideálna príležitosť.

Po dvoch súťažných dňoch prišli výsledky: vyhral som zlatú medailu.

Bol som šokovaný. Predbehol som konkurentov s 5-ročnou praxou. Vedel som, že som tvrdo pracoval, ale tento úspech prekonal všetky moje očakávania. Uvedomil som si, že mojou témou je športové programovanie a pustil som sa do toho bezhlavo.

Viem, čo ma priviedlo k úspechu a chcem sa o to s vami podeliť.

Ako som získal 3 zo 4 zlatých medailí na počítačovej olympiáde

Článok bol preložený s podporou EDISON Software, ktorá sa stará o zdravie programátorov a ich raňajkya vyvíja softvér na mieru.

Ktorý programovací jazyk si vybrať

  • C++ - Vrelo odporúčam! Je veľmi rýchly. Implementácia algoritmov trvá len málo času kvôli STL. C++ je akceptovaný vo všetkých súťažiach. Napísal som svoj prvý riadok kódu v C++.
  • C - Naučte sa C++ kvôli STL. Ak ovládaš C, vieš programovať aj v C++.
  • Java je pomalý programovací jazyk. Má triedu Big Integer, ale to vám veľmi nepomôže. Ak má súťaž časový limit, s Javou ho určite prekročíte. Java nie je akceptovaná na všetkých súťažiach.

Kde sa dá cvičiť

odporúčam Sphere Online Judge (SPOJ). Je to efektívny zdroj z hľadiska kvantity a kvality. Ak sa pri riešení problémov zaseknete, editory a riešenia sú k dispozícii online. Okrem tejto stránky odporúčam SPOJ Toolkit и klasifikátor problémov pre SPOJ.pl.

Najprv musíte zdokonaliť svoje znalosti základov

Keď si zvyknete na syntax jazyka, budete musieť prekonať niekoľko problémov. Začnite s jednoduchými problémami, ktoré si vyžadujú prax. V tejto fáze je hlavnou vecou určiť si štýl programovania. Možno radi píšete kód s množstvom medzier, možno nie. Zátvorky môžete umiestniť na rovnaký riadok ako „ak“ alebo ich môžete umiestniť do samostatných riadkov.

Musíte nájsť svoj štýl programovania, pretože je to VÁŠ štýl.

Keď ho budete hľadať, nezabudnite na dva základné princípy:

  • Váš kód by mal byť ľahko implementovateľný. Mali by ste sa cítiť pohodlne pri implementácii riešenia, s ktorým prídete. prečo? Pretože počas súťaže je posledná vec, ktorú chcete, stratiť sa vo svojom kóde. Vždy je lepšie stráviť ďalších 5 minút premýšľaním o tom, ako zjednodušiť implementáciu kódu, ako stráviť 10 minút hľadaním toho.
  • Váš kód by mal byť ľahko čitateľný. Keď je kód ľahko čitateľný, je ľahké ho ladiť. Priznajme si to – chyby sa vyskytujú neustále. Poznáte ten pocit, keď vám zostáva 10 minút a neviete nájsť tú prekliatu chybu? Samozrejme. Aby ste predišli tejto situácii, napíšte čitateľný kód. Keď ho začnete ladiť, kód sa vám bude zdať prirodzený a ľahko pochopiteľný.

Tu je môj príklad štýl programovania.

Ako zlepšiť svoje rozvojové zručnosti

Cvičiť, cvičiť a ešte viac cvičiť. Odporúčam vám prepracovať sa cez prvých 250 najriešiteľnejších problémov SPOJ. Vyriešte ich v poradí. Strávte aspoň hodinu premýšľaním o riešení každého z nich.

Nehovorte: "Tento problém je pre mňa príliš ťažký, pokúsim sa vyriešiť ďalší." Takto rozmýšľajú porazení.

Vezmite si kus papiera a ceruzku. Zamyslite sa nad tým. Možno nájdete riešenie, možno nie. Minimálne si rozviniete algoritmické myslenie. Ak neviete prísť na riešenie do hodiny, hľadajte hotové riešenie na fóre alebo v článkoch.

Čo týmto prístupom dosiahnete? Naučte sa rýchlo implementovať svoje nápady pomocou kódu. A študovať klasické problémy a algoritmy.

Po druhé, musíte ovládať algoritmy a dátové štruktúry

Postupujte podľa hierarchického prístupu. Začali ste behať bez toho, aby ste vedeli chodiť? Nie Dokážete postaviť mrakodrap bez pevných základov? Nie znova.

Nemôžete ignorovať kroky na vzdelávacej ceste. Ak ich budete ignorovať, zostanú vám medzery vo vedomostiach. Postupom času sa budú len zhoršovať.

Začnite so základnými algoritmami a dátovými štruktúrami

Je ťažké začať. Možno preto, že neviete, čo študovať ako prvé. Preto Vytvoril som video kurz „Algoritmy a dátové štruktúry“. Pri tvorbe tohto kurzu som vychádzal z toho, ako by som chcel byť vyučovaný. Reakcia bola neuveriteľná! Počas prvého mesiaca sa do kurzu prihlásilo viac ako 3000 100 študentov z viac ako XNUMX krajín.

Ak pracujete na riešení ľahkých problémov, nikdy sa nezlepšíte.

Najúčinnejší spôsob, ako pochopiť to, čo neviete, je zažiť to v praxi. Tak som sa to naučil. Naučil som sa veľa nových techník, o ktorých som nikdy predtým nepočul, výberom náročnej úlohy.

Každý tretí problém, na ktorom pracujete, by vás mal naučiť niečo nové. Buďte opatrnejší pri výbere problémov. Vyberte si zložitejšie problémy!

Po dokončení týchto 250 úloh zo SPOJ budete mať základné znalosti o základných témach športového programovania. S hlbokým pochopením logiky základných algoritmov sa budú algoritmy na vysokej úrovni zdať menej zložité. Takto môžete maximálne využiť svoje znalosti.

Ponorte sa hlbšie do každej z hlavných tém

Tu je cenný zdroj s množstvom informácií. Nájdete tam 10 najlepších algoritmov a dátových štruktúr pre každú tému. Po 250 problémoch od SPOJ sa z tohto zoznamu dozviete veľa. Narazíte však aj na mnohé veci, o ktorých ste ešte nepočuli. Začnite teda študovať tieto témy vo vzostupnom poradí.

Ak si neupevníte vedomosti po tom, čo sa naučíte niečo nové, rýchlo na všetko zabudnete.
Odporúčam, aby ste po naučení nového algoritmu použili v praxi. Spracujte 2-3 úlohy. Vyhľadajte značku algoritmu v SPOJ. Nájdete tam problémy, ktoré je potrebné vyriešiť pomocou tohto algoritmu. Najskôr vyriešte tieto problémy.

Pochopte dynamické programovanie, pretože vás povedie k víťazstvu
Z mojej skúsenosti má každá súťaž minimálne jeden problém dynamické programovanie. Mnoho ľudí bolí hlava, keď počujú frázu „dynamické programovanie“, pretože jej vôbec nerozumejú.

A toto je dobré. Pretože ak rozumiete dynamickému programovaniu, potom vyhráte.

Mám rád dynamické programovanie, je to moja obľúbená téma. Tajomstvom dynamického programovania je robiť globálne optimálne voľby, nielen lokálne. Musíte problém rozdeliť na jednoduchšie čiastkové problémy. Vyriešte každý z týchto podproblémov iba raz. Potom vytvorte riešenie, ktoré kombinuje vyriešené podproblémy. Chamtivý algoritmus - opak dynamického programovania. Vyžaduje si to miestne optimálne voľby v každom kroku. A lokálne optimálny výber môže viesť k zlému globálnemu riešeniu.

Zatiaľ čo sa učíte nové koncepty, pozrite sa TopCoder tutoriály. Sú veľmi podrobné a zrozumiteľné. Vďaka nim som mohol pochopiť binárne indexované stromy.

Ťažko pracovať

Počuli ste už o športovcoch, ktorí vyhrajú olympiádu bez dlhoročnej praxe? Ja nie.

Každý rok sa príprava na počítačovú olympiádu začínala v septembri a končila v apríli.

Každý deň počas týchto 8 mesiacov som cvičil 5 hodín.

A áno, týchto 5 hodín som strávil iba riešením algoritmických problémov. Pamätám si časy, keď som cvičil 8 a dokonca 10 hodín. prečo? Pretože sa mi to páčilo. Každý deň, keď som sa vrátil domov zo školy, išiel som rovno do spálne, sadol si k počítaču a začal som rozoberať nový problém. Alebo som sa učil nový algoritmus, ktorý som potreboval vedieť na vyriešenie tohto problému.

Ak chcete vyhrať, musíte urobiť to isté. Vyberte si problém a držte sa ho. Myslite na to počas chôdze do supermarketu alebo počas jazdy autom.

Ako som získal 3 zo 4 zlatých medailí na počítačovej olympiáde

Vedeli ste, že keď spíte, váš mozog defragmentuje informácie zozbierané v ten deň? Zdá sa, že ukladá knihy v abecednom poradí na policu. V podstate váš mozog premýšľa o rôznych problémoch, ktorým čelíte.

To sa dá šikovne využiť. Pred spaním si prečítajte zložitý problém a zapamätajte si, čo je potrebné na jeho vyriešenie. V tejto fáze nemusíte hľadať samotné riešenie. Ísť do postele. Váš mozog začne tento problém spracovávať. Keď sa zobudíte, budete prekvapení, keď si uvedomíte, že ste riešenie našli, kým ste spali.

Skúste to sami. Je to ako mágia.

Vytvoril som video blog

Ako som získal 3 zo 4 zlatých medailí na počítačovej olympiáde

Tento krátky odsek nesúvisí so športovým programovaním. Ak máte po dvadsiatke a zaujíma vás, ako vidím svet ja, možno by ste sa chceli pozrieť môj videoblog na Youtube. Hovorím o svete, živote a informatike v ňom.

Pracujte inteligentne

Toto je tajomstvo úspechu. Potrebujete ciele.

Sme ľudia a máme to radi prokrastinovať. Vždy chceme odložiť to, čo treba urobiť práve teraz. Sledovanie Netflixu je vždy príjemnejšie ako riešiť problémy s dynamickým programovaním. Viete to a musíte to napraviť.

Ako poraziť prokrastináciu

Stanovte si ciele. Vždy nájdete zaujímavé problémy, z ktorých sa môžete naučiť niečo nové (pozrite si zdroje, ktoré som spomenul vyššie). Tieto problémy však treba riešiť, nielen o nich čítať.

Takže tu je návod, ako som prekonal prokrastináciu. Založil som si papierový kalendár a každý deň som naplnil problémami, ktoré som chcel vyriešiť. Problémy som vypĺňal vždy dva dni vopred. Vedel som si teda naložiť s časom v nasledujúcich dňoch.

Ako som získal 3 zo 4 zlatých medailí na počítačovej olympiáde

Takže som bol vždy motivovaný. Potreboval som vyriešiť nejaké problémy a nájsť nové, aby som naplnil ďalšie dni v kalendári. Odškrtávať vyriešené problémy je skvelý pocit. Viem, že aj tebe sa to páči.

Získajte svoj vlastný papierový kalendár. Nevytvárajte si v telefóne ďalší zoznam úloh, na ktorý zajtra zabudnete.

Ako efektívne ladiť

Chcete sa stať profesionálom? Ak áno, musíte to „odladiť vo svojej mysli“.
Toto je zďaleka najúčinnejšia technika ladenia, ktorú poznám, pretože vôbec nevyžaduje debugger. Váš mozog skúma viacero vetiev kódu naraz a poskytuje vám oveľa širší prehľad o kóde v porovnaní s klasický debugger.

Môžete sa porovnať s veľmajstrom, ktorý hrá šach a myslí 3 ťahy dopredu.

Túto techniku ​​používam výlučne ako svoju počiatočnú obrannú líniu. Potom používam skutočný debugger.

Aby ste sa naučili ladiť v hlave, musíte trénovať. Keď overíte riešenie problému a dostanete „nesprávnu odpoveď“, neprechádzajte priamo na tlačidlo debuggera. Znovu si prečítajte kód a zamyslite sa: "Čo sa deje v tomto riadku?", "Ako ovplyvní program "ak" tu?", "Keď opustíme cyklus, akú hodnotu má iterátor?"

Takto premýšľate o sebe. Postupom času sa naučíte písať kód a ladiť ho za chodu.

O autorovi

Ako som získal 3 zo 4 zlatých medailí na počítačovej olympiáde
Andrei Margeloiu je zanietený programátor so záujmom o podnikanie, startupy a outdoor. Môžete ho kontaktovať na LinkedIn.

Preklad: Diana Sheremyeva

Zdroj: hab.com

Pridať komentár