Kuinka voitin 3 kultamitalista neljästä tietojenkäsittelyolympialaisissa

Kuinka voitin 3 kultamitalista neljästä tietojenkäsittelyolympialaisissa

Olen valmistautunut vuoden 2017 Google HashCode World Championship Finaaliin. Tämä on suurin Googlen järjestämä algoritminen haastekilpailu.

Aloitin C++:n oppimisen tyhjästä yhdeksännellä luokalla. En tiennyt mitään ohjelmoinnista, algoritmeista ja tietorakenteista. Jossain vaiheessa kirjoitin ensimmäisen koodirivini. Seitsemän kuukautta myöhemmin näköpiirissä oli ohjelmointikilpailu. Halusin tietää, kuinka hyvin ohjelmoinnin oppimistyylini toimi. Se oli täydellinen tilaisuus.

Kahden päivän kilpailun jälkeen tuli tulokset: voitin kultamitalin.

Olin järkyttynyt. Pääsin kilpailun edelle 5 vuoden kokemuksella. Tiesin, että tein kovasti töitä, mutta tämä saavutus ylitti kaikki odotukseni. Tajusin, että urheiluohjelmointi on aiheeni, ja menin siihen päätäni.

Tiedän, mikä johti minut menestykseen, ja haluan jakaa sen kanssasi.

Kuinka voitin 3 kultamitalista neljästä tietojenkäsittelyolympialaisissa

Artikkeli on käännetty EDISON Softwaren tuella, joka huolehtii ohjelmoijien terveydestä ja heidän aamiaisestaanJa kehittää räätälöityjä ohjelmistoja.

Mikä ohjelmointikieli valita

  • C++ - Suosittelen! Hän on erittäin nopea. Algoritmien käyttöönotto vie vähän aikaa STL:n vuoksi. C++ hyväksytään kaikissa kilpailuissa. Kirjoitin ensimmäisen koodirivini C++:lla.
  • C - opi C++ STL:n ansiosta. Jos osaat C:n, osaat ohjelmoida myös C++:lla.
  • Java on hidas ohjelmointikieli. Siinä on Big Integer -luokka, mutta siitä ei ole paljon apua. Jos kilpailulla on aikaraja, Javalla ylität sen varmasti. Javaa ei hyväksytä kaikissa kilpailuissa.

Missä voi harjoitella

Suosittelen Sphere Online Judge (SPOJ). Se on määrällisesti ja laadullisesti tehokas resurssi. Muokkaajat ja ratkaisut ovat saatavilla verkossa, jos jäät jumiin vianetsintäprosessissa. Tämän sivuston lisäksi suosittelen SPOJ Toolkit и ongelman luokitin SPOJ.pl:lle.

Ensin sinun on hiottava perustietosi

Kun olet tottunut kielen syntaksiin, sinun on ratkaistava joitain ongelmia. Aloita yksinkertaisista ongelmista, jotka vaativat harjoittelua. Tässä vaiheessa tärkeintä on määrittää ohjelmointityylisi. Ehkä haluat kirjoittaa koodia, jossa on paljon välilyöntejä, ehkä et. Saatat laittaa sulut samalle riville kuin "jos", tai saatat laittaa ne eri riveille.

Sinun on löydettävä ohjelmointityylisi, koska se on sinun tyylisi.

Kun etsit sitä, pidä mielessä kaksi perusperiaatetta:

  • Koodisi tulee olla helppo ottaa käyttöön. Sinun pitäisi tuntea olosi mukavaksi toteuttaessasi keksimääsi ratkaisua. Miksi? Koska kilpailun aikana viimeinen asia, jonka haluat, on eksyä koodiisi. On aina parempi käyttää ylimääräiset 5 minuuttia koodin toteuttamisen yksinkertaistamiseksi kuin käyttää 10 minuuttia sen selvittämiseen.
  • Koodisi tulee olla helppolukuinen. Kun koodia on helppo lukea, se on helppo korjata. Todettakoon, että virheitä tapahtuu jatkuvasti. Tiedätkö sen tunteen, kun on 10 minuuttia jäljellä, etkä löydä sitä vitun virhettä? Tietysti teet. Vältä tämä tilanne kirjoittamalla luettava koodi. Kun aloitat virheenkorjauksen, koodi tuntuu luonnolliselta ja helposti ymmärrettävältä.

Tässä on esimerkkini ohjelmointityyli.

Kuinka parantaa kehitystaitojasi

Harjoittele, harjoittele ja lisää harjoittelua. Suosittelen, että käyt läpi ensimmäiset 250 parhaiten ratkaistua ongelmaa SPOJ. Ratkaise ne järjestyksessä. Vietä vähintään tunti pohtimaan ratkaisua kuhunkin niistä.

Älä sano: "Tämä ongelma on liian vaikea minulle, yritän seuraavaa." Näin luulevat häviäjät.

Ota paperi ja kynä. Ajatella. Ehkä löydät ratkaisun, ehkä et. Ainakin kehität algoritmista ajattelua. Jos et löydä ratkaisua tunnin sisällä, etsi valmis ratkaisu foorumilta tai artikkeleista.

Mitä saavutat tällä lähestymistavalla? Opi toteuttamaan ideasi nopeasti koodin avulla. Ja opi klassisia ongelmia ja algoritmeja.

Toiseksi sinun on hallittava algoritmit ja tietorakenteet

Noudata hierarkkista lähestymistapaa. Aloititko juoksemisen pystymättä kävelemään? Ei. Voitko rakentaa pilvenpiirtäjän ilman vankkaa perustaa? Taas ei.

Et voi sivuuttaa oppimispolun vaiheita. Jos jätät ne huomiotta, jää tietopuutteisiin. Ajan myötä ne vain pahenevat.

Aloita perusalgoritmeista ja tietorakenteista

On vaikea aloittaa. Ehkä siksi, että et tiedä mitä opiskella ensin. Siksi Tein videokurssin "Algoritmit ja tietorakenteet". Luodessani tätä kurssia luotin siihen, miten haluaisin tulla opetetuksi. Vastaus oli uskomaton! Yli 3000 100 opiskelijaa yli XNUMX maasta ilmoittautui kurssille ensimmäisen kuukauden aikana.

Jos työskentelet helppojen ongelmien ratkaisemiseksi, et koskaan parane.

Tehokkain tapa selvittää, mitä et tiedä, on kohdata se käytännössä. Näin minä opin. Opin monia uusia tekniikoita, joista en ollut koskaan ennen kuullut, valitsemalla vaikean tehtävän.

Jokaisen kolmannen ongelman parissa pitäisi opettaa sinulle jotain uutta. Ole varovainen ongelmien valinnassa. Valitse vaikeammat ongelmat!

Kun olet suorittanut nämä 250 SPOJ:n tehtävää, sinulla on yleinen käsitys urheiluohjelmoinnin pääaiheista. Perusalgoritmien taustalla olevan logiikan syvällinen ymmärtäminen korkean tason algoritmit eivät vaikuta kovin monimutkaisilta. Näin voit käyttää tietosi mahdollisimman hyvin.

Kaivaudu syvemmälle jokaiseen pääteemaan

Tässä on arvokas resurssi paljon tietoa. Sieltä löydät kunkin aiheen 10 parasta algoritmia ja tietorakennetta. 250 SPOJ:n ongelman jälkeen tiedät paljon tästä luettelosta. Mutta törmäät myös sellaiseen, josta et ole koskaan ennen kuullut. Joten aloita näiden aiheiden tutkiminen nousevassa järjestyksessä.

Jos et vahvista osaamistasi opittuasi jotain uutta, unohdat nopeasti kaiken.
Suosittelen, että kun olet oppinut uuden algoritmin, ota se käyttöön. Tee se 2-3 tehtävässä. Etsi algoritmitunniste SPOJ:sta. Sieltä löydät ongelmia, joihin tätä algoritmia tarvitaan. Käsittele nämä ongelmat ensin.

Ymmärrä dynaaminen ohjelmointi, koska se johtaa sinut voittoon
Kokemukseni mukaan jokaisessa kilpailussa on vähintään yksi ongelma dynaaminen ohjelmointi. Monet ihmiset saavat päänsäryn kuultuaan lauseen "dynaaminen ohjelmointi", koska he eivät ymmärrä sitä ollenkaan.

Ja tämä on hyvä. Sillä jos ymmärrät dynaamisen ohjelmoinnin, voitat.

Pidän dynaamisesta ohjelmoinnista, se on suosikkiaiheeni. Dynaamisen ohjelmoinnin salaisuus on tehdä globaalisti optimaalisia valintoja, ei vain paikallisia. Sinun tulisi jakaa ongelma yksinkertaisempiin osatehtäviin. Ratkaise jokainen näistä osa-ongelmista vain kerran. Luo sitten ratkaisu, joka yhdistää ratkaistut osaongelmat. Ahne algoritmi on dynaamisen ohjelmoinnin vastakohta. Siinä jokaisessa vaiheessa on tehtävä paikallisesti optimaalinen valinta. Ja paikallisesti optimaalinen valinta voi johtaa huonoon globaaliin ratkaisuun.

Kun tutkit uusia käsitteitä, tarkista TopCoder opetusohjelmat. Ne ovat hyvin yksityiskohtaisia ​​ja ymmärrettäviä. Niiden ansiosta pystyin ymmärtämään binäärisesti indeksoidut puut.

työskennellä kovasti

Oletko koskaan kuullut urheilijoista, jotka voittivat olympialaiset ilman vuosien harjoittelua? Minua ei.

Joka vuosi tietokoneolympialaisten valmistautuminen alkoi syyskuussa ja päättyi huhtikuussa.

Joka päivä näiden 8 kuukauden aikana harjoittelin 5 tuntia.

Ja kyllä, käytin nämä 5 tuntia vain algoritmisten ongelmien ratkaisemiseen. Muistan ajat, jolloin harjoittelin 8 ja jopa 10 tuntia. Miksi? Koska pidin siitä. Joka päivä palattuani kotiin koulusta menin suoraan makuuhuoneeseen, istuin tietokoneen ääreen ja aloin selvittää uutta ongelmaa. Tai uuden algoritmin oppiminen, joka täytyi tietää tämän ongelman ratkaisemiseksi.

Jos haluat voittaa, sinun on tehtävä samoin. Valitse ongelma ja pysy siinä. Ajattele sitä kävellessäsi tiellä supermarkettiin tai ajaessasi.

Kuinka voitin 3 kultamitalista neljästä tietojenkäsittelyolympialaisissa

Tiesitkö, että unen aikana aivosi eheyttävät sinä päivänä kerätyt tiedot? Hän näyttää pinoavan kirjoja kirjahyllylle aakkosjärjestyksessä. Pohjimmiltaan aivosi ajattelevat kohtaamiasi erilaisia ​​ongelmia.

Tätä voidaan käyttää taitavasti. Ennen nukkumaanmenoa lue vaikea ongelma ja muista, mitä sen ratkaiseminen vaatii. Tässä vaiheessa sinun ei tarvitse etsiä itse ratkaisua. Mene sänkyyn. Aivosi alkavat käsitellä tätä ongelmaa. Kun heräät, hämmästyt huomatessasi, että löysit ratkaisun nukkuessasi.

Kokeile itse. Se on kuin taikuutta.

Tein vlogin

Kuinka voitin 3 kultamitalista neljästä tietojenkäsittelyolympialaisissa

Tämä lyhyt kappale ei liity urheiluohjelmiin. Jos olet parikymppinen ja mietit, kuinka minä näen maailman, voit katsoa vlogini Youtubessa. Puhun siinä maailmasta, elämästä ja informatiikasta.

Työskentele älykkäästi

Tämä on menestyksen salaisuus. Tarvitset tavoitteita.

Olemme ihmisiä ja pidämme viivytellä. Haluamme aina lykätä sitä, mikä on tehtävä juuri nyt. Netflixin katsominen on aina hauskempaa kuin dynaamisten ohjelmointiongelmien käsitteleminen. Tiedät sen ja sinun on korjattava se.

Kuinka voittaa viivyttely

Aseta itsellesi tavoitteita. Löydät aina mielenkiintoisia ongelmia, joista voit oppia jotain uutta (tutustu yllä mainitsemiini resursseihin). Mutta näihin ongelmiin on puututtava, ei vain luettava niistä.

Joten, näin selvisin viivyttelystä. Aloitin paperikalenterin ja täytin jokaisen päivän ongelmilla, jotka halusin ratkaista. Täytin aina ongelmat etukäteen, kaksi päivää etuajassa. Joten tiesin kuinka hallita aikani seuraavina päivinä.

Kuinka voitin 3 kultamitalista neljästä tietojenkäsittelyolympialaisissa

Olen siis aina ollut motivoitunut. Minun piti ratkaista joitain ongelmia ja löytää uusia täytettäväksi seuraavat päivät kalenterissa. Ratkaistujen ongelmien yliviivaaminen on erittäin mukavaa. Tiedän, että sinäkin pidät siitä.

Hanki oma paperikalenteri. Älä luo puhelimeesi uutta tehtävälistaa, jonka unohdat huomenna.

Kuinka debug tehokkaasti

Haluatko tulla ammattilaiseksi? Jos kyllä, sinun on tehtävä virheenkorjaus mielessäsi.
Tämä on ylivoimaisesti tehokkain virheenkorjaustekniikka, jonka tiedän, koska se ei vaadi debuggeria ollenkaan. Aivosi tutkivat useita koodihaaroja samanaikaisesti ja antavat sinulle paljon laajemman kuvan koodista kuin klassinen debuggeri.

Voit verrata itseäsi suurmestariin, joka pelaa shakkia ja ajattelee 3 liikettä eteenpäin.

Käytän tätä tekniikkaa yksinomaan alkuperäisenä puolustuslinjanani. Sitten käytän oikeaa debuggeria.

Sinun on harjoiteltava, jotta voit oppia "häiritsemään mielessäsi". Kun hyväksyt ratkaisun ongelmaan ja saat "väärän vastauksen", älä mene suoraan virheenkorjauspainikkeeseen. Lue koodi uudelleen ja mieti: "Mitä tällä rivillä tapahtuu?", "Kuinka "jos" vaikuttaa tähän ohjelmaan?", "Kun poistumme silmukasta, mikä on iteraattorin arvo?".

Joten ajattelet itse. Ajan myötä opit kirjoittamaan koodia ja korjaamaan sen virheitä liikkeellä ollessasi.

Tietoja kirjoittajasta

Kuinka voitin 3 kultamitalista neljästä tietojenkäsittelyolympialaisissa
Andrei Margeloiu on innokas ohjelmoija, joka on kiinnostunut yrittäjyydestä, startupeista ja luonnosta. Voit ottaa häneen yhteyttä LinkedInissä.

Käännös: Diana Sheremyeva

Lähde: will.com

Lisää kommentti