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

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

Се подготвував за финалето на Светското првенство на Google HashCode 2017. Ова е најголемиот натпревар со алгоритамски проблеми организиран од Google.

Почнав да учам C++ од нула во деветто одделение. Не знаев ништо за програмирање, алгоритми или структури на податоци. Во одреден момент ја напишав мојата прва линија код. Седум месеци подоцна, натпреварот за програмирање се наѕираше на хоризонтот. Сакав да видам колку добро функционира мојот стил на учење програмирање. Тоа беше совршена можност.

По два дена натпреварување дојдоа резултатите: Го освоив златниот медал.

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

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

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

Статијата е преведена со поддршка на софтверот EDISON, кој се грижи за здравјето на програмерите и нивниот појадокИ развива сопствен софтвер.

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

  • C++ - Силно препорачувам! Тој е многу брз. Имплементацијата на алгоритмите трае малку време поради STL. C++ е прифатен во сите натпревари. Ја напишав мојата прва линија код во C++.
  • C - Научете C++ поради STL. Ако знаете C, можете да програмирате и во C++.
  • Јава е бавен програмски јазик. Има класа Big Integer, но нема да ви помогне многу. Ако натпреварот има временско ограничување, со Java сигурно ќе го надминете. Јава не е прифатена на сите натпревари.

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

препорачувам Sphere Online Judge (SPOJ). Тоа е ефективен ресурс во однос на квантитет и квалитет. Уредниците и решенијата се достапни на интернет ако заглавите во процесот на решавање проблеми. Во прилог на оваа страница препорачувам SPOJ Toolkit и класификатор на проблеми за SPOJ.pl.

Прво, треба да го усовршите вашето знаење за основите

Откако ќе се навикнете на синтаксата на јазикот, има некои проблеми што треба да се надминат. Започнете со едноставни проблеми кои бараат пракса. Во оваа фаза, главната работа е да го одредите вашиот стил на програмирање. Можеби сакате да пишувате код со многу празни места, можеби не. Можеби ги ставате заградите на иста линија како „ако“, или можеби ги ставате на посебни линии.

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

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

  • Вашиот код треба да биде лесен за имплементација. Треба да се чувствувате удобно при спроведувањето на решението до кое доаѓате. Зошто? Бидејќи за време на натпревар, последното нешто што сакате е да се изгубите во вашиот код. Секогаш е подобро да потрошите дополнителни 5 минути размислувајќи како да ја поедноставите имплементацијата на кодот отколку да потрошите 10 минути обидувајќи се да го сфатите.
  • Вашиот код треба да биде лесен за читање. Кога кодот е лесен за читање, лесно е да се дебагира. Ајде да се соочиме со тоа - грешки се случуваат постојано. Го знаете тоа чувство кога ви остануваат уште 10 минути и не можете да ја пронајдете проклетата грешка? Секако дека правиш. За да ја избегнете оваа ситуација, напишете читлив код. Откако ќе започнете да го дебагирате, кодот ќе изгледа природно и лесно разбирливо.

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

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

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

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

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

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

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

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

Не можете да ги игнорирате чекорите на патеката за учење. Ако ги игнорирате, ќе останете со празнини во знаењето. Со текот на времето тие само ќе се влошат.

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

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

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

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

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

Откако ќе ги завршите овие 250 проблеми од SPOJ, ќе имате основно разбирање за основните теми на спортското програмирање. Со длабоко разбирање на логиката зад основните алгоритми, алгоритмите на високо ниво ќе изгледаат помалку сложени. На овој начин можете да го искористите најдоброто од вашето знаење.

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

Еве еден вреден ресурс со многу информации. Таму ќе ги најдете најдобрите 10 алгоритми и структури на податоци за секоја тема. По 250 проблеми од СПОЈ, ќе знаете многу од оваа листа. Но, ќе налетате и на многу работи за кои досега не сте слушнале. Затоа почнете да ги проучувате овие теми во растечки редослед.

Ако не го зајакнете своето знаење откако ќе научите нешто ново, брзо ќе заборавите на сè.
Ви препорачувам откако ќе научите нов алгоритам, да го користите во пракса. Одработете го преку 2-3 задачи. Побарајте ја ознаката за алгоритам во SPOJ. Таму ќе најдете проблеми за кои треба да се реши овој алгоритам. Најпрво разгледајте ги овие прашања.

Научете го динамичното програмирање затоа што ќе ве доведе до победа
Од мое искуство, секое натпреварување има барем еден проблем динамично програмирање. Многу луѓе добиваат главоболка кога ќе ја слушнат фразата „динамично програмирање“ бидејќи воопшто не ја разбираат.

И ова е добро. Затоа што ако разбирате динамично програмирање, тогаш ќе победите.

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

Додека учите нови концепти, проверете Упатства за TopCoder. Тие се многу детални и разбирливи. Благодарение на нив успеав да разберам бинарни индексирани дрвја.

Работете напорно

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

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

Секој ден за овие 8 месеци вежбав по 5 часа.

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

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

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

Дали знаевте дека кога спиете, вашиот мозок ги дефрагментира информациите собрани тој ден? Се чини дека тој ги редеше книгите по азбучен ред на полица за книги. Во суштина, вашиот мозок размислува за различните проблеми со кои се соочувате.

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

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

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

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

Овој краток пасус не е поврзан со спортско програмирање. Ако сте во дваесеттите и се прашувате како го гледам светот, можеби ќе сакате да проверите мојот видео блог на YouTube. Зборувам за светот, животот и компјутерските науки во него.

Работете паметно

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

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

Како да се победи одложувањето

Поставете си цели. Секогаш ќе најдете интересни проблеми од кои можете да научите нешто ново (проверете ги ресурсите што ги споменав погоре). Но, овие проблеми треба да се решат, а не само да се читаат.

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

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

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

Земете свој хартиен календар. Не креирајте друга листа со задачи на телефонот што ќе ја заборавите утре.

Како ефикасно да се дебагира

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

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

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

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

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

За авторот

Како освоив 3 од 4 златни медали на Олимпијадата по компјутери
Андреј Маргелоиу е страствен програмер со интерес за претприемништво, стартапи и отворено. Можете да го контактирате на LinkedIn.

Превод: Дијана Шеремјева

Извор: www.habr.com

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