Kā es ieguvu 3 no 4 zelta medaļām skaitļoÅ”anas olimpiādē

Kā es ieguvu 3 no 4 zelta medaļām skaitļoÅ”anas olimpiādē

Gatavojos Google HashCode World Championship Finals 2017. Šīs ir lielākās Google organizētās sacensības ar algoritmiskām problēmām.

Es sāku mācÄ«ties C++ no nulles devÄ«tajā klasē. Es neko nezināju par programmÄ“Å”anu, algoritmiem vai datu struktÅ«rām. Kādā brÄ«dÄ« es uzrakstÄ«ju savu pirmo koda rindiņu. Septiņus mēneÅ”us vēlāk pie apvārŔņa parādÄ«jās programmÄ“Å”anas konkurss. Es gribēju redzēt, cik labi darbojas mans programmÄ“Å”anas stils. Tā bija ideāla iespēja.

Pēc divu dienu sacensībām nāca rezultāti: izcīnīju zelta medaļu.

ES biju Å”okēts. Es biju priekŔā konkurentiem ar 5 gadu pieredzi. Zināju, ka esmu smagi strādājis, taču Å”is sasniegums pārsniedza visas manas cerÄ«bas. Es sapratu, ka sporta programmÄ“Å”ana ir mana tēma, un iegrimu tajā.

Es zinu, kas mani noveda pie panākumiem, un vēlos tajā dalīties ar jums.

Kā es ieguvu 3 no 4 zelta medaļām skaitļoÅ”anas olimpiādē

Raksts tika tulkots ar EDISON Software atbalstu, kas rūpējas par programmētāju veselību un viņu brokastīmun izstrādā pielāgotu programmatūru.

Kuru programmÄ“Å”anas valodu izvēlēties

  • C++ ā€” ļoti iesaku! ViņŔ ir ļoti ātrs. STL dēļ algoritmu ievieÅ”ana aizņem maz laika. C++ tiek pieņemts visos konkursos. Es uzrakstÄ«ju savu pirmo koda rindiņu C++ valodā.
  • C ā€” apgÅ«stiet C++ STL dēļ. Ja zini C, vari programmēt arÄ« C++ valodā.
  • Java ir lēna programmÄ“Å”anas valoda. Tam ir Big Integer klase, taču tas jums daudz nepalÄ«dzēs. Ja konkursam ir laika ierobežojums, ar Java jÅ«s to noteikti pārsniegsit. Java netiek pieņemta visos konkursos.

Kur var praktizēt

Iesaku Sfēras tieÅ”saistes tiesnesis (SPOJ). Tas ir efektÄ«vs resurss kvantitātes un kvalitātes ziņā. Redaktori un risinājumi ir pieejami tieÅ”saistē, ja esat iestrēdzis problēmu risināŔanas procesā. Papildus Å”ai vietnei es iesaku SPOJ rÄ«kkopa Šø problēmu klasifikators vietnei SPOJ.pl.

Pirmkārt, jums ir jāuzlabo savas zināŔanas par pamatiem

Kad esat pieradis pie valodas sintakses, jums ir jāpārvar dažas problēmas. Sāciet ar vienkārŔām problēmām, kurām nepiecieÅ”ama prakse. Å ajā posmā galvenais ir noteikt savu programmÄ“Å”anas stilu. VarbÅ«t jums patÄ«k rakstÄ«t kodu ar lielu atstarpi, varbÅ«t jums nepatÄ«k. JÅ«s, iespējams, ievietojat iekavas tajā paŔā rindā ar ā€œjaā€, vai arÄ« ievietojat tās atseviŔķās rindās.

Jums ir jāatrod savs programmÄ“Å”anas stils, jo tas ir TAVS stils.

Meklējot to, atcerieties divus pamatprincipus:

  • JÅ«su kodam jābÅ«t viegli ievieÅ”amam. Jums vajadzētu justies ērti, Ä«stenojot piedāvāto risinājumu. Kāpēc? Jo sacensÄ«bu laikā pēdējais, ko vēlaties, ir pazust savā kodā. Vienmēr ir labāk pavadÄ«t papildu 5 minÅ«tes, domājot par to, kā vienkārÅ”ot koda ievieÅ”anu, nekā pavadÄ«t 10 minÅ«tes, mēģinot to izdomāt.
  • JÅ«su kodam jābÅ«t viegli lasāmam. Ja kodu ir viegli lasÄ«t, to ir viegli atkļūdot. AtzÄ«simies ā€” kļūdas notiek visu laiku. JÅ«s zināt to sajÅ«tu, kad jums ir atlikuÅ”as 10 minÅ«tes un jÅ«s nevarat atrast sasodÄ«to kļūdu? Protams, tu dari. Lai izvairÄ«tos no Ŕādas situācijas, ierakstiet salasāmu kodu. Kad sāksit to atkļūdot, kods ŔķitÄ«s dabisks un viegli saprotams.

Å eit ir mans piemērs programmÄ“Å”anas stils.

Kā uzlabot savas attīstības prasmes

Prakse, prakse un vēl prakse. Es iesaku jums izskatīt pirmās 250 visvairāk atrisināmās problēmas SPOJ. Atrisiniet tos secībā. Pavadiet vismaz stundu, domājot par risinājumu katram no tiem.

Nesakiet: "Å Ä« problēma man ir pārāk grÅ«ta, es mēģināŔu atrisināt nākamo." Tā domā zaudētāji.

Paņemiet papÄ«ra lapu un zÄ«muli. Padomā par to. VarbÅ«t jÅ«s varat atrast risinājumu, varbÅ«t nē. JÅ«s attÄ«stÄ«sit vismaz algoritmisko domāŔanu. Ja nevarat atrast risinājumu stundas laikā, meklējiet gatavu risinājumu forumā vai rakstos.

Ko jÅ«s sasniegsiet ar Å”o pieeju? Iemācieties ātri Ä«stenot savas idejas, izmantojot kodu. Un studējiet klasiskās problēmas un algoritmus.

Otrkārt, jums ir jāapgūst algoritmi un datu struktūras

Ievērojiet hierarhisku pieeju. Vai sākāt skriet, nezinot, kā staigāt? Nē. Vai jūs varat uzbūvēt debesskrāpi bez stabila pamata? Ne atkal.

JÅ«s nevarat ignorēt soļus mācÄ«bu ceļā. Ja jÅ«s tos ignorēsit, jums paliks zināŔanu nepilnÄ«bas. Laika gaitā tie tikai pasliktināsies.

Sāciet ar pamata algoritmiem un datu struktūrām

Ir grÅ«ti sākt. VarbÅ«t tāpēc, ka nezināt, ko vispirms studēt. Tāpēc Izveidoju video kursu ā€œAlgoritmi un datu struktÅ«rasā€. Veidojot Å”o kursu, ņēmu vērā to, kā es vēlētos, lai mani māca. Reakcija bija neticama! Pirmajā mēnesÄ« kursiem reÄ£istrējās vairāk nekā 3000 studentu no vairāk nekā 100 valstÄ«m.

Ja strādājat pie vieglu problēmu risināŔanas, jÅ«s nekad neuzlabosit.

VisefektÄ«vākais veids, kā saprast to, ko nezināt, ir piedzÄ«vot to praksē. Tā es iemācÄ«jos. Izvēloties izaicinoÅ”u uzdevumu, es apguvu daudzas jaunas tehnikas, par kurām iepriekÅ” nebiju dzirdējis.

Katrai treÅ”ajai problēmai, pie kuras strādājat, vajadzētu iemācÄ«t jums kaut ko jaunu. Esiet uzmanÄ«gāks, izvēloties problēmas. Izvēlieties grÅ«tākas problēmas!

Kad bÅ«siet aizpildÄ«jis Ŕīs 250 SPOJ problēmas, jums bÅ«s pamata izpratne par sporta programmÄ“Å”anas galvenajām tēmām. Ar dziļu izpratni par pamatalgoritmu loÄ£iku augsta lÄ«meņa algoritmi ŔķitÄ«s mazāk sarežģīti. Tādā veidā jÅ«s varat maksimāli izmantot savas zināŔanas.

Iedziļinieties katrā no galvenajām tēmām

Å eit ir vērtÄ«gs resurss ar daudz informācijas. Tur jÅ«s atradÄ«siet 10 populārākos algoritmus un datu struktÅ«ras katrai tēmai. Pēc 250 problēmām no SPOJ jÅ«s daudz uzzināsit no Ŕī saraksta. Bet jÅ«s arÄ« paklupsiet uz daudzām lietām, par kurām jÅ«s nekad iepriekÅ” neesat dzirdējis. Tāpēc sāciet pētÄ«t Ŕīs tēmas augoŔā secÄ«bā.

Ja pēc kaut kā jauna apguves nenostiprināsi savas zināŔanas, ātri visu aizmirsÄ«si.
Iesaku pēc jauna algoritma apguves to izmantot praksē. Veiciet 2-3 uzdevumus. Meklējiet algoritma tagu vietnē SPOJ. Tur jÅ«s atradÄ«siet problēmas, kuru risināŔanai nepiecieÅ”ams Å”is algoritms. Vispirms risiniet Ŕīs problēmas.

Izprotiet dinamisko programmÄ“Å”anu, jo tā jÅ«s novedÄ«s pie uzvaras
Pēc manas pieredzes, katrā konkursā ir vismaz viena problēma dinamiskā programmÄ“Å”ana. Daudziem cilvēkiem rodas galvassāpes, dzirdot frāzi ā€œdinamiskā programmÄ“Å”anaā€, jo viņi to nemaz nesaprot.

Un tas ir labi. Jo, ja tu saproti dinamisko programmÄ“Å”anu, tad uzvarēsi.

Man patÄ«k dinamiskā programmÄ“Å”ana, tā ir mana mīļākā tēma. Dinamiskās programmÄ“Å”anas noslēpums ir izdarÄ«t globāli optimālas izvēles, nevis tikai lokālas. Problēma ir jāsadala vienkārŔākos apakÅ”problēmās. Atrisiniet katru no Ŕīm apakÅ”problēmām tikai vienu reizi. Pēc tam izveidojiet risinājumu, kas apvieno atrisinātās apakÅ”problēmas. MantkārÄ«gs algoritms - pretstats dinamiskajai programmÄ“Å”anai. Tas prasa lokāli optimālas izvēles katrā posmā. Un lokāli optimāla izvēle var novest pie slikta globāla risinājuma.

Apgūstot jaunus jēdzienus, pārbaudiet TopCoder apmācības. Tie ir ļoti detalizēti un saprotami. Pateicoties viņiem, es varēju saprast bināri indeksēti koki.

Smagi strādāt

Vai esat kādreiz dzirdējuÅ”i par sportistiem, kuri uzvar olimpiskajās spēlēs bez gadiem ilgas prakses? Es nē.

Katru gadu gatavoÅ”anās datoru olimpiādei sākās septembrÄ« un noslēdzās aprÄ«lÄ«.

Katru dienu Å”os 8 mēneÅ”us es trenējos 5 stundas.

Un jā, Ŕīs 5 stundas es pavadÄ«ju tikai algoritmisku uzdevumu risināŔanai. Atceros tos laikus, kad trenējos 8 un pat 10 stundas. Kāpēc? Jo man patika. Katru dienu, kad atgriezos mājās no skolas, es devos tieÅ”i uz guļamistabu, apsēdos pie datora un sāku analizēt jaunu problēmu. Vai arÄ« es mācÄ«jos jaunu algoritmu, kas man bija jāzina, lai atrisinātu Å”o problēmu.

Ja vēlaties uzvarēt, jums ir jādara tas pats. Izvēlieties problēmu un pieturieties pie tās. Padomājiet par to, ejot uz lielveikalu vai braucot ar automaŔīnu.

Kā es ieguvu 3 no 4 zelta medaļām skaitļoÅ”anas olimpiādē

Vai zinājāt, ka guļot jÅ«su smadzenes defragmentē tajā dienā savākto informāciju? Å Ä·iet, ka viņŔ grāmatu plauktā sakrauj grāmatas alfabēta secÄ«bā. BÅ«tÄ«bā jÅ«su smadzenes domā par dažādām problēmām, ar kurām jÅ«s saskaraties.

To var prasmÄ«gi izmantot. Pirms gulētieÅ”anas izlasiet sarežģītu problēmu un atcerieties, kas nepiecieÅ”ams, lai to atrisinātu. Å ajā posmā jums nav jāmeklē pats risinājums. Ej gulēt. JÅ«su smadzenes sāks apstrādāt Å”o problēmu. Pamostoties, jÅ«s bÅ«siet pārsteigts, saprotot, ka atradāt risinājumu, kamēr bijāt miegā.

Izmēģiniet to pats. Tas ir kā maģija.

Es izveidoju video emuāru

Kā es ieguvu 3 no 4 zelta medaļām skaitļoÅ”anas olimpiādē

Šī īsā rindkopa nav saistīta ar sporta programmām. Ja jums ir divdesmit un vēlaties uzzināt, kā es redzu pasauli, jūs varētu vēlēties pārbaudīt mans video emuārs vietnē Youtube. Es tajā runāju par pasauli, dzīvi un datorzinātnēm.

Strādājiet gudri

Tas ir veiksmes noslēpums. Jums ir vajadzīgi mērķi.

Mēs esam cilvēki un mums tas patÄ«k atlikt. Mēs vienmēr vēlamies atlikt to, kas jādara tieÅ”i tagad. Netflix skatÄ«Å”anās vienmēr ir patÄ«kamāka nekā dinamiskas programmÄ“Å”anas problēmu risināŔana. JÅ«s to zināt, un jums tas ir jāizlabo.

Kā uzveikt vilcināŔanos

Izvirziet sev mērÄ·us. JÅ«s vienmēr atradÄ«sit interesantas problēmas, no kurām varat uzzināt kaut ko jaunu (apskatiet iepriekÅ” minētos resursus). Taču Ŕīs problēmas ir jārisina, nevis tikai jālasa.

Tātad, lÅ«k, kā es pārvarēju vilcināŔanos. Es sāku papÄ«ra kalendāru un katru dienu piepildÄ«ju ar problēmām, kuras vēlējos atrisināt. Es vienmēr aizpildÄ«ju problēmas divas dienas iepriekÅ”. Tāpēc es zināju, kā pārvaldÄ«t savu laiku nākamajās dienās.

Kā es ieguvu 3 no 4 zelta medaļām skaitļoÅ”anas olimpiādē

Tāpēc es vienmēr biju motivēts. Man vajadzēja atrisināt dažas problēmas un atrast jaunas, ar kurām aizpildÄ«t nākamās dienas kalendārā. Atrisināto problēmu pārsvÄ«troÅ”ana jÅ«tas lieliski. Es zinu, ka tev arÄ« patÄ«k.

Iegūstiet savu papīra kalendāru. Neveidojiet savā tālrunī citu uzdevumu sarakstu, par kuru rīt aizmirsīsit.

Kā efektīvi atkļūdot

Vai vēlaties kļūt par profesionāli? Ja jā, jums tas ir "jāatkļūdo savā prātā".
Šī ir visefektīvākā atkļūdoŔanas tehnika, ko zinu, jo tai vispār nav nepiecieŔams atkļūdotājs. Jūsu smadzenes pārbauda vairākas koda zarus vienlaikus un sniedz jums daudz plaŔāku koda pārskatu, salīdzinot ar klasiskais atkļūdotājs.

JÅ«s varat salÄ«dzināt sevi ar lielmeistaru, kurÅ” spēlē Å”ahu un domā 3 gājienus uz priekÅ”u.

Es izmantoju Å”o paņēmienu tikai kā savu sākotnējo aizsardzÄ«bas lÄ«niju. Tad es izmantoju Ä«stu atkļūdotāju.

Lai iemācÄ«tos atkļūdot savā galvā, jums ir jātrenējas. Kad validējat problēmas risinājumu un saņemat ā€œnepareizu atbildiā€, nepārejiet tieÅ”i uz atkļūdotāja pogu. Atkārtoti izlasiet kodu un padomājiet: ā€œKas notiek Å”ajā rindā?ā€, ā€œKā ā€œjaā€ Å”eit ietekmē programmu?ā€, ā€œKad izejam no cilpas, kāda ir iteratora vērtÄ«ba?ā€

Tādā veidā jūs domājat par sevi. Laika gaitā jūs iemācīsities rakstīt kodu un atkļūdot to lidojuma laikā.

Par Autors

Kā es ieguvu 3 no 4 zelta medaļām skaitļoÅ”anas olimpiādē
Andrejs Margeloiu ir dedzÄ«gs programmētājs, kurÅ” interesējas par uzņēmējdarbÄ«bu, jaunizveidotiem uzņēmumiem un brÄ«vā dabā. JÅ«s varat sazināties ar viņu vietnē LinkedIn.

Tulkojums: Diāna Šeremjeva

Avots: www.habr.com

Pievieno komentāru