Hvordan jeg vant 3 av 4 gullmedaljer på Computing Olympiad

Hvordan jeg vant 3 av 4 gullmedaljer på Computing Olympiad

Jeg forberedte meg til Google HashCode World Championship Finals 2017. Dette er den største konkurransen med algoritmiske problemer organisert av Google.

Jeg begynte å lære C++ fra bunnen av i niende klasse. Jeg visste ingenting om programmering, algoritmer eller datastrukturer. På et tidspunkt skrev jeg min første kodelinje. Syv måneder senere dukket programmeringskonkurransen opp i horisonten. Jeg ønsket å se hvor godt min stil med å lære programmering fungerte. Det var den perfekte muligheten.

Etter to dager med konkurranse kom resultatene: Jeg vant gullmedaljen.

Jeg var sjokkert. Jeg var foran konkurrenter med 5 års erfaring. Jeg visste at jeg hadde jobbet hardt, men denne prestasjonen overgikk alle mine forventninger. Jeg skjønte at sportsprogrammering var temaet mitt, og studerte det hodestups.

Jeg vet hva som førte meg til suksess, og jeg vil dele det med deg.

Hvordan jeg vant 3 av 4 gullmedaljer på Computing Olympiad

Artikkelen ble oversatt med støtte fra EDISON Software, som tar vare på helsen til programmerere og frokosten deresOg utvikler tilpasset programvare.

Hvilket programmeringsspråk å velge

  • C++ - Anbefales på det sterkeste! Han er veldig rask. Implementering av algoritmer tar kort tid på grunn av STL. C++ er akseptert i alle konkurranser. Jeg skrev min første kodelinje i C++.
  • C - Lær C++ på grunn av STL. Hvis du kan C, kan du også programmere i C++.
  • Java er et tregt programmeringsspråk. Den har en Big Integer-klasse, men den vil ikke hjelpe deg mye. Hvis en konkurranse har en tidsbegrensning, vil du med Java garantert overskride den. Java er ikke akseptert i alle konkurranser.

Hvor kan du øve

jeg anbefaler Sphere Online Judge (SPOJ). Det er en effektiv ressurs når det gjelder kvantitet og kvalitet. Redaktører og løsninger er tilgjengelige på nettet hvis du blir sittende fast i prosessen med å løse problemer. I tillegg til denne siden anbefaler jeg SPOJ Verktøysett и problemklassifiserer for SPOJ.pl.

Først må du finpusse kunnskapen din om det grunnleggende

Når du først har blitt vant til syntaksen til språket, er det noen problemer å overvinne. Start med enkle problemer som krever øvelse. På dette stadiet er det viktigste å bestemme programmeringsstilen din. Kanskje du liker å skrive kode med mye mellomrom, kanskje du ikke gjør det. Du kan sette parentesene på samme linje som "hvis", eller du kan sette dem på separate linjer.

Du må finne programmeringsstilen din fordi det er DIN stil.

Når du ser etter det, husk to grunnleggende prinsipper:

  • Koden din skal være enkel å implementere. Du bør føle deg komfortabel med å implementere løsningen du kommer opp med. Hvorfor? For under en konkurranse er det siste du ønsker å gå deg vill i koden din. Det er alltid bedre å bruke 5 minutter ekstra på å tenke på hvordan du kan forenkle implementeringen av koden enn å bruke 10 minutter på å finne ut av det.
  • Koden din skal være lett å lese. Når koden er lett å lese, er den lett å feilsøke. La oss innse det – feil skjer hele tiden. Du kjenner den følelsen når du har 10 minutter igjen og du ikke finner feilen? Selvfølgelig gjør du det. For å unngå denne situasjonen, skriv leselig kode. Når du begynner å feilsøke den, vil koden virke naturlig og lett å forstå.

Her er et eksempel av meg programmeringsstil.

Hvordan forbedre dine utviklingsferdigheter

Øv, øv og mer øving. Jeg anbefaler at du arbeider deg gjennom de første 250 mest løsbare problemene på SPOJ. Løs dem i rekkefølge. Bruk minst en time på å tenke på løsningen for hver av dem.

Ikke si: "Dette problemet er for vanskelig for meg, jeg skal prøve å løse det neste." Slik tenker tapere.

Ta et stykke papir og en blyant. Tenk på det. Kanskje du kan finne en løsning, kanskje ikke. Som et minimum vil du utvikle algoritmisk tenkning. Hvis du ikke kan finne en løsning innen en time, se etter en ferdig løsning på forumet eller i artikler.

Hva vil du oppnå med denne tilnærmingen? Lær å implementere ideene dine raskt ved hjelp av kode. Og studere klassiske problemer og algoritmer.

For det andre må du mestre algoritmer og datastrukturer

Følg en hierarkisk tilnærming. Begynte du å løpe uten å vite hvordan du skulle gå? Nei. Kan du bygge en skyskraper uten et solid fundament? Ikke igjen.

Du kan ikke ignorere trinnene langs læringsveien. Hvis du ignorerer dem, vil du sitte igjen med kunnskapshull. Over tid vil de bare bli verre.

Start med grunnleggende algoritmer og datastrukturer

Det er vanskelig å starte. Kanskje fordi du ikke vet hva du skal studere først. Derfor Jeg laget et videokurs "Algorithms and Data Structures". Da jeg opprettet dette kurset, baserte jeg det på hvordan jeg ønsker å bli undervist. Reaksjonen var utrolig! Mer enn 3000 studenter fra over 100 land meldte seg på kurset den første måneden.

Hvis du jobber med å løse enkle problemer, vil du aldri bli bedre.

Den mest effektive måten å forstå det du ikke vet, er å oppleve det i praksis. Det var slik jeg lærte. Jeg lærte mange nye teknikker som jeg aldri hadde hørt om før ved å velge en utfordrende oppgave.

Hvert tredje problem du jobber med skal lære deg noe nytt. Vær mer forsiktig når du velger problemer. Velg vanskeligere problemer!

Når du har fullført disse 250 problemene fra SPOJ, vil du ha en grunnleggende forståelse av kjerneemnene for sportsprogrammering. Med en dyp forståelse av logikken bak grunnleggende algoritmer, vil høynivåalgoritmer virke mindre komplekse. På denne måten kan du få mest mulig ut av kunnskapen din.

Grav dypere inn i hvert av hovedtemaene

Her er en verdifull ressurs med mye informasjon. Der finner du de 10 beste algoritmene og datastrukturene for hvert emne. Etter 250 problemer fra SPOJ, vil du vite mye fra denne listen. Men du vil også snuble over mange ting du aldri har hørt om før. Så begynn å studere disse emnene i stigende rekkefølge.

Hvis du ikke styrker kunnskapen etter å ha lært noe nytt, vil du fort glemme alt.
Jeg anbefaler at du bruker den i praksis etter at du har lært en ny algoritme. Arbeid det gjennom 2-3 oppgaver. Se etter algoritme-taggen i SPOJ. Der finner du problemer som trenger denne algoritmen for å løse. Løs disse problemene først.

Mestre dynamisk programmering fordi det vil føre deg til seier
Fra min erfaring har hver konkurranse minst ett problem dynamisk programmering. Mange får hodepine når de hører uttrykket "dynamisk programmering" fordi de ikke forstår det i det hele tatt.

Og dette er bra. For hvis du forstår dynamisk programmering, vil du vinne.

Jeg liker dynamisk programmering, det er favorittemnet mitt. Hemmeligheten bak dynamisk programmering er å ta globalt optimale valg, ikke bare lokale. Du må dele problemet ned i enklere delproblemer. Løs hvert av disse delproblemene bare én gang. Lag deretter en løsning som kombinerer de løste delproblemene. Grådig algoritme - det motsatte av dynamisk programmering. Det krever lokalt optimale valg på hvert trinn. Og et lokalt optimalt valg kan føre til en dårlig global løsning.

Mens du lærer nye konsepter, sjekk ut TopCoder-opplæringer. De er veldig detaljerte og forståelige. Takket være dem klarte jeg å forstå binært indekserte trær.

Arbeide hardt

Har du noen gang hørt om idrettsutøvere som vinner OL uten mange års trening? Ikke meg.

Hvert år begynte forberedelsene til Dataolympiaden i september og ble avsluttet i april.

Hver dag i disse 8 månedene øvde jeg i 5 timer.

Og ja, jeg brukte disse 5 timene på å løse algoritmiske problemer. Jeg husker dagene da jeg øvde i 8 og til og med 10 timer. Hvorfor? Fordi jeg likte det. Hver dag når jeg kom hjem fra skolen, gikk jeg rett til soverommet, satte meg ved datamaskinen og begynte å analysere et nytt problem. Eller jeg lærte en ny algoritme som jeg trengte å vite for å løse dette problemet.

Skal du vinne, må du gjøre det samme. Velg et problem og hold deg til det. Tenk på det mens du går til supermarkedet eller mens du kjører.

Hvordan jeg vant 3 av 4 gullmedaljer på Computing Olympiad

Visste du at når du sover, defragmenterer hjernen din informasjonen som er samlet inn den dagen? Han ser ut til å stable bøker i alfabetisk rekkefølge på en bokhylle. I hovedsak tenker hjernen din på de ulike problemene du står overfor.

Dette kan brukes dyktig. Før du legger deg, les et vanskelig problem og husk hva som skal til for å løse det. På dette stadiet trenger du ikke lete etter selve løsningen. Gå til sengs. Hjernen din vil begynne å behandle dette problemet. Når du våkner, vil du bli overrasket over å innse at du fant løsningen mens du sov.

Prøv det selv. Det er som magi.

Jeg har laget en videoblogg

Hvordan jeg vant 3 av 4 gullmedaljer på Computing Olympiad

Dette korte avsnittet er ikke relatert til sportsprogrammering. Hvis du er i tjueårene og lurer på hvordan jeg ser på verden, kan det være lurt å sjekke ut videobloggen min på Youtube. Jeg snakker om verden, livet og informatikk i den.

Jobb smart

Dette er hemmeligheten bak suksess. Du trenger mål.

Vi er mennesker og vi liker det utsette. Vi ønsker alltid å utsette det som må gjøres akkurat nå. Å se Netflix er alltid morsommere enn å håndtere dynamiske programmeringsproblemer. Du vet dette, og du må fikse det.

Hvordan slå utsettelse

Sett deg selv mål. Du vil alltid finne interessante problemer som du kan lære noe nytt fra (sjekk ut ressursene jeg nevnte ovenfor). Men disse problemene må løses, ikke bare leses om.

Så her er hvordan jeg overvant utsettelse. Jeg startet en papirkalender og fylte hver dag med problemer jeg ønsket å løse. Jeg fylte alltid ut problemer to dager i forveien. Så jeg visste hvordan jeg skulle disponere tiden min de neste dagene.

Hvordan jeg vant 3 av 4 gullmedaljer på Computing Olympiad

Så jeg var alltid motivert. Jeg trengte å løse noen problemer og finne nye å fylle de neste dagene på kalenderen. Å krysse av løste problemer føles flott. Jeg vet at du liker det også.

Få din egen papirkalender. Ikke lag en annen oppgaveliste på telefonen som du vil glemme i morgen.

Hvordan feilsøke effektivt

Vil du bli profesjonell? Hvis ja, må du "feilsøke det i tankene dine."
Dette er den desidert mest effektive feilsøkingsteknikken jeg kjenner til fordi den ikke krever en debugger i det hele tatt. Hjernen din undersøker flere kodegrener samtidig og gir deg en mye bredere oversikt over koden sammenlignet med klassisk debugger.

Du kan sammenligne deg med en stormester som spiller sjakk og tror 3 trekk foran.

Jeg bruker denne teknikken utelukkende som min første forsvarslinje. Da bruker jeg en ekte debugger.

For å lære hvordan du feilsøker i hodet ditt, må du øve. Når du validerer en løsning på et problem og får et "feil svar", ikke gå rett til feilsøkingsknappen. Les koden på nytt og tenk: "Hva skjer på denne linjen?", "Hvordan påvirker "hvis" her programmet?", "Når vi går ut av loopen, hva er verdien av iteratoren?"

På denne måten tenker du selv. Over tid vil du lære å skrive kode og feilsøke den på farten.

Om forfatteren

Hvordan jeg vant 3 av 4 gullmedaljer på Computing Olympiad
Andrei Margeloiu er en ivrig programmerer med interesse for entreprenørskap, startups og friluftsliv. Du kan kontakte ham på LinkedIn.

Oversettelse: Diana Sheremyeva

Kilde: www.habr.com

Legg til en kommentar