

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.