Hoe ek 3 uit 4 goue medaljes by die Rekenaar Olimpiade gewen het

Hoe ek 3 uit 4 goue medaljes by die Rekenaar Olimpiade gewen het

Ek was besig om voor te berei vir die Google HashCode Wêreldkampioenskap Finale 2017. Dit is die grootste kompetisie met algoritmiese probleme wat deur Google georganiseer is.

Ek het C++ van voor af in graad negende begin leer. Ek het niks geweet van programmering, algoritmes of datastrukture nie. Op 'n stadium het ek my eerste reël kode geskryf. Sewe maande later het die programmeringskompetisie op die horison gedompel. Ek wou sien hoe goed my styl van leerprogrammering gewerk het. Dit was die perfekte geleentheid.

Ná twee dae se kompetisie het die uitslae gekom: Ek het die goue medalje gewen.

Ek was geskok. Ek was voor mededingers met 5 jaar ondervinding. Ek het geweet ek het hard gewerk, maar hierdie prestasie het al my verwagtinge oortref. Ek het besef dat sportprogrammering my onderwerp is en het halsoorkop daarin ingeduik.

Ek weet wat my tot sukses gelei het en ek wil dit met jou deel.

Hoe ek 3 uit 4 goue medaljes by die Rekenaar Olimpiade gewen het

Die artikel is vertaal met die ondersteuning van EDISON Software, wat sorg vir die gesondheid van programmeerders en hul ontbytEn ontwikkel pasgemaakte sagteware.

Watter programmeertaal om te kies

  • C++ - beveel sterk aan! Hy is baie vinnig. Implementering van algoritmes neem min tyd as gevolg van STL. C++ word in alle kompetisies aanvaar. Ek het my eerste reël kode in C++ geskryf.
  • C - Leer C++ as gevolg van die STL. As jy C ken, kan jy ook in C++ programmeer.
  • Java is 'n stadige programmeertaal. Dit het 'n Groot Heelgetal-klas, maar dit sal jou nie veel help nie. As 'n kompetisie 'n tydsbeperking het, sal jy dit sekerlik met Java oorskry. Java word nie by alle kompetisies aanvaar nie.

Waar kan jy oefen

Ek beveel aan Sphere Online Judge (SPOJ). Dit is 'n doeltreffende hulpbron wat kwantiteit en kwaliteit betref. Redigeerders en oplossings is aanlyn beskikbaar as jy vashaak in die proses om probleme op te los. Benewens hierdie webwerf beveel ek aan SPOJ Toolkit и probleemklassifiseerder vir SPOJ.pl.

Eerstens moet jy jou kennis van die basiese beginsels slyp

Sodra jy gewoond raak aan die sintaksis van die taal, is daar 'n paar probleme om te oorkom. Begin met eenvoudige probleme wat oefening verg. Op hierdie stadium is die belangrikste ding om jou programmeringstyl te bepaal. Miskien hou jy daarvan om kode met baie witspasie te skryf, dalk nie. Jy plaas dalk die hakies op dieselfde lyn as die "as", of jy kan dit op aparte lyne plaas.

Jy moet jou programmeringstyl vind, want dit is JOU styl.

Wanneer jy daarna soek, onthou twee basiese beginsels:

  • Jou kode moet maklik wees om te implementeer. Jy moet gemaklik voel om die oplossing waarmee jy vorendag kom, te implementeer. Hoekom? Want tydens 'n kompetisie is die laaste ding wat jy wil hê om in jou kode te verdwaal. Dit is altyd beter om 'n ekstra 5 minute te spandeer om te dink oor hoe om die implementering van die kode te vereenvoudig as om 10 minute te spandeer om dit uit te vind.
  • Jou kode moet maklik wees om te lees. Wanneer kode maklik leesbaar is, is dit maklik om te ontfout. Kom ons erken dit - foute gebeur heeltyd. Jy ken daardie gevoel wanneer jy 10 minute oor het en jy kan nie die verdomde fout vind nie? Natuurlik kan jy. Om hierdie situasie te vermy, skryf leesbare kode. Sodra jy dit begin ontfout, sal die kode natuurlik lyk en maklik om te verstaan.

Hier is 'n voorbeeld van my programmering styl.

Hoe om jou ontwikkelingsvaardighede te verbeter

Oefen, oefen en nog oefening. Ek beveel aan dat jy deur die eerste 250 mees oplosbare probleme werk SPOJ. Los hulle in volgorde op. Spandeer ten minste 'n uur om te dink oor die oplossing vir elkeen van hulle.

Moenie sê: "Hierdie probleem is te moeilik vir my nie, ek sal probeer om die volgende een op te los." Dit is hoe verloorders dink.

Neem 'n stuk papier en 'n potlood. Dink daaroor. Miskien kan jy 'n oplossing vind, miskien nie. Op 'n minimum sal jy algoritmiese denke ontwikkel. As jy nie binne 'n uur met 'n oplossing vorendag kan kom nie, soek 'n klaargemaakte oplossing op die forum of in artikels.

Wat sal jy met hierdie benadering bereik? Leer om jou idees vinnig te implementeer deur kode te gebruik. En bestudeer klassieke probleme en algoritmes.

Tweedens moet jy algoritmes en datastrukture bemeester

Volg 'n hiërargiese benadering. Het jy begin hardloop sonder om te weet hoe om te loop? Geen. Kan jy 'n wolkekrabber bou sonder 'n stewige fondament? Nie alweer nie.

Jy kan nie die stappe langs die leerpad ignoreer nie. As jy hulle ignoreer, sal jy met kennisgapings gelaat word. Met verloop van tyd sal hulle net erger word.

Begin met fundamentele algoritmes en datastrukture

Dit is moeilik om te begin. Miskien omdat jy nie weet wat om eerste te studeer nie. Dis hoekom Ek het 'n videokursus "Algorithms and Data Structures" geskep. Toe ek hierdie kursus geskep het, het ek dit gebaseer op hoe ek graag onderrig wil word. Die reaksie was ongelooflik! Meer as 3000 100 studente uit meer as XNUMX lande het in die eerste maand vir die kursus ingeskryf.

As jy daaraan werk om maklike probleme op te los, sal jy nooit verbeter nie.

Die doeltreffendste manier om te verstaan ​​wat jy nie weet nie, is om dit in die praktyk te ervaar. Dis hoe ek geleer het. Ek het baie nuwe tegnieke geleer waarvan ek nog nooit vantevore gehoor het nie deur 'n uitdagende taak te kies.

Elke derde probleem waaraan jy werk behoort jou iets nuuts te leer. Wees meer versigtig wanneer jy probleme kies. Kies moeiliker probleme!

Sodra jy hierdie 250 probleme van SPOJ voltooi het, sal jy 'n basiese begrip hê van die kernonderwerpe van sportprogrammering. Met 'n diep begrip van die logika agter basiese algoritmes, sal hoëvlak-algoritmes minder kompleks lyk. Op hierdie manier kan jy die meeste van jou kennis maak.

Delf dieper in elk van die hooftemas

Hier is 'n waardevolle hulpbron met baie inligting. Daar sal jy die top 10 algoritmes en datastrukture vir elke onderwerp vind. Na 250 probleme van SPOJ, sal jy baie van hierdie lys weet. Maar jy sal ook op baie dinge struikel waarvan jy nog nooit vantevore gehoor het nie. Begin dus om hierdie onderwerpe in stygende volgorde te bestudeer.

As jy nie jou kennis versterk nadat jy iets nuuts geleer het nie, sal jy vinnig alles vergeet.
Ek beveel aan dat nadat jy 'n nuwe algoritme geleer het, dit in die praktyk gebruik. Werk dit deur 2-3 take. Soek die algoritme-etiket in SPOJ. Daar sal jy probleme vind wat hierdie algoritme nodig het om op te los. Pak eers hierdie kwessies aan.

Bemeester dinamiese programmering want dit sal jou na oorwinning lei
Uit my ervaring het elke kompetisie ten minste een probleem dinamiese programmering. Baie mense kry hoofpyn wanneer hulle die frase “dinamiese programmering” hoor omdat hulle dit glad nie verstaan ​​nie.

En dit is goed. Want as jy dinamiese programmering verstaan, dan sal jy wen.

Ek hou van dinamiese programmering, dit is my gunsteling onderwerp. Die geheim van dinamiese programmering is om wêreldwyd optimale keuses te maak, nie net plaaslike nie. U moet die probleem in eenvoudiger subprobleme opdeel. Los elkeen van hierdie subprobleme slegs een keer op. Skep dan 'n oplossing wat die opgeloste subprobleme kombineer. Gulsige algoritme - die teenoorgestelde van dinamiese programmering. Dit verg plaaslik optimale keuses by elke stap. En 'n plaaslik optimale keuse kan lei tot 'n slegte globale oplossing.

Terwyl jy nuwe konsepte leer, kyk TopCoder-tutoriale. Hulle is baie gedetailleerd en verstaanbaar. Danksy hulle kon ek verstaan binêre geïndekseer bome.

Werk hard

Het jy al ooit gehoor van atlete wat die Olimpiese Spele wen sonder jare se oefening? Ek, nie.

Elke jaar het voorbereidings vir die Rekenaarolimpiade in September begin en in April geëindig.

Elke dag vir hierdie 8 maande het ek vir 5 ure geoefen.

En ja, ek het hierdie 5 uur net spandeer om algoritmiese probleme op te los. Ek onthou die dae toe ek vir 8 en selfs 10 uur geoefen het. Hoekom? Omdat ek daarvan gehou het. Elke dag wanneer ek van die skool af terugkom, het ek reguit slaapkamer toe gegaan, by die rekenaar gaan sit en 'n nuwe probleem begin ontleed. Of ek was besig om 'n nuwe algoritme te leer wat ek moes ken om hierdie probleem op te los.

As jy wil wen, moet jy dieselfde doen. Kies 'n probleem en hou daarby. Dink daaraan terwyl jy na die supermark stap of terwyl jy bestuur.

Hoe ek 3 uit 4 goue medaljes by die Rekenaar Olimpiade gewen het

Het jy geweet dat wanneer jy slaap, jou brein die inligting wat daardie dag ingesamel is, defragmenteer? Dit lyk of hy boeke in alfabetiese volgorde op 'n boekrak stapel. In wese dink jou brein oor die verskillende probleme wat jy in die gesig staar.

Dit kan vaardig gebruik word. Voordat jy gaan slaap, lees 'n moeilike probleem en onthou wat dit verg om dit op te los. Op hierdie stadium hoef jy nie die oplossing self te soek nie. Gaan bed toe. Jou brein sal hierdie probleem begin verwerk. Wanneer jy wakker word, sal jy verbaas wees om te besef dat jy die oplossing gevind het terwyl jy geslaap het.

Probeer dit self. Dit is soos magie.

Ek het 'n videoblog geskep

Hoe ek 3 uit 4 goue medaljes by die Rekenaar Olimpiade gewen het

Hierdie kort paragraaf hou nie verband met sportprogrammering nie. As jy in jou twintigs is en wonder hoe ek die wêreld sien, wil jy dalk gaan kyk my videoblog op Youtube. Ek praat oor die wêreld, lewe en rekenaarwetenskap daarin.

Werk slim

Dit is die geheim van sukses. Jy het doelwitte nodig.

Ons is mense en ons hou daarvan uitstel. Ons wil altyd uitstel wat nou gedoen moet word. Om Netflix te kyk is altyd lekkerder as om dinamiese programmeringsprobleme te hanteer. Jy weet dit en jy moet dit regmaak.

Hoe om uitstel te klop

Stel vir jouself doelwitte. Jy sal altyd interessante probleme vind waaruit jy iets nuuts kan leer (kyk na die hulpbronne wat ek hierbo genoem het). Maar hierdie probleme moet opgelos word, nie net oor lees nie.

So hier is hoe ek uitstel oorkom het. Ek het 'n papierkalender begin en elke dag gevul met probleme wat ek wou oplos. Ek het altyd probleme twee dae voor die tyd ingevul. Ek het dus geweet hoe om my tyd in die volgende dae te bestuur.

Hoe ek 3 uit 4 goue medaljes by die Rekenaar Olimpiade gewen het

So ek was altyd gemotiveerd. Ek moes 'n paar probleme oplos en nuwes vind om die volgende dae op die kalender te vul. Om opgeloste probleme af te steek voel wonderlik. Ek weet jy hou ook daarvan.

Kry jou eie papierkalender. Moenie nog 'n doenlys op jou foon skep waarvan jy môre sal vergeet nie.

Hoe om effektief te ontfout

Wil jy 'n professionele persoon word? Indien wel, dan moet jy dit in jou gedagtes ontfout.
Dit is verreweg die mees doeltreffende ontfoutingstegniek wat ek ken, want dit vereis glad nie 'n ontfouter nie. Jou brein ondersoek verskeie kodevertakkings gelyktydig en gee jou 'n baie breër oorsig van die kode in vergelyking met klassieke ontfouter.

Jy kan jouself vergelyk met 'n grootmeester wat skaak speel en dink 3 skuiwe vooruit.

Ek gebruik hierdie tegniek uitsluitlik as my aanvanklike verdedigingslinie. Dan gebruik ek 'n regte debugger.

Om te leer hoe om in jou kop te ontfout, moet jy oefen. Wanneer jy 'n oplossing vir 'n probleem bevestig en 'n "verkeerde antwoord" kry, moenie reguit na die ontfouterknoppie gaan nie. Lees weer die kode en dink: "Wat gebeur in hierdie reël?", "Hoe beïnvloed die "as" hier die program?", "Wanneer ons die lus verlaat, wat is die waarde van die iterator?"

Op hierdie manier dink jy vir jouself. Met verloop van tyd sal jy leer om kode te skryf en dit dadelik te ontfout.

Oor die skrywer

Hoe ek 3 uit 4 goue medaljes by die Rekenaar Olimpiade gewen het
Andrei Margeloiu is 'n ywerige programmeerder met 'n belangstelling in entrepreneurskap, beginners en die buitelewe. Jy kan hom kontak op LinkedIn.

Vertaling: Diana Sheremyeva

Bron: will.com

Voeg 'n opmerking