Hur jag vann 3 av 4 guldmedaljer på Computing Olympiad

Hur jag vann 3 av 4 guldmedaljer på Computing Olympiad

Jag förberedde mig för Google HashCode World Championship Finals 2017. Detta är den största tävlingen med algoritmiska problem som organiseras av Google.

Jag började lära mig C++ från början i nian. Jag kunde ingenting om programmering, algoritmer eller datastrukturer. Vid något tillfälle skrev jag min första kodrad. Sju månader senare skymtade programmeringstävlingen vid horisonten. Jag ville se hur väl min stil att lära mig programmering fungerade. Det var det perfekta tillfället.

Efter två dagars tävling kom resultaten: jag vann guldmedaljen.

Jag var chockad. Jag var före konkurrenter med 5 års erfarenhet. Jag visste att jag hade jobbat hårt, men denna prestation överträffade alla mina förväntningar. Jag insåg att sportprogrammering var mitt ämne och gick in i det huvudstupa.

Jag vet vad som ledde mig till framgång och jag vill dela det med dig.

Hur jag vann 3 av 4 guldmedaljer på Computing Olympiad

Artikeln översattes med stöd av EDISON Software, som tar hand om programmerares hälsa och deras frukostOch utvecklar skräddarsydd programvara.

Vilket programmeringsspråk att välja

  • C++ - Rekommenderas varmt! Han är väldigt snabb. Implementering av algoritmer tar kort tid på grund av STL. C++ accepteras i alla tävlingar. Jag skrev min första kodrad i C++.
  • C - Lär dig C++ på grund av STL. Om du kan C kan du även programmera i C++.
  • Java är ett långsamt programmeringsspråk. Den har en Big Integer-klass, men det hjälper dig inte mycket. Om en tävling har en tidsgräns kommer du säkert att överskrida den med Java. Java accepteras inte vid alla tävlingar.

Var kan man träna

jag rekomenderar Sphere Online Judge (SPOJ). Det är en effektiv resurs vad gäller kvantitet och kvalitet. Redaktörer och lösningar finns tillgängliga online om du fastnar i processen att lösa problem. Utöver denna sida rekommenderar jag SPOJ Toolkit и problemklassificerare för SPOJ.pl.

Först måste du finslipa dina kunskaper om grunderna

När du väl har vant dig vid språkets syntax finns det några problem att övervinna. Börja med enkla problem som kräver övning. I det här skedet är det viktigaste att bestämma din programmeringsstil. Kanske gillar du att skriva kod med mycket blanksteg, kanske inte. Du kanske sätter parenteserna på samma rad som "om", eller så kanske du sätter dem på separata rader.

Du måste hitta din programmeringsstil eftersom det är DIN stil.

När du letar efter det, kom ihåg två grundläggande principer:

  • Din kod ska vara lätt att implementera. Du ska känna dig bekväm med att implementera den lösning du kommer fram till. Varför? För under en tävling är det sista du vill gå vilse i din kod. Det är alltid bättre att lägga 5 minuter extra på att tänka på hur man förenklar implementeringen av koden än att lägga 10 minuter på att försöka lista ut det.
  • Din kod ska vara lätt att läsa. När koden är lätt att läsa är den lätt att felsöka. Låt oss inse det – buggar händer hela tiden. Du vet den där känslan när du har 10 minuter kvar och du inte kan hitta det jäkla misstaget? Självklart gör du det. För att undvika denna situation, skriv läsbar kod. När du väl börjar felsöka den kommer koden att verka naturlig och lätt att förstå.

Här är ett exempel på mig programmeringsstil.

Hur du förbättrar dina utvecklingsförmåga

Öva, öva och mer övning. Jag rekommenderar att du arbetar igenom de första 250 mest lösbara problemen på SPOJ. Lös dem i ordning. Tillbringa minst en timme att tänka på lösningen för var och en av dem.

Säg inte: "Det här problemet är för svårt för mig, jag ska försöka lösa nästa." Så tänker förlorare.

Ta ett papper och en penna. Tänk på det. Kanske kan du hitta en lösning, kanske inte. Som ett minimum kommer du att utveckla algoritmiskt tänkande. Om du inte kan komma på en lösning inom en timme, leta efter en färdig lösning på forumet eller i artiklar.

Vad kommer du att uppnå med detta tillvägagångssätt? Lär dig att snabbt implementera dina idéer med hjälp av kod. Och studera klassiska problem och algoritmer.

För det andra måste du behärska algoritmer och datastrukturer

Följ ett hierarkiskt förhållningssätt. Började du springa utan att veta hur du skulle gå? Nej. Kan du bygga en skyskrapa utan en solid grund? Inte igen.

Du kan inte ignorera stegen längs inlärningsvägen. Om du ignorerar dem kommer du att lämnas med kunskapsluckor. Med tiden kommer de bara att bli värre.

Börja med grundläggande algoritmer och datastrukturer

Det är svårt att börja. Kanske för att du inte vet vad du ska studera först. Det är därför Jag skapade en videokurs "Algorithms and Data Structures". När jag skapade den här kursen baserade jag den på hur jag skulle vilja bli undervisad. Reaktionen var otrolig! Mer än 3000 100 studenter från över XNUMX länder registrerade sig för kursen under den första månaden.

Om du arbetar med att lösa enkla problem kommer du aldrig att förbättras.

Det mest effektiva sättet att förstå det du inte vet är att uppleva det i praktiken. Det var så jag lärde mig. Jag lärde mig många nya tekniker som jag aldrig hade hört talas om förut genom att välja en utmanande uppgift.

Vart tredje problem du arbetar med borde lära dig något nytt. Var mer försiktig när du väljer problem. Välj svårare problem!

När du har slutfört dessa 250 problem från SPOJ kommer du att ha en grundläggande förståelse för kärnämnena för sportprogrammering. Med en djup förståelse för logiken bakom grundläggande algoritmer kommer algoritmer på hög nivå att verka mindre komplexa. På så sätt kan du få ut det mesta av din kunskap.

Gräv djupare i vart och ett av huvudteman

Här är en värdefull resurs med mycket information. Där hittar du de 10 bästa algoritmerna och datastrukturerna för varje ämne. Efter 250 problem från SPOJ kommer du att veta mycket från den här listan. Men du kommer också att snubbla över många saker du aldrig hört talas om förut. Så börja studera dessa ämnen i stigande ordning.

Om du inte stärker dina kunskaper efter att ha lärt dig något nytt kommer du snabbt att glömma allt.
Jag rekommenderar att efter att du lärt dig en ny algoritm, använd den i praktiken. Arbeta igenom 2-3 uppgifter. Leta efter algoritmtaggen i SPOJ. Där hittar du problem som behöver denna algoritm för att lösa. Ta itu med dessa problem först.

Bemästra dynamisk programmering eftersom det kommer att leda dig till seger
Enligt min erfarenhet har varje tävling minst ett problem dynamisk programmering. Många människor får huvudvärk när de hör frasen "dynamisk programmering" eftersom de inte förstår det alls.

Och det här är bra. För om du förstår dynamisk programmering kommer du att vinna.

Jag gillar dynamisk programmering, det är mitt favoritämne. Hemligheten med dynamisk programmering är att göra globalt optimala val, inte bara lokala. Du måste bryta ner problemet i enklare delproblem. Lös vart och ett av dessa delproblem endast en gång. Skapa sedan en lösning som kombinerar de lösta delproblemen. Girig algoritm - motsatsen till dynamisk programmering. Det kräver att man gör lokalt optimala val vid varje steg. Och ett lokalt optimalt val kan leda till en dålig global lösning.

Medan du lär dig nya koncept, kolla in TopCoder handledning. De är mycket detaljerade och begripliga. Tack vare dem kunde jag förstå binärt indexerade träd.

Jobba hårt

Har du någonsin hört talas om idrottare som vinner OS utan år av träning? Jag inte.

Varje år började förberedelserna för datorolympiaden i september och avslutades i april.

Varje dag under dessa 8 månader tränade jag i 5 timmar.

Och ja, jag ägnade dessa 5 timmar åt att bara lösa algoritmiska problem. Jag minns dagarna när jag tränade i 8 och till och med 10 timmar. Varför? För jag gillade det. Varje dag när jag kom hem från skolan gick jag direkt till sovrummet, satte mig vid datorn och började analysera ett nytt problem. Eller så lärde jag mig en ny algoritm som jag behövde känna till för att lösa det här problemet.

Om du vill vinna måste du göra detsamma. Välj ett problem och håll dig till det. Tänk på det när du går till snabbköpet eller när du kör.

Hur jag vann 3 av 4 guldmedaljer på Computing Olympiad

Visste du att din hjärna defragmenterar informationen som samlas in den dagen när du sover? Han ser ut att stapla böcker i alfabetisk ordning på en bokhylla. I huvudsak tänker din hjärna på de olika problem du står inför.

Detta kan användas skickligt. Läs ett svårt problem innan du går och lägger dig och kom ihåg vad som krävs för att lösa det. I detta skede behöver du inte leta efter själva lösningen. Gå och lägg dig. Din hjärna kommer att börja bearbeta detta problem. När du vaknar kommer du att bli förvånad över att inse att du hittade lösningen medan du sov.

Prova själv. Det är som magi.

Jag skapade en videoblogg

Hur jag vann 3 av 4 guldmedaljer på Computing Olympiad

Detta korta stycke är inte relaterat till sportprogrammering. Om du är i tjugoårsåldern och undrar hur jag ser på världen, kanske du vill kolla in min videoblogg på Youtube. Jag pratar om världen, livet och datavetenskap i den.

Arbeta smart

Detta är hemligheten bakom framgång. Du behöver mål.

Vi är människor och vi gillar det förhala. Vi vill alltid skjuta upp det som behöver göras just nu. Att titta på Netflix är alltid roligare än att hantera dynamiska programmeringsproblem. Du vet detta och du måste fixa det.

Hur man slår förhalning

Sätt upp mål för dig själv. Du kommer alltid att hitta intressanta problem som du kan lära dig något nytt från (kolla in resurserna jag nämnde ovan). Men dessa problem måste lösas, inte bara läsas om.

Så här är hur jag övervann förhalandet. Jag startade en papperskalender och fyllde varje dag med problem jag ville lösa. Jag fyllde alltid i problem två dagar i förväg. Så jag visste hur jag skulle hantera min tid under de följande dagarna.

Hur jag vann 3 av 4 guldmedaljer på Computing Olympiad

Så jag var alltid motiverad. Jag behövde lösa några problem och hitta nya att fylla de kommande dagarna i kalendern. Att kryssa av lösta problem känns jättebra. Jag vet att du gillar det också.

Skaffa din egen papperskalender. Skapa inte en annan att göra-lista på din telefon som du kommer att glömma imorgon.

Hur man felsöker effektivt

Vill du bli proffs? Om ja, måste du "felsöka det i ditt sinne."
Detta är den i särklass mest effektiva felsökningstekniken jag känner till eftersom den inte kräver någon felsökning alls. Din hjärna undersöker flera kodgrenar samtidigt och ger dig en mycket bredare överblick över koden jämfört med klassisk debugger.

Du kan jämföra dig med en stormästare som spelar schack och tror 3 drag framåt.

Jag använder denna teknik enbart som min första försvarslinje. Sedan använder jag en riktig debugger.

För att lära dig att felsöka i ditt huvud måste du öva. När du validerar en lösning på ett problem och får ett "fel svar", gå inte direkt till felsökningsknappen. Läs koden igen och tänk: "Vad händer på den här raden?", "Hur påverkar "om" här programmet?", "När vi lämnar loopen, vad är värdet på iteratorn?"

Så här tänker du själv. Med tiden kommer du att lära dig att skriva kod och felsöka den i farten.

Om författaren

Hur jag vann 3 av 4 guldmedaljer på Computing Olympiad
Andrei Margeloiu är en ivrig programmerare med intresse för entreprenörskap, startups och utomhus. Du kan kontakta honom på LinkedIn.

Översättning: Diana Sheremyeva

Källa: will.com

Lägg en kommentar