100400331

Page 1


Spistreści

4.Sortowanie

Sposób1:sortowanieprzezwybieranie....................22

17.Kolejkapriorytetowa

Usunięcieelementumaksymalnego

Tworzenienowegokopcazlistyelementów

DFS,czyliprzeszukiwaniegrafuwgłąb...................132

BFS,czyliprzeszukiwaniegrafuwszerz...................133

AlgorytmDijkstry...............................139

Średnicadrzewa................................139

Zbioryrozłączne................................139

AlgorytmPrimaiKruskala..........................139

Sortowanietopologiczne............................140

Drzewolicznikowe...............................140

Szybkiepotęgowanie..............................140

Kosztzamortyzowany.............................140

Najdłuższyrosnącypodciąg..........................140

Teoriagier...................................140

AlgorytmKnutha–Morrisa–Pratta......................141

Haszowanietekstów..............................141

AlgorytmKarpa–Millera–Rosenberga....................141

SzukaniepalindromówialgorytmManachera................141

Najdłuższywspólnypodciąg.........................141

Programowaniedynamicznenadrzewach..................141

Podstawygeometriiobliczeniowej......................142

Sortowaniekątowe...............................142

Otoczkawypukła...............................142

Paranajmniejinajbardziejoddalonychpunktów..............142

Złożonośćczasowa

Dokładnepoliczenieczasudziałaniaprogramujestbardzopracochłonne (zależyodkompilatora,rodzajukomputeraczyszybkościprocesora).Dlatego niemierzysięczasudokładnie,leczdopewnegorzęduwielkości.Złożoność czasowaułatwiaszacowanieczasudziałaniaprogramów.

Nazłożonośćmożemypatrzećjaknamaksymalnąliczbęoperacjistałych,któremożewykonaćprogram.Operacjestałetopojedynczeoperacje dodawania,mnożenia,przypisaniaitp.Niektórychoperacjimożemynieliczyć,skupiającsięnapozostałych,którewykonująsięnajwięcejrazy.Takie operacjenazywamy dominującymi.

Liczbawykonywanychoperacjidominującychzależyodkonkretnych danychwejściowych.Zwyklechcemywiedzieć,jakczaswykonaniazależyod określonegoaspektudanych.Najczęściejjesttowielkośćdanych,alemożebyć torównieżrozmiarkwadratowejmacierzyczywartośćwczytywanejzmiennej.

1.1.Któraoperacjajestdominująca?

1 cin >>n;

2 for (int i=1;i<=n;i++)

3 wynik++;

4 cout<<wynik;

Operacjawwierszu 3 jestdominującaiwykonasię n razy.Złożonośćzapisujemywnotacjidużego O,wtymprzypadku O(n)—złożoność liniowa. Złożonośćoznacza,żeprogramniewykonawięcejoperacjiniżjestto określoneprzezrządwielkości.Dokładniej,wprzypadku O(n)programmoże wykonać c · n operacji,gdzie c jeststałą,aleniemożewykonaćjużnaprzykład n2 operacji,gdyżjesttowyższyrządwielkości.Innymisłowy,obliczając

złożoność,pomijamystałewspółczynniki.Jeśliwięcpętlawykonywałabysię 20·n lub n 5 razy,towciążmamyzłożoność O(n),choćczasdziałaniaprogramów możebyćróżny.Analizujączłożoność,powinniśmywyszukiwaćspecjalne, złośliweprzykładydanych,naktórychdanyprogrambędziedziałałdługo.

Porównanieróżnychzłożonościczasowych

Spróbujmyporównaćpodstawowezłożonościczasowe.

1.2.Złożonośćstała— O(1)

1 cin >>n;

2 cout<<n * n;

Zawszemamystałąliczbęoperacji.

1.3.Złożonośćlogarytmiczna— O(log n).

1 cin >>n;

2 while (n>1){

3 n=n/2;

4 wynik++;

5 }

6 cout<<wynik;

Wartość n jestwkażdymobrociepętlizmniejszanaopołowę.Jeśli n =2x , to log n = x (zakładamy,żedomyślnąpodstawąlogarytmujest2).Stąd złożonośćlogarytmiczna.

Zastanówmysię,jakszybkobędziedziałałponiższyprogramwzależności oddanychwejściowych.

1.4.Złożonośćliniowa— O(n)

1 cin >>n;

2 for (int i=1;i<=n;i++){

3 cin>>x;

4 if (x==0)

5 return 0;

6 }

Zauważmy,żejeślipierwsząwczytanąwartością x byłobyzero,toprogram odrazubysięzakończył.Pamiętajmyjednakżebadajączłożoność,szukamy

złośliwychprzypadków.Tenprogrambędziedziałałnajdłużej,jeślizeronigdy niewystąpi.

1.5.Złożonośćkwadratowa— O(n2 ).

1 cin >>n;

2 for (int i=1;i<=n;i++)

3 for (int j=i;j<=n;j++)

4 wynik++;

5 cout<<wynik;

Wynikbędzierówny 1 2 · (n2 + n)(wyjaśnieniewćwiczeniach).Obliczając złożoność,szacujemyczasdziałania,więcjesteśmyzainteresowaniwyrażeniem, którerośnienajszybciej.Wobectegonietylkopomijamystałe,alerównież innewyrażenia(wtymprzypadku 1 2 · n),którerosnąwolniej.Wtensposób uzyskujemyzłożonośćkwadratową.

Popatrzmynaprzykład,gdyzłożonośćzależyodkilkuzmiennych.

1.6.Złożonośćliniowawzględem n i m O(n + m).

1 cin >>n>>m;

2 for (int i=1;i<=n;i++)

3 cout<<i<<’’;

4 for (int i=1;i<=m;i++)

5 cout<<i<<’’;

Złożonościwykładnicze

Wartowiedzieć,żeistniejąinnezłożoności,takiejak O(2n), O(n!).Sąto złożonościwykładnicze.Programyotakichzłożonościachrozwiązująproblemy tylkodlamałych n,gdyżdladużychdziałałybybardzodługo.

Limitczasu

Obecniekomputerywykonująokoło108 operacjiwmniejniżsekundę. Wtypowychkonkursachprogramistycznych,nakomputerachsprawdzających rozwiązania,limitynawykonaniezadańwynoszązazwyczajod1do10sekund. Podczaszawodówmamyczęstopodaneograniczenienawielkośćdanych,dziękiczemumożemysiędomyślaćwjakiejzłożonościpowinnozostać rozwiązanezadanie.Jesttozwykledużeułatwienie,gdyżmożemyszukać

rozwiązaniadziałającegowokreślonejzłożoności,zamiastszukaćszybszych rozwiązań.Przykładowo,dla:

• n 1000000oczekiwanazłożonośćczasowato O(n)lub O(n log n),

• n 10000oczekiwanazłożonośćczasowato O(n2),

• n 500oczekiwanazłożonośćczasowato O(n3).

Pamiętajmy,żelimityniesąścisłe,atylkoprzybliżone.Częstozależąone odkonkretnegozadania.Jeślistwierdzimy,żeprogramwykonujedużoponad 108 operacji,topowinniśmysięzastanowić,czynieistniejeszybsze(olepszej złożonościczasowej)rozwiązanieproblemu.

Złożonośćpamięciowa

Rozwiązujączadania,należyrównieżzwrócićuwagęnalimitdostępnejpamięci.Limitpamięciokreśla,jakdużozmiennychmożemyzadeklarować. Wprzybliżeniu,jeślimamystałąliczbęzmiennych,tozłożonośćpamięciowa wynosi O(1).Jeżelipotrzebujemyzadeklarowaćtablicęz n elementami,to złożonośćpamięciowawynosi O(n)(analogicznie,jakprzyzłożonościczasowej).Wzadaniachkonkursowychlimitpamięciokreślanyjestw megabajtach, wskrócieMB.Wartowiedzieć,żekażdazmiennatypu int zajmuje4 bajty, atablicamilionatakichzmiennychzajmujeokoło4MB.

Wartozauważyć,żeniezawszewszystkichzmiennychistrukturdanych potrzebujemyużywaćwtymsamymczasie.Dziękitemumożemyoszczędzaćpamięć,używającjednejzmiennejdoróżnychcelów(poprzezjejnadpisywanie).

Ćwiczenie

Problem: Dladanego n mamyobliczyćsumęliczbcałkowitychod1do n. Rozwiązanie: Zadaniemożemyrozwiązaćnakilkaróżnychsposobów.Osoba niezdającasobiesprawyzezłożonościczasowejmogłabyzwiększaćwynik ojeden.

1.7.Rozwiązaniebrutalne—złożoność O(n2 )

1 for (int i =1;i<=n;i++)

2 for (int j=1;j<=i;j++)

3 wynik++;

Zastanówmysię,jakprzyspieszyćpowyższyprogram.Zamiastpojedynczegozwiększaniawyniku,moglibyśmyzwiększaćgohurtowo—kolejno o1, 2,...,n

1.8.Rozwiązaniewolne—złożoność O(n).

1 for (int i =1;i<=n;i++)

2 wynik+=i;

Cociekawe,powyższerozwiązaniemożnajeszczebardziejprzyspieszyć.

Wypiszmyciąg1, 2,...,n,atużpodnimtensamciągwodwrotnejkolejności. Dodajmyliczbyztychsamychkolumn.

Pozsumowaniu,wkażdejkomórcepojawiłasięwartość n +1,dziękiczemu możemyłatwoobliczyćwzórnacałkowitąsumę.

1.9.Rozwiązanieszybkie—złożoność O(1).

1 wynik =n * (n+1)/2;

Wzależnościodlimitówwzadaniupowyższerozwiązaniamogąbyćakceptowanebądźnie.Przykładowo,jeślimamyzadeklarowane,że:

• n 10000,towszystkieprogramypowinnyzostaćzaakceptowane,

• n 1000000,torozwiązaniebrutalnewykonaokoło1012 operacji,co zwyklespowodujeprzekroczenielimituczasu.Rozwiązaniewolneiszybkie powinnozostaćzaakceptowane,

• n 1010,totylkorozwiązanieszybkiepowinnozostaćzaakceptowane.

Zadaniatreningowe

Zadanie:Żabka

Konkurs: VIIIObózInformatyczny ilocamp Autorzadania: JacekTomasiewicz Pamięć: 32MB

Małażabkachcesięprzedostaćnadrugąstronędrogi.Początkowoznajdujesię

wpunkcie x,akoniecdrogijestwmiejscu y.Żabkaskaczezawszeoodległość równą s. x y s s s

Zastanawiamysię,ileconajmniejskokówwykonażabka,nimdoskoczydo końcalubprzeskoczykoniecdrogi.

Wejście

Pierwszywierszwejściazawiera3liczbycałkowite x,y,s (1 x<y,s 109) oznaczająceodpowiednio:pozycjężabki,koniecdrogiorazdługośćskoku żabki.

Wyjście

Pierwszyijedynywierszwyjściapowinienzawieraćjednąliczbęcałkowitą równąminimalnejliczbieskoków,poktórychwykonaniużabkadoskoczydo końcadrogilubgoprzeskoczy.

Przykład

Dladanychwejściowych: 108530

Zadanie:Chodnik

Poprawnąodpowiedziąjest: 3

Konkurs: V ObózInformatyczny ilocamp Autorzadania: JacekTomasiewicz Pamięć: 32MB

Edeknapisałkredąnachodnikuwszystkieliczbycałkowiteod1do n wlosowej kolejności.Następnieposzedłdosklepu.Popowrociezauważył,żebrakuje jednejliczby.PomóżEdkowiipowiedz,którejliczbybrakuje!

Wejście

Pierwszywierszwejściazawierajednąliczbęcałkowitą n (1 n 500000), którawskazuje,ileliczbwypisałEdek.

Kolejnywierszzawiera n 1liczbcałkowitych l0,l1,...,ln 2 (1 li n), gdzie li oznacza i-tąliczbęnachodniku(popowrocieEdkazesklepu).

Wyjście

Pierwszyijedynywierszwyjściapowinienzawieraćjednąliczbęcałkowitą— liczbę,którejbrakujenachodniku.

Przykład

Dladanychwejściowych: 5 2315 Poprawnąodpowiedziąjest: 4

Zadanie:Taśma ⋆ ⋆

Konkurs: IIIObózInformatyczny ilocamp Autorzadania: JacekTomasiewicz

Pamięć: 32MB

Jaśznalazłwdomudługątaśmę.Bezchwilinamysłunapisałnataśmie pewienciągliczbcałkowitych.Terazchciałbyprzeciąćtaśmęwpewnym miejscu,takabyróżnicamiędzysumąliczbnajednymkawałku,asumą liczbnadrugimkawałkubyłajaknajbliższazeru.Chcielibyśmyznaćwartość bezwzględnąztejróżnicy.

Wejście

Pierwszywierszwejściazawierajednąliczbęcałkowitą n (2 n 1000000), oznaczającąliczbęliczbnataśmie.Drugiwierszwejściazawiera n liczb całkowitych a0,a1,...,an 1 ( 1000 ai 1000),gdzie ai oznacza i-tą liczbęnapisanąnataśmie.

Wyjście

Pierwszyijedynywierszwyjściapowinienzawieraćjednąliczbęcałkowitą, równąminimalnejwartościbezwzględnejróżnicysumliczbnaobukawałkach.

Przykład

Dladanychwejściowych: 5 31243 Poprawnąodpowiedziąjest: 1

Rozwiązania

Przedczytaniemrozwiązańwartoprzeczytaćpunkt Konwencje wrozdziale Odautora.

Żabka

• Zadaniemożnarozwiązaćwczasie O(1).

• Różnicęmiędzykońcemdrogiapunktemstartowymnależypodzielićprzez długośćskoku.

1 wynik=1+(y-x-1)/s;

Chodnik

• Zadanie możnarozwiązaćwczasie O(n)orazwpamięci O(n)lub O(1).

• Wpamięci O(n)liczbymożna włożyć doodpowiadającychimkomórek wtablicy.Przykładowo,liczbę5wkładamydokomórkioindeksie5.Na koniecwystarczysprawdzić,którejzliczbbrakuje.

• Wpamięci O(1)możnaskorzystaćzewzorunasumęliczbod1do n,czyli s = n·(n+1) 2 .Następnieod s wystarczyodjąćsumęwszystkichliczb,które pozostałynachodniku.

• Szkicrozwiązania(zakładamy,że suma tosumawszystkichliczbnachodniku):

1 s=(n * (n+1))/2;

2 wynik=s-suma;

Taśma

• Zadanie możnarozwiązaćwczasie O(n).

• Znającsumęwszystkichliczborazsumęliczbpolewejstronie,można obliczyćsumęliczbpoprawejstronie.

• Szkicrozwiązania(zakładamy,że s tosumawszystkichliczb):

1 wynik=2 * 1000+1;

2 for (int i=0;i<n-1;i++){

3 lewa+=a[i];

4 prawa=s-lewa;

5 roznica=abs(lewa-prawa);

6 wynik=min(wynik,roznica);

7 }

Wprowadzenie

Komputerwkroczyłniepostrzeżeniewżyciekażdegoznas.Prawiecodziennieposzukujemyinformacjiwinternecie,komunikujemysięzeznajomymi, wysyłającsmsy,rozmawiamyprzezSkype’a,kupujemyprzezkomputerbilety napociąglubdokina,bawimysię,grającnanimwgry.Zjednejstrony stałosiętomożliwedziękirozwojowitechnologii,któradoprowadziłado miniaturyzacjiurządzeńelektronicznychprzyjednoczesnymzwiększaniuich mocyobliczeniowej—procesorysącorazszybszeisąwstanieprzechowywać orazprzetwarzaćcorazwięcejdanych.Zdrugiejstronykomputerjesttylko urządzeniemelektronicznymopotencjalnienieskończonychmożliwościach, którenieznalazłybytakpowszechnegoiszerokiegozastosowania,gdybynie pomysłowośćiumiejętnościtwórcówprogramówkomputerowych.Komputer jestwstaniewykonywaćjedynieto,conakażemuprogramistazapomocąprogramu.Programkomputerowyjestprecyzyjnymzapisemalgorytmuwjęzyku, któryjestzrozumiałydlakomputera—wjęzykuprogramowania.Algorytm zaś,potocznie,toprecyzyjnyprzepisopisującydziałanie,któremożebyć wykonaneprzezczłowieka,komputerlubinnemedium,niekoniecznierozumiejąceistotępodjętegodziałania.Dziedzinęinformatyki,którazajmujesię badaniemalgorytmów,nazywasię algorytmiką.

WybitnyizraelskiinformatykDawidHarelwswojejznakomitejksiążce Rzeczoistocieinformatyki.Algorytmika napisał: Przepisyokreśliliśmymianemalgorytmów,obszarzaśludzkichdociekań,wiedzyidoświadczeńdotyczącychalgorytmównazwiemyalgorytmiką. Idalej: Algorytmikatowięcej niżdziałinformatyki.Tkwionawcentrumwszystkichdziałówinformatyki WtymmiejscuprzypomnijmyjeszczesłowaDonaldaKnutha(pierwszego badacza,któryzająłsięsystematycznymbadaniemalgorytmów)zjegotrylogii Sztukaprogramowania: Procesprzygotowywaniaprogramudlakomputera cyfrowegojestpociągającynietylkozewzględunapotencjalnekorzyściekono-

miczneczynaukowe.Wiążąsięznimrównieżprzeżyciaestetyczne,podobne dotworzeniapoezjilubkomponowaniamuzyki.

KsiążkaJackaTomasiewiczajestznakomitymwprowadzeniemwświat algorytmówiprogramowaniadlapoczątkującychiśredniozaawansowanych, którzychcąosiągnąćmistrzostwownajbardziejpodstawowymdzialeinformatyki,jakimjestalgorytmika.Znakomiciedobranezadaniaiodpowiednie stopniowanietrudnościpozwalająpoczątkującyminformatykomzapoznać sięzpodstawowymimetodamiprojektowaniaianalizowaniaalgorytmówze szczególnymuwzględnieniemichzłożonościobliczeniowej.Autorzebrałzadania,którezpowodzeniemwykorzystywałnazajęciachzmłodymiadeptami algorytmikizeszkółponadgimnazjalnychigimnazjów.Jakomłodyczłowiek, finalistaOlimpiadyInformatycznej,doskonalerozumie,cojestnajtrudniejsze wpoznawaniualgorytmikinapoczątkowymetapie.Dlategostarasiętrudne tematytłumaczyćbezspecjalnegoformalizmu,językiemwpełnizrozumiałym nawetdlagimnazjalisty.

KsiążkaJackaTomasiewiczajestgodnapolecenianietylkowszystkim zainteresowanymalgorytmikąiprogramowaniem.Będzietakżepomocna wpowszechnymnauczaniualgorytmikiwgimnazjachiszkołachponadgimnazjalnych.Zbioruzadańzprzystępnymizadaniamialgorytmicznymibardzo brakowało.GorącopolecamksiążkęautorstwaJackaTomasiewicza!

prof.drhab.KrzysztofDiks

PrzewodniczącyKomitetuGłównegoOlimpiadyInformatycznej InstytutInformatykiUniwersytetuWarszawskiego

Odautora

Programowaniewdzisiejszychczasachstajesięcorazbardziejpopularne. Jestnatyleważnąumiejętnością,żejegonauczaniezaczynasięodszkół gimnazjalnychlubnawetpodstawowych.Wprogramachnauczaniajestcoraz więcejalgorytmiki.Pojawiająsiętakietematy,jakrozwiązywanieproblemów zzastosowaniempodejściaalgorytmicznego.Udziałdużejliczbyuczestników wOlimpiadzieInformatycznejdedykowanejuczniomszkółponadgimnazjalnychorazwOlimpiadzieInformatycznejGimnazjalistówświadczyopopularnościprogramowaniawśródmłodychosób.

Początkiprogramowaniaipierwszepróbyrozwiązywaniazadańalgorytmicznychmogąbyćjednakbardzotrudne.Wieleosóbpoddajesięjużpokilku nieudanychpodejściachrozwiązaniazłożonychproblemów.Istniejewieleksiążekpoświęconychanaliziezaawansowanychalgorytmów,abrakujemateriałów dlapoczątkującychiśredniozaawansowanychorazksiążekdlanauczycieli, którzysąbardzoważniwprocesiekształceniaprzyszłychprogramistów.

Książkatajestswegorodzajuwstępemdoalgorytmikiorazpodręcznikiem nauczania.Niezawieratrudnych,zaawansowanychalgorytmów,którychopis możnaznaleźćwwieluinnychźródłach.Zawierazatoopisiimplementację najważniejszych,prostychalgorytmóworazzbiórzadańumożliwiających przećwiczenieichwpraktyce.

Grupądocelowąksiążkisąnietylkouczniowierozpoczynającyswoją przygodęzalgorytmiką,aletakżenauczycieleinformatykiposzerzającyswoją wiedzęalgorytmiczną.Książkamaszansęwpłynąćpozytywnienajakość kształceniaucznióworazdoprowadzićdozwiększenialiczbyosóbstartujących wkonkursachinformatycznych.

Pomysłnaksiążkęnarodziłsiępodczasorganizacjikonkursów,kółnaukowychorazobozówinformatycznychnaróżnympoziomiezaawansowania. Największymwyzwaniembyłowymyślenieprostych,lecznietrywialnych

zadańorazprzekazaniewiedzyosobompoczątkującym.Wksiążcezostały umieszczonenajciekawszeinajbardziejodpowiedniezadaniazbieraneiprzygotowywaneprzezautoraodmomenturozpoczęciastudiów.Najważniejsze tematyzostaływybranenapodstawiedoświadczeniazośmiulatnauczania.

Wprzypadkujakichkolwiekpytańdotyczącychksiążkiprosimyokontakt doautoranaadresmailowy programernia@gmail.com.Autorprowadzi równieżzajęciazprogramowania.Jeślichciałbyśsiędowiedziećwięcejna temattychzajęć,skontaktujsię,piszącnapodanyadres.

Strukturaksiążki

Książkaskładasięz18rozdziałów,wktórychsąomawianealgorytmyoraz technikiprogramowaniastosowanewpoczątkachnauczaniaalgorytmiki. Rozdziałyzostałyułożonechronologicznieiporuszajątematyzróżnych dziedzin,takichjakstrukturydanych,teorialiczbiteoriagrafów.

Każdyrozdziałzostałpodzielonynatrzyczęści.Wpierwszejznich wkrótki,przystępnysposóbjestopisanawybranatechnikaprogramowania lubalgorytmwrazzjegoimplementacją,abyzaznajomićCzytelnikazomawianymtematem.Drugaczęśćtoćwiczenie,któreporuszaproblematykę zagadnieniaiprezentujesposóbwykorzystaniaalgorytmuwzadaniach.Wkażdymćwiczeniuzostałprzedstawionydokładnyopisrozwiązaniaproblemu. Trzeciaczęśćzawierazestawtrzechzadańtreningowychorosnącymstopniutrudności,dziękiktórymCzytelnikmożesprawdzićnabyteumiejętności wpraktyce.Dodatkowo,dokażdegozadaniazostałyprzygotowanewskazówki —pokilkapodpowiedzi,któremogąbyćpomocnepodczasrozwiązywania zadania.Elementyimplementacjialgorytmóworazrozwiązańzadańzapisane sąwpopularnymobecniejęzykuC++.

WdodatkuAznajdujesięlista26bardziejzaawansowanychalgorytmówistrukturdanych(zkrótkimopisem),ułożonychodnajprostszychdo najtrudniejszych.WdodatkuBjestpodanyopisstandardowejbiblioteki wzorców(STL),czylizbiorubibliotekwC++przydatnychwimplementacji algorytmów.

Ćwiczeniaizadaniatreningowe

Poszczególnerozdziałyksiążkizawierajązadaniazwiązanezomawianątematyką(łącznie18ćwiczeńiponad50zadańtreningowych).Wiedzapotrzebna dorozwiązaniakolejnychzadańznajdujesięwrozdziałachjepoprzedzających. DziękitemuCzytelnik,poprzyswojeniumateriałuzawartegowkolejnych

rozdziałach,będziewstanierozwiązaćwszystkiezadania.Większośćznich pochodzizogólnopolskichkonkursówinformatycznych,takichjakOlimpiada InformatycznalubPotyczkiAlgorytmiczne,orazzobozówinformatycznych ILOCAMP.Zadaniazostałypodzielonenaczterykategorieisąoznaczone minimalniejedną(zadaniaproste),amaksymalnieczteremagwiazdkami (zadaniabardzotrudne).

Wzadaniachprostychorazośredniejtrudnościdorozwiązaniawystarczy podstawowaznajomośćpewnegoalgorytmuorazumiejętnośćjegopraktycznegozastosowania.Charakteryzująsięwysokimodsetkiempoprawnychrozwiązańprzezuczestnikówkonkursów,wktórychzadaniazostałyużyte,oraz łatwościązrozumieniarozwiązania.Zadaniatrudnewymagajądodatkowego pomysłu.Cowięcej,mogąwymagaćzastosowaniaalgorytmówzpoprzednich rozdziałóworazcechująsiębardziejzłożonąimplementacją.Zadaniabardzo trudnezawierajązłożoneproblemy,wktórychwykorzystaniealgorytmównie jestłatwodostrzegalne.Charakteryzująsięmałymodsetkiempoprawnych ioptymalnychrozwiązańprzezuczestników.Przypisaniepoziomutrudności bazujenadoświadczeniuautorawpracyzuczniamioraznastatystykach zprzeprowadzonychkonkursów.

Testowanierozwiązań

Rozwiązaniazadańtreningowychmożnaprzetestowaćwserwisienastronie internetowej http://main2.edu.pl.Powybraniuodpowiedniegokursu http://main2.edu.pl/c/zadania-pwn izadaniawysłanykodzostanie przetestowanypodwzględempoprawnościorazwydajności.

Wymaganiawstępne

Książkadotyczyalgorytmiki,aniekonkretnegojęzykaprogramowania. Wszystkieprzedstawionewksiążcealgorytmysązaimplementowanewjęzyku C++,któregoskładnięCzytelnikmożepoznawać,czytająckolejnerozdziały. Początkowowystarczyznajomośćpodstawjednegojęzykaprogramowania, takichjakwarunki,pętleitablice.

Konwencje

Przedstawioneimplementacjezakładają,że:

• wszystkiezmiennesąpoczątkowowyzerowane,

• pomijamywczytywanieiwypisywaniedanychorazzałączaniebibliotek,

• elementywtablicachsąumieszczoneodindeksu0,chybażenapisano inaczej.

Metodypracy

Książkamożebyćwykorzystywanaprzezuczniówdosamodzielnejnauki podstawowychalgorytmóworazprzezosobychcąceposzerzyćswojąwiedzę algorytmiczną.Możeteżbyćdoskonałympodręcznikiemdlanauczycieli uczącychwszkołachlubdlawykładowcówprzeprowadzającychdodatkowe zajęciainformatyczne.

Poniżejprzedstawionometodypracydlaosóbdokształcającychsięsamodzielnieorazdlanauczycieliprzekazującychswojąwiedzęinnym.

Douczniów

Naukęalgorytmikiwartorozplanowaćwczasie.Przykładowo,możnasięzobowiązaćdoprzerabianiajednegorozdziałutygodniowo.Wszystkierozdziały majątakąsamąformę,wartowięczapoznaćsięzopisempracyzpojedynczego rozdziału.

1. Napoczątkuprzeczytajzezrozumieniemopisalgorytmulubtechnikiprogramowania(całośćdoczęścizćwiczeniem).Wopisachczęstoznajdziesz implementacje,którewartodokładnieprześledzić.

2. Drugaczęśćtoćwiczenie.Zanimprzeczytaszrozwiązanie,spróbujje wymyślićsamodzielnie.Wystarczyogólnypomysłnarozwiązanie,bez implementacji.Następnieopisanerozwiązanieporównajzwymyślonym przezsiebieiostateczniejezaimplementuj(abyśbyłpewien,żezrozumiałeś algorytm).

3. Trzeciaczęśćtozadaniatreningoweułożoneodnajprostszychdonajtrudniejszych.Powymyśleniuoptymalnegorozwiązaniaspróbujjezaimplementowaćiprzetestowaćpodwzględempoprawnościiwydajności. Wprzypadkuproblemówzpomysłemnaalgorytm,nakońcurozdziału znajdzieszwskazówkiułatwiającewymyślenierozwiązania.Poprzeczytaniukażdejznichspróbujponowniepodejśćdozadania.Jeślipoprzeczytaniuwszystkichniebędzieszwstaniezrozumiećanizaimplementować rozwiązania,toodłóżzadanienapóźniejiprzejdźdokolejnegorozdziału (aletylkowprzypadku,gdyrozwiążeszconajmniejjednozadanie).Każdy rozdziałzawieraprzynajmniejjednotrudnezadanie,dlategonieprzejmuj sięwprzypadkunieudanychpróbjegorozwiązania.

Zawszewartodokumentowaćpostępywnauce.Przykładowo,możesz utworzyćtabelęizaznaczać,którerozdziałyjużprzeczytałeśijakiezadania

udałoCisięrozwiązać.Takiepostępowaniemotywujedodalszejpracyoraz pozwalaśledzićpostępywnauce.

Poprzerobieniuwszystkichrozdziałówmożeszprzejśćdokolejnych,bardziejzaawansowanychtematów.WdodatkuBznajdzieszlistę26najważniejszychalgorytmów.Dokładniejszyopistychzagadnieńmożeszznaleźćwwielu informatycznychksiążkach,takichjak Algorytmyistrukturydanych [BDR] czy Wprowadzeniedoalgorytmów [WDA].

Donauczycieli

Poniżejznajdujesięopispracydlanauczycielauczącegogrupęosóblub przeprowadzającegoindywidualnekorepetycje.Początkowowartozaznajomić sięzewszystkimirozdziałamiirozplanowaćnauczaniewczasie.Wmiarępotrzebmożnawprowadzićkilkazagadnień,któreniezostałyopisanewksiążce. Mogątobyćtematypoprzedzające(takiejaknaukaprogramowania)lub tematypomiędzyrozdziałami(takiejakrekurencja,systemyliczbowelub szyfrowanie).

Pierwszaczęśćtoprzedstawienieuczniomzagadnieńteoretycznych,czyli omówieniealgorytmuipokazanieimplementacji.Jesttobardzoważnyfragment.Należywówczaskontrolować,czyuczniowienadążajązprzyswajaniem materiału.

Drugaczęśćtoćwiczenieteoretyczno-praktyczne,wktórympomysłna rozwiązaniebędzieszukanywspólnieznauczycielem.Nauczycielpokazuje ćwiczenieidajeuczniomtrochęczasunasamodzielnezastanowieniesięnad problemem.Następniechętneosobymogąprzedstawićswojespostrzeżenia, anauczycielnaprowadzagrupęnarozwiązanie.Wtejczęściważnejestpokazanieprocesuwymyślaniarozwiązania.Nakoniec,celempełnegozrozumienia, uczniowiepowinnizaimplementowaćrozwiązanie.

Trzeciaczęśćtozadaniatreningowe,któresprawdzająpraktycznąwiedzęuczniów.Wybórzadańpowinienbyćdostosowanydopoziomugrupy. Wprzypadkusłabszychgrupiograniczonegoczasunależyzadaćwyłącznie najprostszezadanie,natomiastwprzypadkumocniejszychgrupwartodać wszystkiezadania.Rozwiązywanieiimplementowaniemożeodbywaćsię wtrakcietakzwanegolaboratorium,wktórymnauczycielmożerozważnie pomagaćuczniom.Zadaniamogąbyćrównieżzadanejakopracadomowa. Zawszepoupływieterminunarozwiązywaniezadańnależyprzedstawićcałej grupiedokładnąmetodęrozwiązania(najlepiejwformiepodobnejdoćwiczeń) orazzachęcićuczniówdoimplementacjirozwiązań.

Poprzerobieniuwszystkichrozdziałównauczycielmożeprzejśćdobardziej zaawansowanychalgorytmów.Propozycjalistytakichzagadnieńznajdujesię wdodatku B

Podziękowania

Książkatapowstałanapodstawiemojejpracymagisterskiej,którąobroniłemwczerwcu2015rokunaUniwersytecieWarszawskim.Pracabyła pisanawlatach2013–2014,jednakmateriałydoniejpowstawałyrównież wlatachwcześniejszych.Ogromniedziękujęopiekunowipracy,dr.Jakubowi Radoszewskiemu,zacenneuwagimerytoryczne,poświęconyczasorazwielkie zaangażowanie.

DziękujęrównieżGrzegorzowiJakackiemu—szefowifirmyCodility— zawsparcieorazumożliwieniejednoczesnegopogodzeniapracyzawodowej orazpisaniapracymagisterskiej.Wielkiepodziękowanianależąsiętakże dr.MarcinowiKubicy,dr.TomaszowiIdziaszkowiorazPrzemysławowiJakubowiKozłowskiemuzacennewskazówkiorazuwagimerytorycznedotyczące pracy.

Jednymzwyzwańpodczasgromadzeniamateriałówdopracybyłproces wybieraniaodpowiednichzadań.ChciałbympodziękowaćJoannieBujnowskiej zaudostępnienieswoichzadań Wesołamałpka i Drzewko,dr.Jakubowi Radoszewskiemuzaudostępnieniezadań Liczbydoskonałe i Spotkanie oraz dr.MarcinowiKubicyzaudostępnieniezadania Obwód Podziękowaniakierujęrównieżdoprof.KrzysztofaDiksa—świetnego wykładowcyorazprzewodniczącegoKomitetuGłównegoOlimpiadyInformatycznej—zamerytorycznewsparcieorazwszelakąpomoc.Dziękujęteż IreneuszowiBujnowskiemu—znakomitemunauczycielowi,któryzaszczepił wemniepasjędoinformatyki.

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.