Jak jsem získal 3 ze 4 zlatých medailí na počítačové olympiádě

Jak jsem získal 3 ze 4 zlatých medailí na počítačové olympiádě

Připravoval jsem se na Google HashCode World Championship Finals 2017. Toto je největší soutěž s algoritmickými problémy, kterou pořádá Google.

C++ jsem se začal učit od nuly v deváté třídě. Nevěděl jsem nic o programování, algoritmech nebo datových strukturách. V určitém okamžiku jsem napsal svůj první řádek kódu. O sedm měsíců později se na obzoru objevila programátorská soutěž. Chtěl jsem vidět, jak dobře funguje můj styl učení se programování. Byla to ideální příležitost.

Po dvou dnech soutěžení přišly výsledky: vyhrál jsem zlatou medaili.

Byl jsem šokován. Předběhl jsem konkurenty s 5letou praxí. Věděl jsem, že jsem tvrdě pracoval, ale tento úspěch předčil všechna má očekávání. Uvědomil jsem si, že mým tématem je sportovní programování, a pustil se do toho bezhlavě.

Vím, co mě vedlo k úspěchu a chci se o to s vámi podělit.

Jak jsem získal 3 ze 4 zlatých medailí na počítačové olympiádě

Článek byl přeložen s podporou EDISON Software, která se stará o zdraví programátorů a jejich snídaněa vyvíjí software na zakázku.

Jaký programovací jazyk zvolit

  • C++ - Vřele doporučuji! Je velmi rychlý. Implementace algoritmů trvá kvůli STL málo času. C++ je přijímáno ve všech soutěžích. Napsal jsem svůj první řádek kódu v C++.
  • C – Naučte se C++ díky STL. Pokud umíte C, umíte programovat i v C++.
  • Java je pomalý programovací jazyk. Má třídu Big Integer, ale moc vám to nepomůže. Pokud má soutěž časový limit, s Javou ho jistě překročíte. Java není akceptována na všech soutěžích.

Kde se dá cvičit

doporučuji Soudce Sphere Online (SPOJ). Je to efektivní zdroj z hlediska kvantity i kvality. Editory a řešení jsou k dispozici online, pokud se při řešení problémů zaseknete. Kromě této stránky doporučuji SPOJ Toolkit и klasifikátor problémů pro SPOJ.pl.

Nejprve musíte zdokonalit své znalosti základů

Jakmile si zvyknete na syntaxi jazyka, budete muset překonat některé problémy. Začněte s jednoduchými problémy, které vyžadují praxi. V této fázi je hlavní určit svůj styl programování. Možná rádi píšete kód se spoustou mezer, možná ne. Možná umístíte závorky na stejný řádek jako „pokud“, nebo je můžete umístit na samostatné řádky.

Musíte najít svůj styl programování, protože je to VÁŠ styl.

Až to budete hledat, nezapomeňte na dva základní principy:

  • Váš kód by měl být snadno implementovatelný. Měli byste se cítit pohodlně při implementaci řešení, se kterým přijdete. Proč? Protože během soutěže to poslední, co chcete, je ztratit se ve svém kódu. Vždy je lepší strávit 5 minut navíc přemýšlením o tom, jak zjednodušit implementaci kódu, než strávit 10 minut snahou přijít na to.
  • Váš kód by měl být snadno čitelný. Když je kód snadno čitelný, je snadné jej ladit. Přiznejme si to – chyby se stávají neustále. Znáte ten pocit, když vám zbývá 10 minut a nemůžete najít tu zatracenou chybu? Samozřejmě, že ano. Chcete-li se této situaci vyhnout, pište čitelný kód. Jakmile jej začnete ladit, kód se bude zdát přirozený a snadno pochopitelný.

Zde je můj příklad styl programování.

Jak zlepšit své rozvojové dovednosti

Cvičit, cvičit a ještě cvičit. Doporučuji vám projít prvních 250 nejřešitelnějších problémů SPOJ. Vyřešte je v pořadí. Věnujte alespoň hodinu přemýšlení o řešení každého z nich.

Neříkejte: "Tento problém je pro mě příliš obtížný, pokusím se vyřešit další." Takto uvažují poražení.

Vezměte si kus papíru a tužku. Přemýšlejte o tom. Možná najdete řešení, možná ne. Minimálně si rozvinete algoritmické myšlení. Pokud nemůžete přijít s řešením do hodiny, hledejte hotové řešení na fóru nebo v článcích.

Čeho tímto přístupem dosáhnete? Naučte se rychle implementovat své nápady pomocí kódu. A studovat klasické problémy a algoritmy.

Za druhé, musíte zvládnout algoritmy a datové struktury

Postupujte podle hierarchického přístupu. Začali jste běhat, aniž byste věděli, jak chodit? Ne. Dokážete postavit mrakodrap bez pevných základů? Znovu ne.

Nemůžete ignorovat kroky na cestě učení. Pokud je budete ignorovat, zůstanou vám mezery ve znalostech. Postupem času se budou jen zhoršovat.

Začněte se základními algoritmy a datovými strukturami

Je těžké začít. Možná proto, že nevíte, co se učit dřív. Proto Vytvořil jsem video kurz „Algoritmy a datové struktury“. Při tvorbě tohoto kurzu jsem vycházel z toho, jak bych chtěl být vyučován. Reakce byla neuvěřitelná! Během prvního měsíce se do kurzu přihlásilo více než 3000 100 studentů z více než XNUMX zemí.

Pokud pracujete na řešení jednoduchých problémů, nikdy se nezlepšíte.

Nejúčinnější způsob, jak pochopit to, co nevíte, je zažít to v praxi. Tak jsem se to naučil. Naučil jsem se mnoho nových technik, o kterých jsem nikdy předtím neslyšel, a to výběrem náročného úkolu.

Každý třetí problém, na kterém pracujete, by vás měl naučit něco nového. Při výběru problémů buďte opatrnější. Vyberte si složitější problémy!

Jakmile dokončíte těchto 250 problémů ze SPOJ, budete mít základní znalosti o klíčových tématech sportovního programování. S hlubokým pochopením logiky základních algoritmů se budou zdát algoritmy na vysoké úrovni méně složité. Takto můžete maximálně využít své znalosti.

Ponořte se hlouběji do každého z hlavních témat

Zde je cenný zdroj se spoustou informací. Zde najdete 10 nejlepších algoritmů a datových struktur pro každé téma. Po 250 problémech ze SPOJ budete z tohoto seznamu hodně vědět. Narazíte ale i na mnoho věcí, o kterých jste nikdy předtím neslyšeli. Začněte tedy studovat tato témata ve vzestupném pořadí.

Pokud své znalosti neposílíte poté, co se naučíte něco nového, rychle na vše zapomenete.
Doporučuji poté, co se naučíte nový algoritmus, používat jej v praxi. Zpracujte 2-3 úkoly. Hledejte značku algoritmu ve SPOJ. Zde najdete problémy, které tento algoritmus potřebuje k vyřešení. Nejprve řešte tyto problémy.

Zvládněte dynamické programování, protože vás dovede k vítězství
Z mé zkušenosti má každá soutěž minimálně jeden problém dynamické programování. Mnoho lidí bolí hlava, když slyší frázi „dynamické programování“, protože jí vůbec nerozumí.

A to je dobré. Protože pokud rozumíte dynamickému programování, pak vyhrajete.

Mám rád dynamické programování, je to moje oblíbené téma. Tajemstvím dynamického programování je dělat globálně optimální volby, nejen ty lokální. Musíte problém rozdělit na jednodušší dílčí problémy. Každý z těchto dílčích problémů řešte pouze jednou. Poté vytvořte řešení, které kombinuje vyřešené dílčí problémy. Chamtivý algoritmus - opak dynamického programování. Vyžaduje to v každém kroku provádět lokálně optimální volby. A lokálně optimální volba může vést ke špatnému globálnímu řešení.

Zatímco se učíte nové koncepty, podívejte se TopCoder tutoriály. Jsou velmi podrobné a srozumitelné. Díky nim jsem mohl pochopit binární indexované stromy.

Tvrdě pracovat

Už jste někdy slyšeli o sportovcích, kteří vyhrají olympiádu bez let praxe? Já ne.

Přípravy na počítačovou olympiádu každoročně začínaly v září a končily v dubnu.

Těchto 8 měsíců jsem každý den cvičil 5 hodin.

A ano, těchto 5 hodin jsem strávil pouze řešením algoritmických problémů. Pamatuji si doby, kdy jsem cvičil 8 a dokonce 10 hodin. Proč? Protože se mi to líbilo. Každý den, když jsem se vrátil ze školy, šel jsem rovnou do ložnice, sedl k počítači a začal analyzovat nový problém. Nebo jsem se učil nový algoritmus, který jsem potřeboval znát k vyřešení tohoto problému.

Pokud chcete vyhrát, musíte udělat totéž. Vyberte si problém a držte se ho. Myslete na to při chůzi do supermarketu nebo při jízdě autem.

Jak jsem získal 3 ze 4 zlatých medailí na počítačové olympiádě

Věděli jste, že když spíte, váš mozek defragmentuje informace shromážděné ten den? Zdá se, že skládá knihy v abecedním pořadí na polici. V podstatě váš mozek přemýšlí o různých problémech, kterým čelíte.

Toho lze obratně využít. Před spaním si přečtěte obtížný problém a zapamatujte si, co je potřeba k jeho vyřešení. V této fázi nemusíte hledat řešení samotné. Jít spát. Váš mozek začne tento problém zpracovávat. Když se probudíte, budete překvapeni, když zjistíte, že jste našli řešení, když jste spali.

Zkus to sám. Je to jako kouzlo.

Vytvořil jsem video blog

Jak jsem získal 3 ze 4 zlatých medailí na počítačové olympiádě

Tento krátký odstavec se netýká sportovního programování. Pokud je vám dvacet a zajímá vás, jak já vidím svět, možná se budete chtít podívat můj videoblog na Youtube. Mluvím o světě, životě a informatice v něm.

Pracujte chytře

To je tajemství úspěchu. Potřebujete cíle.

Jsme lidé a máme to rádi odkládat. Vždy chceme odložit to, co je třeba udělat právě teď. Sledování Netflixu je vždy příjemnější než řešit problémy s dynamickým programováním. Víte to a musíte to napravit.

Jak porazit prokrastinaci

Stanovte si cíle. Vždy najdete zajímavé problémy, ze kterých se můžete naučit něco nového (podívejte se na zdroje, které jsem zmínil výše). Tyto problémy je ale potřeba řešit, nejen o nich číst.

Takže tady je návod, jak jsem překonal prokrastinaci. Založil jsem papírový kalendář a každý den jsem naplnil problémy, které jsem chtěl vyřešit. Problémy jsem vyplňoval vždy dva dny předem. Věděl jsem tedy, jak naložit s časem v následujících dnech.

Jak jsem získal 3 ze 4 zlatých medailí na počítačové olympiádě

Takže jsem byl vždy motivovaný. Potřeboval jsem vyřešit nějaké problémy a najít nové, abych zaplnil další dny v kalendáři. Odškrtávání vyřešených problémů je skvělý pocit. Vím, že se ti to taky líbí.

Pořiďte si vlastní papírový kalendář. Nevytvářejte si v telefonu další seznam úkolů, na který zítra zapomenete.

Jak efektivně ladit

Chcete se stát profesionálem? Pokud ano, musíte to „odladit ve své mysli“.
Toto je zdaleka nejúčinnější technika ladění, kterou znám, protože vůbec nevyžaduje debugger. Váš mozek zkoumá více větví kódu najednou a poskytuje vám mnohem širší přehled o kódu ve srovnání s klasický debugger.

Můžete se srovnat s velmistrem, který hraje šachy a myslí 3 tahy dopředu.

Tuto techniku ​​používám pouze jako svou počáteční obrannou linii. Pak používám skutečný debugger.

Chcete-li se naučit, jak ladit v hlavě, musíte cvičit. Když ověříte řešení problému a dostanete „špatnou odpověď“, nechoďte přímo na tlačítko debuggeru. Znovu si přečtěte kód a přemýšlejte: "Co se děje na tomto řádku?", "Jak to "pokud" zde ovlivní program?", "Jaká je hodnota iterátoru, když opustíme smyčku?"

Tímto způsobem přemýšlíte o sobě. Postupem času se naučíte psát kód a ladit ho za chodu.

O autorovi

Jak jsem získal 3 ze 4 zlatých medailí na počítačové olympiádě
Andrei Margeloiu je zanícený programátor se zájmem o podnikání, startupy a outdoor. Můžete ho kontaktovat na LinkedIn.

Překlad: Diana Sheremyeva

Zdroj: www.habr.com

Přidat komentář