Hvordan jeg vandt 3 ud af 4 guldmedaljer ved Computing Olympiad

Hvordan jeg vandt 3 ud af 4 guldmedaljer ved Computing Olympiad

Jeg har forberedt mig til Google HashCode World Championship Final 2017. Dette er den største algoritmiske udfordringskonkurrence arrangeret af Google.

Jeg begyndte at lære C++ fra bunden i niende klasse. Jeg vidste intet om programmering, algoritmer og datastrukturer. På et tidspunkt skrev jeg min første kodelinje. Syv måneder senere dukkede en programmeringskonkurrence op i horisonten. Jeg ville gerne vide, hvor godt min stil med at lære programmering fungerede. Det var den perfekte mulighed.

Efter to dages konkurrence kom resultaterne: Jeg vandt guldmedaljen.

Jeg var chokeret. Jeg kom foran konkurrenterne med 5 års erfaring. Jeg vidste, at jeg arbejdede hårdt, men denne præstation oversteg alle mine forventninger. Jeg indså, at sportsprogrammering er mit emne og gik ind i det med mit hoved.

Jeg ved, hvad der førte mig til succes, og jeg vil gerne dele det med dig.

Hvordan jeg vandt 3 ud af 4 guldmedaljer ved Computing Olympiad

Artiklen er oversat med støtte fra EDISON Software, som tager sig af programmørernes sundhed og deres morgenmadog udvikler skræddersyet software.

Hvilket programmeringssprog at vælge

  • C++ - Kan varmt anbefales! Han er meget hurtig. Implementeringen af ​​algoritmerne tager kort tid på grund af STL. C++ accepteres i alle konkurrencer. Jeg skrev min første linje kode i C++.
  • C - lær C++ på grund af STL. Kender du C, vil du også kunne programmere i C++.
  • Java er et langsomt programmeringssprog. Den har en Big Integer-klasse, men den hjælper dig ikke meget. Hvis konkurrencen har en tidsbegrænsning, vil du med Java helt sikkert overskride den. Java accepteres ikke i alle konkurrencer.

Hvor kan du øve dig

jeg anbefaler Sphere Online Judge (SPOJ). Det er en effektiv ressource i forhold til kvantitet og kvalitet. Redaktører og løsninger er tilgængelige online, hvis du bliver hængende i fejlfindingsprocessen. Ud over dette websted, anbefaler jeg SPOJ Toolkit и problemklassificering for SPOJ.pl.

Først skal du finpudse din viden om det grundlæggende

Når du har vænnet dig til sprogets syntaks, bliver du nødt til at løse nogle problemer. Start med simple problemer, der kræver øvelse. På dette stadium er det vigtigste at bestemme din programmeringsstil. Måske kan du godt lide at skrive kode med masser af mellemrum, måske gør du ikke. Du kan sætte parenteser på samme linje som "hvis", eller du kan sætte dem på separate linjer.

Du skal finde din programmeringsstil, fordi det er DIN stil.

Når du søger efter det, skal du huske på to grundlæggende principper:

  • Din kode skal være nem at implementere. Du skal føle dig tryg ved at implementere den løsning, du kommer med. Hvorfor? For under en konkurrence er det sidste, du ønsker, at fare vild i din kode. Det er altid bedre at bruge 5 minutter ekstra på at tænke på, hvordan man forenkler implementeringen af ​​koden, end at bruge 10 minutter på at finde ud af det.
  • Din kode skal være let at læse. Når koden er let at læse, er den let at fejlfinde. Lad os se det i øjnene – fejl sker hele tiden. Kender du den følelse, når der er 10 minutter tilbage, og du ikke kan finde den forbandede fejl? Selvfølgelig gør du. For at undgå denne situation skal du skrive læselig kode. Når du begynder at fejlfinde den, vil koden føles naturlig og let at forstå.

Her er et eksempel på mig programmeringsstil.

Sådan forbedrer du dine udviklingsevner

Øv, øv og mere øv. Jeg anbefaler, at du arbejder dig igennem de første 250 mest løselige problemer på SPOJ. Løs dem i rækkefølge. Brug mindst en time på at tænke over løsningen på hver af dem.

Sig ikke: "Dette problem er for svært for mig, jeg prøver det næste." Sådan tænker tabere.

Tag et stykke papir og en blyant. Tænke. Måske kan du finde en løsning, måske ikke. Som minimum vil du udvikle algoritmisk tænkning. Hvis du ikke kan finde en løsning inden for en time, så kig efter en færdig løsning på forummet eller i artiklerne.

Hvad vil du opnå med denne tilgang? Lær, hvordan du hurtigt implementerer dine ideer med kode. Og lær klassiske problemer og algoritmer.

For det andet skal du mestre algoritmer og datastrukturer

Følg en hierarkisk tilgang. Begyndte du at løbe uden at kunne gå? Ingen. Kan du bygge en skyskraber uden et solidt fundament? Igen nej.

Du kan ikke ignorere stadierne på læringsvejen. Hvis du ignorerer dem, vil du stå tilbage med videnshuller. Som tiden går, vil de kun blive værre.

Start med grundlæggende algoritmer og datastrukturer

Det er svært at starte. Måske fordi du ikke ved, hvad du skal studere først. Derfor Jeg lavede et videokursus "Algorithms and Data Structures". Da jeg oprettede dette kursus, stolede jeg på, hvordan jeg kunne tænke mig at blive undervist. Responsen var utrolig! Over 3000 studerende fra over 100 lande tilmeldte sig kurset i den første måned.

Hvis du arbejder på at løse lette problemer, bliver du aldrig bedre.

Den mest effektive måde at finde ud af, hvad du ikke ved, er at se det i øjnene i praksis. Sådan lærte jeg. Jeg lærte mange nye teknikker, som jeg aldrig havde hørt om før ved at vælge et vanskeligt problem.

Hvert tredje problem, du arbejder med, burde lære dig noget nyt. Vær forsigtig med udvælgelsen af ​​problemer. Vælg de sværere problemer!

Når du har afsluttet disse 250 problemer fra SPOJ, vil du have en generel forståelse af hovedemnerne i sportsprogrammering. Med en dyb forståelse af logikken bag grundlæggende algoritmer, vil algoritmer på højt niveau ikke virke så komplicerede. Dermed kan du bruge din viden maksimalt.

Grav dybere ned i hvert af hovedtemaerne

Her er en værdifuld ressource med masser af information. Der finder du top 10 algoritmer og datastrukturer for hvert emne. Efter 250 problemer fra SPOJ, vil du vide meget fra denne liste. Men du vil også falde over en masse, som du aldrig har hørt om før. Så begynd at udforske disse emner i stigende rækkefølge.

Hvis du ikke styrker din viden, efter du har lært noget nyt, vil du hurtigt glemme alt.
Jeg anbefaler, at efter du har lært en ny algoritme, så sætter du den i praksis. Træn det på 2-3 opgaver. Se efter algoritme-tagget i SPOJ. Der vil du finde problemer, som denne algoritme er nødvendig for. Håndter disse problemer først.

Forstå dynamisk programmering, fordi det vil føre dig til sejr
Efter min erfaring har hver konkurrence mindst ét ​​problem dynamisk programmering. Mange mennesker får hovedpine, når de hører udtrykket "dynamisk programmering", fordi de slet ikke forstår det.

Og det her er godt. For hvis du forstår dynamisk programmering, så vinder du.

Jeg kan godt lide dynamisk programmering, det er mit yndlingsemne. Hemmeligheden ved dynamisk programmering er at træffe globalt optimale valg, ikke kun lokale. Du bør opdele problemet i enklere underopgaver. Løs hvert af disse underproblemer kun én gang. Lav derefter en løsning, der kombinerer de løste delproblemer. Grådig algoritme er det modsatte af dynamisk programmering. I den skal man træffe et lokalt optimalt valg på hvert trin. Og et lokalt optimalt valg kan føre til en dårlig global løsning.

Når du udforsker nye koncepter, så tjek ud TopCoder tutorials. De er meget detaljerede og forståelige. Takket være dem var jeg i stand til at forstå binære indekserede træer.

Arbejd hårdt

Har du nogensinde hørt om atleter, der vinder OL uden års træning? Mig ikke.

Hvert år begyndte forberedelserne til Computer Olympiad i september og sluttede i april.

Hver dag i disse 8 måneder øvede jeg i 5 timer.

Og ja, jeg brugte kun disse 5 timer på at løse algoritmiske problemer. Jeg husker de dage, hvor jeg øvede i 8 og endda 10 timer. Hvorfor? Fordi jeg kunne lide det. Hver dag, da jeg vendte hjem fra skole, gik jeg direkte ind i soveværelset, satte mig ved computeren og begyndte at løse et nyt problem. Eller lære en ny algoritme, der skulle være kendt for at løse dette problem.

Hvis du vil vinde, skal du gøre det samme. Vælg et problem og hold dig til det. Tænk over det, mens du går ned ad vejen til supermarkedet eller mens du kører.

Hvordan jeg vandt 3 ud af 4 guldmedaljer ved Computing Olympiad

Vidste du, at under søvn defragmenterer din hjerne den information, der er indsamlet den dag? Han lader til at stable bøger i alfabetisk rækkefølge på en bogreol. Grundlæggende tænker din hjerne på de forskellige problemer, du står over for.

Dette kan dygtigt bruges. Før du går i seng, læs et vanskeligt problem og husk, hvad der skal til for at løse det. På dette tidspunkt behøver du ikke lede efter selve løsningen. Gå i seng. Din hjerne vil begynde at behandle dette problem. Når du vågner, vil du blive overrasket over at indse, at du fandt løsningen, mens du sov.

Prøv det selv. Det er ligesom magi.

Jeg har lavet en vlog

Hvordan jeg vandt 3 ud af 4 guldmedaljer ved Computing Olympiad

Dette korte afsnit er ikke relateret til sportsprogrammering. Hvis du er i tyverne, og du undrer dig over, hvordan jeg ser verden, så kan du se min vlog på Youtube. Jeg taler i den om verden, livet og informatik.

Arbejd smart

Dette er hemmeligheden bag succes. Du har brug for mål.

Vi er mennesker, og vi kan lide trække tiden ud. Vi ønsker altid at udskyde det, der skal gøres lige nu. At se Netflix er altid sjovere end at håndtere dynamiske programmeringsproblemer. Du ved det, og du skal rette det.

Hvordan man slår udsættelse

Sæt dig selv mål. Du vil altid finde interessante problemer, som du kan lære noget nyt af (tjek de ressourcer, jeg nævnte ovenfor). Men disse problemer skal løses, ikke kun læse om dem.

Så her er, hvordan jeg overvandt tøven. Jeg startede en papirkalender og fyldte hver dag med de problemer, jeg ville løse. Jeg udfyldte altid problemer på forhånd, to dage for tidligt. Så jeg vidste, hvordan jeg skulle administrere min tid de følgende dage.

Hvordan jeg vandt 3 ud af 4 guldmedaljer ved Computing Olympiad

Så jeg har altid været motiveret. Jeg skulle løse nogle problemer og finde nye til at fylde de næste dage i kalenderen. At overstrege løste problemer er meget rart. Jeg ved, at du også kan lide det.

Få din egen papirkalender. Opret ikke endnu en huskeliste på din telefon, som du vil glemme i morgen.

Sådan fejlretter du effektivt

Vil du blive professionel? Hvis ja, så skal du "fejle i dit sind".
Dette er langt den mest effektive debugging-teknik, jeg kender, fordi den overhovedet ikke kræver en debugger. Din hjerne udforsker flere kodegrene på samme tid og giver dig et meget bredere overblik over koden sammenlignet med klassisk debugger.

Du kan sammenligne dig selv med en stormester, der spiller skak og tænker 3 træk foran.

Jeg bruger udelukkende denne teknik som min første forsvarslinje. Så bruger jeg en rigtig debugger.

For at lære at "debage i dit sind", skal du øve dig. Når du godkender en løsning på et problem og får et "forkert svar", skal du ikke gå direkte til debugger-knappen. Læs koden igen og tænk: "Hvad sker der på denne linje?", "Hvordan påvirker "hvis" programmet her?", "Når vi forlader løkken, hvad er værdien af ​​iteratoren?".

Så du tænker selv. Med tiden vil du lære, hvordan du skriver kode og fejlretter den på farten.

Om forfatteren

Hvordan jeg vandt 3 ud af 4 guldmedaljer ved Computing Olympiad
Andrei Margeloiu er en ivrig programmør med interesse for iværksætteri, startups og natur. Du kan kontakte ham på LinkedIn.

Oversættelse: Diana Sheremyeva

Kilde: www.habr.com

Tilføj en kommentar