Како сам освојио 3 од 4 златне медаље на компјутерској олимпијади

Како сам освојио 3 од 4 златне медаље на компјутерској олимпијади

Спремао сам се за финале Гоогле ХасхЦоде Ворлд Цхампионсхип Финалс 2017. Ово је највеће такмичење са алгоритамским проблемима које организује Гоогле.

Почео сам да учим Ц++ од нуле у деветом разреду. Нисам знао ништа о програмирању, алгоритмима или структурама података. У неком тренутку сам написао свој први ред кода. Седам месеци касније, такмичење у програмирању се појавило на хоризонту. Желео сам да видим колико добро функционише мој стил учења програмирања. Била је то савршена прилика.

После два дана такмичења, дошли су резултати: освојио сам златну медаљу.

Била сам шокирана. Био сам испред такмичара са 5 година искуства. Знао сам да сам напорно радио, али ово достигнуће је превазишло сва моја очекивања. Схватио сам да је спортско програмирање моја тема и заронио сам у то.

Знам шта ме је довело до успеха и желим да то поделим са вама.

Како сам освојио 3 од 4 златне медаље на компјутерској олимпијади

Чланак је преведен уз подршку ЕДИСОН софтвера, који брине о здрављу програмера и њиховом доручкуИ развија прилагођени софтвер.

Који програмски језик изабрати

  • Ц++ - Топло препоручујем! Он је веома брз. Имплементација алгоритама траје мало времена због СТЛ-а. Ц++ је прихваћен на свим такмичењима. Написао сам своју прву линију кода у Ц++.
  • Ц - Научите Ц++ због СТЛ-а. Ако знате Ц, можете програмирати и на Ц++.
  • Јава је спор програмски језик. Има класу Биг Интегер, али вам неће много помоћи. Ако такмичење има временско ограничење, са Јавом ћете га сигурно премашити. Јава није прихваћена на свим такмичењима.

Где можете да вежбате

Препоручујем Спхере Онлине Јудге (СПОЈ). То је ефикасан ресурс у смислу квантитета и квалитета. Уредници и решења су доступни на мрежи ако се заглавите у процесу решавања проблема. Поред овог сајта препоручујем СПОЈ Тоолкит и класификатор проблема за СПОЈ.пл.

Прво, морате усавршити своје знање о основама

Када се навикнете на синтаксу језика, постоје неки проблеми које треба превазићи. Почните са једноставним проблемима који захтевају вежбу. У овој фази, главна ствар је да одредите свој стил програмирања. Можда волите да пишете код са пуно размака, можда не. Можда сте ставили заграде у исти ред као и „ако“, или сте их можда ставили у засебне редове.

Морате пронаћи свој стил програмирања јер је то ВАШ стил.

Када га тражите, запамтите два основна принципа:

  • Ваш код би требао бити лак за имплементацију. Требало би да се осећате пријатно у примени решења које сте смислили. Зашто? Јер током такмичења, последња ствар коју желите је да се изгубите у свом коду. Увек је боље потрошити додатних 5 минута размишљајући о томе како да поједноставите имплементацију кода него да потрошите 10 минута покушавајући да га схватите.
  • Ваш код треба да буде лак за читање. Када је код лак за читање, лако га је и отклонити. Суочимо се с тим - грешке се дешавају стално. Знате онај осећај када имате још 10 минута и не можете да пронађете проклету грешку? Наравно да имаш. Да бисте избегли ову ситуацију, напишите читљив код. Када почнете да отклањате грешке, код ће изгледати природно и лако за разумевање.

Ево једног мог примера стил програмирања.

Како да побољшате своје развојне вештине

Вежбајте, вежбајте и још вежбајте. Препоручујем вам да решите првих 250 најрешивијих проблема СПОЈ. Решите их редом. Проведите најмање сат времена размишљајући о решењу сваког од њих.

Немојте рећи: „Овај проблем је претежак за мене, покушаћу да решим следећи“. Овако размишљају губитници.

Узмите комад папира и оловку. Размисли о томе. Можда можете пронаћи решење, можда не. У најмању руку, ви ћете развити алгоритамско размишљање. Ако не можете да смислите решење у року од сат времена, потражите готово решење на форуму или у чланцима.

Шта ћете постићи овим приступом? Научите да брзо имплементирате своје идеје користећи код. И проучавајте класичне проблеме и алгоритме.

Друго, морате савладати алгоритме и структуре података

Пратите хијерархијски приступ. Да ли сте почели да трчите а да нисте знали да ходате? Не. Можете ли изградити небодер без чврсте основе? Не опет.

Не можете занемарити кораке на путу учења. Ако их игноришете, остаће вам празнине у знању. Временом ће се само погоршати.

Почните са основним алгоритмима и структурама података

Тешко је започети. Можда зато што не знате шта прво да учите. Зато Направио сам видео курс „Алгоритми и структуре података“. Када сам креирао овај курс, базирао сам га на томе како бих желео да ме предају. Реакција је била невероватна! Више од 3000 студената из преко 100 земаља пријавило се за курс у првом месецу.

Ако радите на решавању лаких проблема, никада се нећете побољшати.

Најефикаснији начин да разумете оно што не знате је да то искусите у пракси. Тако сам научио. Научио сам многе нове технике за које никада раније нисам чуо бирајући изазован задатак.

Сваки трећи проблем на коме радите требало би да вас научи нечему новом. Будите пажљивији када бирате проблеме. Изаберите теже проблеме!

Када завршите ових 250 задатака из СПОЈ-а, имаћете основно разумевање основних тема спортског програмирања. Уз дубоко разумевање логике која стоји иза основних алгоритама, алгоритми високог нивоа ће изгледати мање сложени. На овај начин можете максимално искористити своје знање.

Копајте дубље у сваку од главних тема

Ево вредног ресурса са пуно информација. Тамо ћете пронаћи 10 најбољих алгоритама и структура података за сваку тему. После 250 задатака из СПОЈ-а, знаћете много са ове листе. Али такође ћете наићи на многе ствари за које никада раније нисте чули. Зато почните да проучавате ове теме у растућем редоследу.

Ако не ојачате своје знање након што научите нешто ново, брзо ћете све заборавити.
Препоручујем да након што научите нови алгоритам, користите га у пракси. Урадите то кроз 2-3 задатка. Потражите ознаку алгоритма у СПОЈ-у. Тамо ћете наћи проблеме које овај алгоритам треба решити. Прво решите ове проблеме.

Савладајте динамичко програмирање јер ће вас одвести до победе
Из мог искуства, свако такмичење има бар један проблем динамичко програмирање. Многи људи добију главобољу када чују фразу „динамичко програмирање“ јер је уопште не разумеју.

И ово је добро. Јер ако разумете динамичко програмирање, онда ћете победити.

Волим динамичко програмирање, то ми је омиљена тема. Тајна динамичког програмирања је у доношењу глобално оптималних избора, а не само локалних. Морате разбити проблем на једноставније под-проблеме. Реши сваки од ових подпроблема само једном. Затим креирајте решење које комбинује решене подпроблеме. Похлепни алгоритам - супротно од динамичког програмирања. То захтева доношење локално оптималних избора на сваком кораку. А локално оптималан избор може довести до лошег глобалног решења.

Док учите нове концепте, погледајте ТопЦодер туториали. Веома су детаљни и разумљиви. Захваљујући њима успео сам да разумем бинарно индексирана стабла.

Радите напорно

Да ли сте икада чули за спортисте који побеђују на Олимпијади без година вежбања? Ја не.

Сваке године припреме за компјутерску олимпијаду почињале су у септембру а завршавале се у априлу.

Сваки дан ових 8 месеци вежбао сам по 5 сати.

И да, провео сам ових 5 сати само решавајући алгоритамске проблеме. Сећам се дана када сам вежбао по 8, па и 10 сати. Зашто? Зато што ми се допало. Сваки дан када сам се враћао кући из школе, одлазио сам право у спаваћу собу, сео за компјутер и почео да анализирам нови проблем. Или сам учио нови алгоритам који је требало да знам да бих решио овај проблем.

Ако желите да победите, морате да урадите исто. Изаберите проблем и држите га се. Размислите о томе док ходате до супермаркета или док возите.

Како сам освојио 3 од 4 златне медаље на компјутерској олимпијади

Да ли сте знали да када спавате, ваш мозак дефрагментира информације прикупљене тог дана? Чини се да слаже књиге по абецедном реду на полици за књиге. У суштини, ваш мозак размишља о различитим проблемима са којима се суочавате.

Ово се може вешто искористити. Пре спавања прочитајте тежак проблем и запамтите шта је потребно да бисте га решили. У овој фази не морате тражити само решење. Иди у кревет. Ваш мозак ће почети да обрађује овај проблем. Када се пробудите, бићете изненађени када схватите да сте пронашли решење док сте спавали.

Пробајте сами. То је као магија.

Направио сам видео блог

Како сам освојио 3 од 4 златне медаље на компјутерској олимпијади

Овај кратки пасус није везан за спортско програмирање. Ако сте у двадесетим и питате се како ја видим свет, можда бисте желели да проверите мој видео блог на Иоутубе-у. У њему говорим о свету, животу и информатици.

Радите паметно

Ово је тајна успеха. Потребни су вам циљеви.

Људи смо и свиђа нам се одуговлачити. Увек желимо да одложимо оно што сада треба да се уради. Гледање Нетфлик-а је увек пријатније од суочавања са проблемима динамичког програмирања. Ви то знате и морате то да поправите.

Како победити одуговлачење

Поставите себи циљеве. Увек ћете наћи занимљиве проблеме из којих можете научити нешто ново (погледајте ресурсе које сам поменуо горе). Али ове проблеме треба решавати, а не само читати о њима.

Ево како сам превазишао одуговлачење. Покренуо сам папирни календар и сваки дан испунио проблемима које сам желео да решим. Увек сам попуњавао задатке два дана унапред. Тако да сам знао како да управљам својим временом у наредним данима.

Како сам освојио 3 од 4 златне медаље на компјутерској олимпијади

Тако да сам увек био мотивисан. Требало је да решим неке проблеме и пронађем нове да попуним следеће дане у календару. Прецртавање решених проблема је одличан осећај. Знам да се и теби свиђа.

Набавите свој папирни календар. Не правите још једну листу обавеза на свом телефону на коју ћете заборавити сутра.

Како ефикасно отклонити грешке

Да ли желите да постанете професионалац? Ако јесте, онда морате да „отклоните грешке у свом уму“.
Ово је далеко најефикаснија техника отклањања грешака коју познајем јер уопште не захтева отклањање грешака. Ваш мозак испитује више грана кода одједном и даје вам много шири преглед кода у поређењу са класични дебагер.

Можете се упоредити са велемајстором који игра шах и размишља 3 потеза унапред.

Користим ову технику искључиво као своју почетну линију одбране. Онда користим прави дебагер.

Да бисте научили како да отклањате грешке у својој глави, морате да вежбате. Када потврдите решење проблема и добијете „погрешан одговор“, немојте ићи директно на дугме за отклањање грешака. Поново прочитајте код и размислите: „Шта се дешава у овом реду?“, „Како „ако“ овде утиче на програм?“, „Када изађемо из петље, колика је вредност итератора?“

Овако мислите својом главом. Временом ћете научити да пишете код и отклањате грешке у ходу.

О аутору

Како сам освојио 3 од 4 златне медаље на компјутерској олимпијади
Андреи Маргелоиу је страствени програмер са интересовањем за предузетништво, стартапове и природу. Можете га контактирати на ЛинкедИн-у.

Превод: Диана Схеремиева

Извор: ввв.хабр.цом

Додај коментар