Как спечелих 3 от 4 златни медала на компютърната олимпиада

Как спечелих 3 от 4 златни медала на компютърната олимпиада

Подготвях се за Google HashCode World Championship Finals 2017. Това е най-голямото състезание с алгоритмични проблеми, организирано от Google.

Започнах да уча C++ от нулата в девети клас. Не знаех нищо за програмиране, алгоритми или структури от данни. В един момент написах първия си ред код. Седем месеца по-късно състезанието по програмиране се задава на хоризонта. Исках да видя колко добре работи стилът ми на изучаване на програмиране. Това беше идеалната възможност.

След два дни на състезание резултатите дойдоха: спечелих златния медал.

Бях шокиран. Изпреварвах състезатели с 5 години опит. Знаех, че съм работил много, но това постижение надмина всичките ми очаквания. Разбрах, че спортното програмиране е моята тема и се впуснах в него с глава.

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

Как спечелих 3 от 4 златни медала на компютърната олимпиада

Статията е преведена с подкрепата на EDISON Software, която се грижи за здравето на програмистите и тяхната закускаИ разработва персонализиран софтуер.

Кой език за програмиране да изберете

  • C++ - Горещо препоръчвам! Той е много бърз. Внедряването на алгоритми отнема малко време поради STL. C++ се приема във всички състезания. Написах първия си ред код на C++.
  • C - Научете C++ заради STL. Ако знаете C, можете да програмирате и на C++.
  • Java е бавен език за програмиране. Има клас Big Integer, но няма да ви помогне много. Ако състезанието има ограничение във времето, с Java със сигурност ще го надхвърлите. Java не се приема на всички състезания.

Къде можете да практикувате

Аз препоръчвам Sphere Online Judge (SPOJ). Това е ефективен ресурс по отношение на количество и качество. Редакторите и решенията са достъпни онлайн, ако заседнете в процеса на решаване на проблеми. В допълнение към този сайт препоръчвам SPOJ Toolkit и класификатор на проблеми за SPOJ.pl.

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

След като свикнете със синтаксиса на езика, има някои проблеми за преодоляване. Започнете с прости проблеми, които изискват практика. На този етап основното е да определите стила си на програмиране. Може би обичате да пишете код с много интервали, може би не. Може да поставяте скобите на същия ред като „ако“ или може да ги поставяте на отделни редове.

Трябва да намерите вашия стил на програмиране, защото това е ВАШИЯТ стил.

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

  • Вашият код трябва да е лесен за внедряване. Трябва да се чувствате комфортно да внедрите решението, което измислите. Защо? Защото по време на състезание последното нещо, което искате, е да се изгубите в кода си. Винаги е по-добре да прекарате допълнителни 5 минути в мислене как да опростите внедряването на кода, отколкото да прекарате 10 минути в опити да го разберете.
  • Вашият код трябва да е лесен за четене. Когато кодът е лесен за четене, той е лесен за отстраняване на грешки. Нека си признаем – бъгове се случват през цялото време. Знаете ли онова чувство, когато ви остават 10 минути и не можете да намерите проклетата грешка? Разбира се, че го правиш. За да избегнете тази ситуация, напишете четлив код. След като започнете да отстранявате грешки, кодът ще изглежда естествен и лесен за разбиране.

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

Как да подобрите уменията си за развитие

Практика, практика и още практика. Препоръчвам ви да преминете през първите 250 най-разрешими задачи SPOJ. Решете ги по ред. Прекарайте поне час в обмисляне на решението на всеки от тях.

Не казвайте: "Този проблем е твърде труден за мен, ще се опитам да реша следващия." Ето как мислят губещите.

Вземете лист хартия и молив. Помисли за това. Може би можете да намерите решение, може би не. Като минимум ще развиете алгоритмично мислене. Ако не можете да излезете с решение в рамките на един час, потърсете готово решение във форума или в статии.

Какво ще постигнете с този подход? Научете се бързо да прилагате идеите си с помощта на код. И изучавайте класически проблеми и алгоритми.

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

Следвайте йерархичен подход. Започнахте ли да бягате, без да знаете как да ходите? Не. Можете ли да построите небостъргач без солидна основа? Не отново.

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

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

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

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

Най-ефективният начин да разберете това, което не знаете, е да го изпитате на практика. Така се научих. Научих много нови техники, за които никога преди не бях чувал, като избрах предизвикателна задача.

Всеки трети проблем, върху който работите, трябва да ви научи на нещо ново. Бъдете по-внимателни при избора на проблеми. Изберете по-трудни задачи!

След като завършите тези 250 задачи от SPOJ, ще имате основно разбиране на основните теми на спортното програмиране. С дълбоко разбиране на логиката зад основните алгоритми, алгоритмите на високо ниво ще изглеждат по-малко сложни. По този начин можете да се възползвате максимално от знанията си.

Разровете се по-дълбоко във всяка от основните теми

Ето един ценен ресурс с много информация. Там ще намерите 10-те най-добри алгоритми и структури от данни за всяка тема. След 250 проблема от SPOJ ще знаете много от този списък. Но също така ще се натъкнете на много неща, за които никога преди не сте чували. Така че започнете да изучавате тези теми във възходящ ред.

Ако не затвърдите знанията си, след като научите нещо ново, бързо ще забравите всичко.
Препоръчвам, след като научите нов алгоритъм, да го използвате на практика. Решете 2-3 задачи. Потърсете маркера на алгоритъма в SPOJ. Там ще намерите проблеми, които се нуждаят от този алгоритъм за решаване. Първо решете тези проблеми.

Овладейте динамичното програмиране, защото то ще ви отведе до победа
От моя опит всяко състезание има поне един проблем динамично програмиране. Много хора получават главоболие, когато чуят израза „динамично програмиране“, защото изобщо не го разбират.

И това е добре. Защото ако разбирате от динамично програмиране, тогава ще спечелите.

Харесвам динамичното програмиране, това е любимата ми тема. Тайната на динамичното програмиране е да се правят глобално оптимални избори, а не само локални. Трябва да разделите проблема на по-прости подпроблеми. Решете всяка от тези подзадачи само веднъж. След това създайте решение, което комбинира решените подпроблеми. Алчен алгоритъм - обратното на динамичното програмиране. Изисква се да се правят локално оптимални избори на всяка стъпка. А локално оптималният избор може да доведе до лошо глобално решение.

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

Работи здраво

Чували ли сте някога за спортисти, които печелят олимпийски игри без години практика? Аз не.

Всяка година подготовката за компютърната олимпиада започва през септември и завършва през април.

Всеки ден през тези 8 месеца тренирах по 5 часа.

И да, прекарах тези 5 часа само в решаване на алгоритмични задачи. Спомням си дните, когато тренирах по 8 и дори по 10 часа. Защо? Защото ми хареса. Всеки ден, когато се прибирах от училище, отивах направо в спалнята, сядах пред компютъра и започвах да анализирам нов проблем. Или учех нов алгоритъм, който трябваше да знам, за да реша този проблем.

Ако искате да спечелите, трябва да направите същото. Изберете проблем и се придържайте към него. Помислете за това, докато се разхождате до супермаркета или докато шофирате.

Как спечелих 3 от 4 златни медала на компютърната олимпиада

Знаете ли, че когато спите, мозъкът ви дефрагментира информацията, събрана през този ден? Изглежда, че подрежда книги по азбучен ред на лавица. По същество мозъкът ви мисли за различните проблеми, пред които сте изправени.

Това може да се използва умело. Преди да си легнете, прочетете трудна задача и си спомнете какво е необходимо, за да я решите. На този етап не е необходимо да търсите самото решение. Лягай си. Вашият мозък ще започне да обработва този проблем. Когато се събудите, ще бъдете изненадани да разберете, че сте намерили решението, докато сте спали.

Опитайте сами. Това е като магия.

Създадох видео блог

Как спечелих 3 от 4 златни медала на компютърната олимпиада

Този кратък параграф не е свързан със спортното програмиране. Ако сте на двадесет и се чудите как виждам света, може да искате да проверите моя видео блог в Youtube. Говоря за света, живота и компютърните науки в него.

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

Това е тайната на успеха. Имате нужда от цели.

Хора сме и ни харесва отлагам. Винаги искаме да отложим това, което трябва да се направи точно сега. Гледането на Netflix винаги е по-приятно от справянето с динамични проблеми с програмирането. Знаете това и трябва да го поправите.

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

Поставете си цели. Винаги ще намерите интересни проблеми, от които можете да научите нещо ново (вижте ресурсите, които споменах по-горе). Но тези проблеми трябва да се решават, а не само да се чете.

И така, ето как преодолях отлагането. Започнах хартиен календар и изпълних всеки ден с проблеми, които исках да реша. Винаги попълвах задачи два дни предварително. Така че знаех как да управлявам времето си през следващите дни.

Как спечелих 3 от 4 златни медала на компютърната олимпиада

Така че винаги съм бил мотивиран. Трябваше да реша някои проблеми и да намеря нови, които да запълня следващите дни в календара. Зачеркването на решени проблеми се чувства страхотно. Знам, че и на теб ти харесва.

Вземете свой собствен хартиен календар. Не създавайте нов списък със задачи на телефона си, за които ще забравите утре.

Как да отстранявате грешки ефективно

Искате ли да станете професионалист? Ако отговорът е да, тогава трябва да го „отстраните в ума си“.
Това е най-ефективната техника за отстраняване на грешки, която познавам, защото изобщо не изисква дебъгер. Вашият мозък изследва множество разклонения на код наведнъж и ви дава много по-широк преглед на кода в сравнение с класически дебъгер.

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

Използвам тази техника единствено като начална линия на защита. След това използвам истински дебъгер.

За да научите как да отстранявате грешки в главата си, трябва да практикувате. Когато потвърдите решение на проблем и получите „грешен отговор“, не отивайте направо към бутона за отстраняване на грешки. Прочетете отново кода и помислете: „Какво се случва в този ред?“, „Как „ако“ тук влияе на програмата?“, „Когато излезем от цикъла, каква е стойността на итератора?“

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

За автора

Как спечелих 3 от 4 златни медала на компютърната олимпиада
Андрей Маргелою е запален програмист с интерес към предприемачеството, стартиращите фирми и природата. Можете да се свържете с него в LinkedIn.

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

Източник: www.habr.com

Добавяне на нов коментар