You are on page 1of 1120
Thomas ih Goren Gharies [2 Laisarsen RonaldiaRivest iva “aleorytméw Wydawnictwa Naukowo-Techniczne Warszawa Dane o oryginale: Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest Introduction to Algorithms Copyright © 1990 by The Massachusetts Institute of Technology Thirteenth printing, 1994 Redaktorzy Izabela Ewa Mika Ewa Zdanowicz Okladke i strony tytulowe projektowat Pawel G. Rubaszewski Opracowanie techniczne Ewa Eckhardt Prrygotowanie do druku Marta Jecres, Marianna Zadroina © Copyright for the Polish edition by Wydawnictwa Naukowo-Technicme Warszawa 1997, 2008 All Rights Reserved Printed in Poland Utwér w caloici ani we fragmentach nie moze by¢ powielany ani rozpowszeconiany za pomocy urzydzeh elektronicenych, mechantezych, kopiujgcych, nagrywajgcych i innych, w tym rownied nie mode byé umieszczany ani rozpowszechniany w postaci eyfrowej zaréwno w Internecie, jak i w sieciach lokalnych bez pisemnej zgody posiacacza praw autorskich. Adres pocrty elekironicenej: wnt@pol.pl Strona WWW: www.wnt.com.pl ISBN 83-204-2665-0 Spis tresci Przedmowa ...........00 00s Penne tenet . 13 1. 2 at 26 32 ‘Metoda , dziel i zwyciezaj” - : 32 Analiza algorytméw typu ,dziel i zwgcigial” « 34 36 Czesé | Podstawowy aparat matematyczny 2. Rzedy wielkogci funkeji .. . . 44 21. Notagja asymptotyezna ..... 45 22, — Standatdowe notacie i typowe funkeje . 4 3. 64 A. ot 32 Szacowanie wartoéci sum 8 A, Rekurencje 6... eee ete teen 7 4.1. Metoda podstawiania ® 42. Metoda iteracyjna 82 43, Metoda rekurencfi uniwersalnej 86 #44. Dowéd twierdzenia o rekurencji uniwersaing| a 44.1, Dowéd dla doktadnych poteg . 90 44.2. Czesci catkowite liczd 96 SPIS TRESCI 5. Zbiory i nie tylko... 103 $1. Zdiory .. 103 Relacje ... - 108 Funkeje - 0 Graly ... 3 Dreewa .. uy Drzewa wolne nT Drzewa vkorzenione i uporzadicowane . 120 Drzewa biname i pozycyjne 121 6. Zliczanie i prawdopodobieristwo . 126 61. Zliczanie.. 2.20.20... 126 62. Prawdopodobiesistwo . . 132 63. Dyskretne zmienne losow 139 64. Rozktady geometryeane i cwumianowe | 144 *65. Kratice rozkladu dwumianowego 150 6.6. Analiza probabilistyczna 157 66.1. Paradoks dnia urodzin . 157 662. Kuleiumy..... 160 6.63. Clagi ,dobrej pasty”, czyli sukcesdw . 162 CzeSé Il Sortowanie i statystyki pozycyjne 7. Heapsort ~ sortowanie przez kopcowanie . ‘ 173 1, 173 7.2. Preywracanie whisnoici kopoa 1s 73. Budowenie kopca ..,... qr 7.4. Algorytm sortowania przez kopoowanie (heapsor!) 180 75, Kolejki priorytetowe 181 8. Quicksort - sortowanie szybkie . . 186 8.1. Opis algorytmu ........, 186 8.2. Czas dzialania algorytmu quicksort . 189 83. Probabilistyeone wersje algorytioa quis 194 84, i 196 84.1, Analiza przypadku pesymistycrnego . 196 842, Analiza praypadku iredniego 197 9. Sortowanie w czasie liniowym ......... 206 9.1. Dolne ograniczenia dia problemu sortowani 206 92. Sortowanie przez zliczanie . 210 9.4, Sortowanie pozycyjne . . 22 94. — Sortowanie kubetkowe . .. 25 10. Mediany i statystyki pozycyjne . . toes 220 10.1. Minimum i maksimum |... 221 10.2. Wybér w oczekiwanym czasie liniowym . 222 10.3. Wybér w pesymistycmym czasie liniowym . 2s SPIS TRESCI Czesé lil Struktury danych 11, Efementarne struktury ganych bee cea Lee eee ene 111, Stosy i kotejki Listy Reprerentowanie struktar vskainikowych 2 za pomocg tablic . HLA. Reprezentowanie drzew (ukorzenionych) . 12. Tablice z haszowaniem ........ ‘Tablice 2 adresowaniem bezpoirednim ‘Tablice z haszowanicm . . Funkoje haszujace ..... . Heszowanie modularne . Haszowanie przez mnoienie . Haszowanie uniwersalne - Adresowanie otwarte 13. Drzewa poszukiwari binarnych Co to jest drzewo poszukiwah binarnych' ‘Wyszukiwanie w drzewie posmiciwai binarnych . ‘Operacje wstawiania i usuwania . Losowo skonstruowane drzewa poszukiwati binamnych . 14. Drzewa czerwono-czarne ...... 14.1, Wiasnosei draew czerwono-czarnych . 142. Operacje rotagji . 14.3. Operacja wstawiania . 144, Operagia usuwania .. 18. Wzbogacanie struktur danych .. . 15.1. Dynamiczne statystyki pozyeyine . . 152. Jak webogacaé strukturg danych . 153. Drzewa przedzialowe . 2 284 285 287 291 295 305 WS 308 310 35 324 325 30 334 Czesé IV Zaawansowane metody konstruowania i analizowania aigorytméw 16. Programowanie dynamiczne .......... 00. eee eee Mnoienie ciggu macierzy .....-.... Podstawy melody programowania dyaarienege Najdtuiszy wspdlny podciag ..... . ‘Optymaina triangulacja wielokgta . 17. Algorytmy zachtanne..... 17.1, Problem wyboru zajeé . .. . 17.2, Podstawy strategii zachtanngj . 173. Kody Huffmana 3a 384 360 366 375 376 380 383 SPIS TRESC! * 174. ‘Teoretyczne podstewy strategii zachlannych | 1741. Matroidy ... 00.0.0 17.42. Algorytmy zachtanne na matroidzie wadonym . *17.5, Problem szeregowsnia zadati 18. Analiza kosztu zamortyzowanego ... . 18.1. Metoda kosztu sumarycmego ..... - 18.2, Metoda Kelegowania ...... 18,3, Metoda potencjatu 184, Trblice dynamicme 18.4.1. Powigkszanie tablicy 18.42. Powigkszanic i zmniejszanie tablicy » 408 . 4 1 ats 301 391 393 398 . 403 404 41s ats CzeSé V Ztozone struktury danych 18. B-drzewa ..... beets peer eee eee e eee foes 19.1, Definicja B-drzewa 19.2. Podstawowe operasie na Bedrzewach . 19.3. Usuwanie klucza z B-irzewa ..... - 20. Kopce dwumianowe........ 201, Drzewa i kopoe dwumianowe 20.1.1. Drzewa dwumienowe . 20.1.2. Kopce dwumianowe . 20.2. Operagje na kopcach dwumianowych . 21. Kopce Fibonacciego . 21.1, Struktura kopeéw Fibonacciego 21.2. Operacje kopea zigcvalnego . 213. Zmoiejszanie wartotei klucza i urswanie wezta . 2b4, Oszacowanie makeymalnego stopnia 22, Struktury danych dla zbior6w roziqeznych ............2005 see 22.1. Operacje na zbiorach rozigcznych 22.2, Listowa reprezentacja zbiordw rozigcmych . 223. Lasy zbiorSw roztecmych *224, Analiza metody taczenia wedlug rangi z kompresiq éciedki "aso = 460 433 437 4a7 + 454 455 456 + 475 416 a9 488 ~ 492 498 501 405 Czesé VI Algorytmy grafowe 23. Podstawowe algoryimy grafowe . 23.1, Reprezontacie graféw . 23.2, Praeszukiwanie wazerz 23.3. Praeszukiwanie w gab 234. Sortowanie topologiczne SPIS TRESCI 23,5. Silmie spojae skiadoWe 60. cece eee cena teens 352 24. Minimalne drzewa rozpinajgce -.,........ 562 241. Roarastanie sig minimalnego eae rozpinajacego . 563, 24.2. Algorytmy Kruskala i Prime . : 568 25. Najkrétsze Sciezki z jednym érédiem . 578 25.1. Najlrdtsze éciezki i selaksacja....... 583 25.2. Algorytm Dijkstry ...... 593 253. Algorytm Bellmana-Forda . 598 254. Najkrotsze sciezki 2 jednym ixédiem we Y acyiicanych each serowanych »- 603 25.5. Ograniczenia rémnicowe i najkrétsze écietki . 606 26. Najkrétsze Sciezki migdzy wszystkimi parami wierzchotkéw . 618 26.1, Najkrdteze éciezki i mnodenie macierzy 621 26.2. Algorytm Floyda-Warshella . 627 263. ‘Algorytm Johnsona dla grafsw rzadkich . 634 *264. Ogdlny schemat rozwigzywania preblemow sictkonsch w elie skigrowanych .. . vee 639 27. Maksymalny przeptyw - B48 271, — Sieci preeplywowe 650 27.2. Metoda Forda-Fulkersona ... 659 27,3, Maksymalne skojarzenia w grafach dwudzielnych 673 *274. — Algorytmy praodprzeplywowe 678 * 27.5, Algorytm ,,podnies j przesui na poczal 1 Czesé VIL Wybrane zagadnienia 28. Sieci sortujgce .... 3 28.1. Sieci pordwnuigee m4 28.2. Zasada zero-jedynkowa . 78 283. Bitoniezna siet sortujgca 721 WA, Sigg scalajgca 25 28.5, Sieé sortujaca Rt 29. Uktady arytmetyozne .... 733 Ukiady kombinacyjne . Te Ublady sumujace - 79 . Sumator szeregowy . Sumator rownolegty 741 Sumator z zapamietywaniem przeniesieti . Wat Ukiady mnoiace ... 750 |. Tablicowy uktad mnolgcy « 751 . Drzewa Wallace’a ... . 755 ‘Uktiady z taktowang pamiecit 758 Bitowy sumator szeregowy 758 .2. Wektorowe uklady mnozgce 761 ‘SPIS TRESC| 30. Algoryimy réwnolegte ve 789 301. Proeskakiwanie . 174 |. Ustalanie poreadku obiekt : 14 Rownolegie obliczenia prefiksowo na liscie . TR Metoda cyklu Eulera . - 780 Algorytmy typo CRCW a algorytmy typu EREW . 784 ‘Twierdzonie Brenta i sekwencyina ofcktywnose . . . 792 Sckwencyjnie efektywne rownolegte obliczenia prefiksowe . 91 Deterministycme famanie symetrii 31. Operacje na macierzach .........- 00.0.0 815 LL. Wiasnosci macierzy . 826 312. Algorytm Strassena mnoienia macieczy |... 826 #313, Réine struktury algebraicee { mnotenie macierzy boolowshich . 834 314. Ronwigzywanie uktadéw rownadi liniowych . 839 31.5. Odwracanie macierzy . . . 853 31.6. Symetryczne macierze dodatnio okreffone j i metoda najmniejszych Awadratow ©... 151 seseeeaee. B58 32, Wielomiany i FFT 2.0... c eee ee cee eee seen 870 321, Reprezentacja wielomiandw . 372 322. DFTiFFT....... 879 32.3,‘ Bfoktywne implementacje FFT - 387 33. Algorytmy teorioliczbowe ......... ence enna shee eee ag7 33.1. Podstawowe pojecia teorii liczb . .. 808 33.2 Najwigkezy wepétny dzietnik 905 333, Arytmetyka modulama . on Rozwigrywanie liniowych rownat modern 918 Chitiskie twierdzenie o resztach . 922 Potegi elementu 926 System kryptopraficeay z kluczem jawnym RSA _ 930 Sprawdzanie, czy licaba jest liczby pierwszq . 93a7 Rozkiad na czynniki 946 34. Wyszukiwanie wzorca...........2065 + 34.1, Algorytm ,naiwny" wyszukiwania wzorce . 34.2. Algorytm Rabine-Karpa ....... ‘Wyszukiwanie wzorca z wykorzystaniem automatow skosezonych 965 Algorytm Knutha-Morrisa-Pratta 972 Algorytm Boyera-Moore'a .... .. 980 35, Geometria obliczeniowa ...........0 0000. 330 35.4, Wiasnogei odeinkow 991 35.2. Sprawdzanic, ory jekakolwiek para odcinkOw sig prascina . - 996 353. Znajdowanie wypukiej otoczki = 1003 354, Znajdowanie pary najmniej odteglych punktow - 1013 10 spIS TRESCI 36, NP-zupetnosé . + 1022 Czas wielomianowy 36.1. oon = 1023 36.2. Weryfikacja w czasie wielomianowym . ... . 1031 36.3. NP-zupeinofé i redukowalnoée - . 1036 364. Dowodzenie NP-zupelnoici - 36.5. Problemy NP-zupene 36.51. Problem kliki .... 36.5.2. Problem pokrycia wierzcholkowego . » 1057 . Problem sumy podzbioru . . - 1089 |. Problem cyklu Hamiltona . ~-- 1062 . Problem komiwojazera . , + 1068 37. Algorytmy aproksymacyjne ....... + 1073 37.1, Problem pokrycia wierzchotkowego . ~ 1076 37.2. Problem komiwojadera oe . . 1078 37.2.1. Problem komiwojaiera z nieréwnoicig trojkata . . ~ 1079 37.22. Ogéiny problem komiwojazera . ~ 1082 37.3. Problem pokrycia zbioru . . - 1084 37.4, Problem sumy podzbiora + 1089 Literatura ee ene eee 1097 Skorowidz ee eeee o = 1107 Przedmowa Ksigzka jest wprowadzeniem do nowoczesnych metod badania algorytméw. Przedstawiligmy w niej dogtebna analizg wielu algorytmaw, przy czym staralis- my sig zrobié to w sposéb zrozumialy dla kazdego. W poszezeg6inych rozdziatach omawiamy algorytmy, metody ich projek- towania, dziedziny ich zastosowan lub inne pokrewne zagadnienia. Algorytmy sq zapisane w ,,pseudojezyku” programowania, ktéry jest zrozumialy dia kaz- dego, kto ma choé odrobine praktyki programistycznej. Ksiqzka zawiera po- nad 260 rysunkéw obrazujacych dziatanie algorytméw. Poniewaz naszym kry- terium optymalnosci algorytmdéw jest ich ,,zlozonosé”, przedstawiamy szczegd- jow@ analize czasu ich dziatania. Ksiazka ta jest przeznaczona dla shluchaczy wykiad6w z algorytméw i struk- tur danych, jak rowniez dla os6b, ktére ze wzgled6w zawodowych interesu- Ja sig ta tematyka. Do wyktadowcy Ksigzka jest uniwersalna. Moze byé wykorzystana do wykiadéw z algorytméw i struktur danych na réinym poziomic zaawansowania. Ponicwai. zawarligmy W niej znacznie wigce| materiahr niz to konieczne do semestrainego wyktadu, mozna jq traktowa¢ jak ,,worek”, z kt6rego wybiera sie to, co akurat najbar- dziej pasuje do danego wykladu. Najlepiej przygotowaé zajecia ze studentami wedlug wczesniej wybranych rozdzialéw. Tresé rozdziaiéw jest w duzym stopniu niezaledna, a wigc nie powinno byé z tym probleméw. Zlozonosé materiatu przedstawionego w kaz- dym rozdziale jest stopniowana - od probleméw mato skomplikowanych do bardziej skomplikowanych. Na wykladach dla poczatkujacych mozna korzy- staé jedynic z picrwszych podrozdzialéw kazdego rozdzialu, a na zajeciach 13 PRZEDMOWA, ze studentami wprowadzenymi juz w te tematyke odwolywaé sig do pelnych rozdzialow. Ksiqzka zawiera ponad 900 zadan i ponad 120 probleméw. Kazdy pod- rozdzial konczy sig zadaniami, a kaizdy rozdziat zestawem probleméw, Za- dania to przewaznie krotkie pytania, ktére pomoga ugruntowaé wiedze zdo- byta w danym rozdziale. Jedne z nich rozwigzuje sig w mgnieniu oka, inne wymagaja dtuzszego przemyslenia. Problemy sa bardziej skomplikowane i cze- sto obejmuja nowy material; przewaznie zawierajg kilka pytai o réznym sto- pniu trudnoéci. Bardziej zlozone czesci materiaku sq oznaczone gwiazdka (*). Nic zawsze sq trudniejsze, ale wymagaja znajomoSci bardziej zaawansowane] matematyki, lepszego przygotowania lub wi¢ksze) wyobraini algoryimiczne). Do studenta Mamy nadzieje, ze ksigzka ta lagodnie wprowadzi Cig w problemy dotyezace algorytmiki. Staraligmy sig, aby kazdy algorytm by! zrozumialy i interesujacy. Kaady krok algorytmu jest opisany tak, aby§ nie mial ktopotéw ze zgtebieniem skomplikowanej struktury calego algorytmu. Przedstawiamy tez aparat mate- matyczny potrzebny do analizy algorytméw. Jesli masz juz pewne doswiadeze- aie w tej dziedzinie, mozesz pominaé poczatkowe rozdzialy. Ksiazka jest dosyé obszerna, a wyktad bedzie prawdopodobnie obejmowat tylko czgs¢ zawartego w niej materiatu. Chcieliémy jednak, aby spetniata funk- je swego rodzaju encyklopedii przydatnej potem w pracy zawodowej. Czego wymagamy od czytelnika? « Powinien mieé pewne doswiadczenie programistyczne. W szczegdlnosci po- winien wiedzieé, na czym polega rekursja, i znaé clementarne struktury da- nych, takie jak tablice i listy. « Powinien umied przeprowadzaé dowody przez indukcjg matematyczna. Nie- ktére czeéci ksiqzki wymagaja elementarne] znajomosci analizy matema- tycznej. W czesci 1 zawarligmy jednak caty potrzebny tu material mate- matyczny. Do informatyka pracujgcego zawodowo Ksiazka ta jest doskonalym kompendium algorytméw. Poniewaz rozdzialy sq niezalezne, mozna sig skoncentrowaé na problemach, ktére czytelnika w danej chwili interesujg. Wigkszosé prezentowanych algorytméw ma dude znaczenie praktyezne; rozwazamy zatem aspekty praktycznej ich realizacji. Dia niekté- tych z niewielu algorytméw ,,teoretycznych” przedstawiamy altermatywny algorytm ,,praktyezny”. Jeéli chce sig zaimplementowaé ktéry§ z podanych PRZEDMOWA algorytmow, wystarezy przethimaczyé go z naszego pseudojezyka na wybrany jezyk programowania. Pscudojezyk umozliwia zwarta i precyzyjng prezentacie algorytmu, Nie uwzgledniamy w nim zatem obshigi bigdéw ani innych tech- nicanych aspekt6w zwigzanych z konkretnym érodowiskiem programistycz- nym. Poza tym, nie korzystajac z rzeczywistego jezyka, pomijamy inne szcze- goly techniczne dotyczace takiego jezyka, ktore moglyby zaciemnié zrozumie- nie algorytmu. Bledy W ksigice takic] objgtosci niewatpliwie nic da sig uniknaé pewnych bighow i brakéw. Bedziemy wdzigczni za przekazanie nam wszelkich uwag, Szczegol- nie mile beda widziane propozycje nowych éwiczen i probleméw, ale prosimy o dolaczanie rozwiazah. Moina je przestaé na adres Intreduction to Algorithms MIT Laboratory for Computer Science 545 Technology Square Cambridge, Massachusetts 02139 Moina tea uzyé pocaty elektronicanej, aby przekazaé nam opisy biedow, po- prosié o liste znanych biedéw lub podzielic sig konstruktywaymi uwagami. Oto adres, na ktéry nalezy sig zwracaé: algorithms@theory.Ics.mit.edu, piszgc w naptowku fistu Subject: help. Od razu zastrzegamy sie, ze nic jeste’my w stanic odpowiedzieé na wszystkie listy osobiscie. Podziekowania Wielu przyjaciol i koleg6w znacznie sie przyezynito do polepszenia jakoéci tej ksigzki. Dzi¢kujemy im wszystkim za pomoc i konstruktywng krytyke. MIT’s Laboratory for Computer Science zapewnilo idealne srodowisko do pracy. Nasi koledzy z grupy informatyki teoretycznej byli szczegdlnie toleran- cyjni wobec naszych nieustajacych prégb o krytyczng ocene rozdzialow. Na szczegélne podzickowania zastuzyli Baruch Awerbuch, Shafi Goldwasser, Leo Guibas, Tom Leighton, Albert Meyer, David Shmoys i Eva Tardos. Dzigkuje- my Williamowi Angowi, Sally Bemus, Rayowi Hirschfeldowi oraz Markowi Reinholdowi za dbalosé o nasze komputery (DEC Microvax, Apple Macintosh i Sun Sparestation), jak rowniez za rekompilacjg TEX-a, kiedy tylko przekra- czalismy limit czasu kompilacji. Firma Thinking Machines Corporation ezeé- ciowo sfinansowaia prace Charlesa Leisersona nad ta ksiazka w czasie jego nieobecnosci w MIT. 15 PRZEDMOWA Wielu naszych kolegéw uzyto roboczych wersji tej ksiazki na wykiadach na innych uczelniach. Wprowadzili wiele poprawek i zmian. Szczegdinie dzi¢- kujemy Richardowi Beigclowi (Yale), Andrew Goldbergowi (Stanford), Joan Lucas (Rutgers), Markowi Overmarsowi (Utrecht), Alanowi Shermanowi (Tufis and Maryland) i Diane Souvaine (Rutgers). Wich naszych asystentéw wniosto znaczacy wktad w powstanic tej ksiaz- ki, Na naszq wdziecznosé zastuzyli Alan Baratz, Bonnie Berger, Aditi Dhagat, Burt Kaliski, Arthur Lent, Andrew Moulton, Marios Papaefthymiou, Cindy Phillips, Mark Reinhold, Phil Rogaway, Flavio Rose, Arie Rudich, Alan Sher- man, Cliff Stein, Susmita Sur, Gregory Troxel i Margaret Tuttle. Wiele oséb stuzyto nam pomoca techniczna. Denise Sergent spedzit wiele godzin w bibliotekach MIT na przegladaniu bibliografii. Maria Sensale, biblio- tekarka naszej czytelni, zawsze byla dla nas bardzo wyrozumiata. Zezwolenie na korzystanic z prywatnej biblioteki Alberta Meyera zaoszezedzifo nam wielu godzin przeznaczonych na przygotowanie notatek do poszczegélnych rozdzia~ law. Shlomo Kipnis, Bill Niehaus i David Wilson sprawdzali stare zadania, tworzyli nowe oraz robili notatki na temat ich rozwiazywania. Marios Pape- efthymiou i Gregory Troxel pomagali przy robieniu skorowidza. Przez cate lata nasze sekretarki Inna Radzihovsky, Denise Sergent, Gayle Sherman, a przede wszystkim Be Hubbard pomagaly nam w naszych pracach nad teks- tem, za co serdecznic im dzi¢kujemy. Wiele bteddw w roboczych wersjach ksiqgzki zostalo wykrytych przez stu- dentow. Na nasza wdzigcznose zasluguja Bobby Blumofe, Bonnie Eisenberg, Raymond Johnson, John Keen, Richard Lethin, Mark Lillibridge, John Peza- tis, Steve Ponzio i Margaret Tuttle. Dzigkujemy naszym kolegom za krytyczne uwagi do niektorych rozdzia- tow i na temat pewnych algorytméw. W szczegdlnosci jestesmy wdzieczni Bil- lowi Aiello, Alkowi Aggarwalowi, Brikowi Bachowi, Vaskowi Chvatalowi, Ri- chardowi Cole’owi, Johanowi Hastadowi, Alexowi Ishiemu, Davidowi John- sonowi, Joemu Kilianowi, Dinie Kravets, Bruce’owi Maggsowi, Jimowi Or- tnowi, Jamesowi Parkowi, Thane’owi Plambeckowi, Herschelowi Saferowi, Jeffowi Shallitowi, Cliffowi Steinowi, Gilowi Strangowi, Bobowi Tarjanowi, Paulowi Wangowi. Niektérzy z naszych kolegow zaproponowali nowe prob- lemy do rozwiqzania. Byli to Andrew Goldberg, Danay Sleator i Umesh Vazi- rani. Bardzo im za to dzi¢kujemy. Ksigzka ta zostala zlotona’ za pomoca systemu LATEX. Rysunki zostaly wykonane na komputerze Apple Macintosh z uzyciem MacDraw I; dzi¢kuje- my Joannie Terry z Claris Corporation i Michaelowi Mahoneyowi z Advanced Computer Graphics za wklad w te prace. Skorowidz zostat utworzony za po- mocq programu Windex, napisanego w jezyku C. Bibliografia zostala przygo- T Doiyezy oryginalu (przyp. red.). 16 PRZEDMOWA towana z uzyciem systemu BIBTEX. Ksiqzka zostala zlozona w American Mathematical Society za pomoca systemu Autologic, dzigkujemy za to Ralp- howi Youngenowi z AMS. Okladka zostala zaprojektowana przez Jeannet Le- endertse. Projekt typograficzny ksigzki zostat opracowany przez Rebecke Daw. Amy Hendrickson zaimplementowala ten projekt w systemic LATEX. Byto dla nas prawdziwa przyjemnoscia pracowat przy tworzeniu tego tek- stu z MIT Press i McGraw-Hill. Szezegdlnie dziekujemy Frankowi Satlowowi, Terry’emu Ehlingowi, Larry’emu Cohenowi i Lorrie Lejeune z MIT Press oraz Davidowi Shapiro z wydawnictwa McGraw-Hill 2a podtrzymywanie nas na duchu i cierpliwosé. Jeste&my szczegélnie wdzieczni Larry’emu Cohenowi za doskonale zredagowanie ksiazki. Na koniec dziekujemy naszym zonom — Nicole Cormen, Lindzie Lue Lei- serson { Gail Rivest ~ oraz naszym dzieciom ~ Ricky’emu, Williamowi i Debby Leisersonom, Alexowi i Christopherowi Rivestom — za milosé i pomoc w czasie pisania ksiqzki. (Alex Rivest pomdg! rowniez przy ,,paradoksic dnia urodzin Marsjan”). Ksiazka ta powstala dzieki mitoéci, cierpliwosci i pomocy naszych rodzin. To im dedykujemy te ksiazke. Cambridge, Massachusetts THOMAS H. CORMEN March 1990 CHARLES E. LEISERSON RONALD L. Rivest Wprowadzenie do algorytmow Rozdziat 1 Wstep W tym rozdziale zaznajomimy czytelnika z podstawowymi narzedziami wyko- izystywanymi przy projektowaniu i analizie algorytméw. Nic jest tu wymaga- na znajomosé dodatkowych wiadomosci, chociazZ znajduje si¢ kilka odwolah do materiatu, ktory bedzie przedstawiony w czeéci I. Rozpoczniemy od ogdélnego oméwienia probleméw obliczeniowych i al- gorytmow shizgcych do ich rozwigzywania. Naszym wiodacym przykiadem bedzie sortowanie. Wprowadzimy ,,pseudojezyk” (umowny jezyk'} programo- wania stuzqcy do specyfikowania algorytméw, ktéry nie powinien sprawiaé trudnoéci czytelnikom majacym jakakolwiek praktyke programistyczna. Na poczatku rozwazymy presty algorytm sortowania, a mianowicie sortowanic przez wstawianie. Prreanalizujemy czas dzialania tego algoryumu i wprowadzi- my notacje okreslajgca zalegnosé czasu dzialania od liezby sortowanych ele- mentow. Przedstawimy réwniez metodg ,,dziel i zwycigzaj”, uzyteczna przy projektowaniu pewnych algorytmow. Metody tej uzyjemy w sortowanin przez scalanie. Zakoiczymy poréwnaniem obu zaprezentowanych algorytmow. 1.1. Algorytmy Nieformalnie, algorytm jest pewng scigle okreslong procedurg obliczeniowa, ktéra dia wiaSciwych danych wejéciowych ,,produkuje” zadane dane wyjéciowe zwane wynikiem dziatania algorytmu. Algorytm jest wiec ciagiem krokéw obli- ezeniowych prowadzacych do przeksztatcania danych wejéciowych w wyjéciowe. Algorytm mozemy rowniez traktowaé jako sposéb rozwiazania konkret- ego problema obliczeniowego. Postawienie problemu polega na sprecyzowaniu 1 Bedzie rownied stosowane zamiennie okreSlenie ,pseudokod” (przyp. red.). 4 ROZDZIAt 1. WSTEP wymagat dotyczacych relacji miedzy danymi wejéciowymi i wyjiciowymi, a al- gorytm opisuje wlasciwa procedure obliczeniowa, ktra zapewnia, 2c ta relacja zostanie osiagni¢ta. Przeglad algorytméw rozpoczynamy od algorytmow sortowania. Sortowa- nie polega na ustawieniu liczb z danego ciggu w porzadku niemalejacym. Prob- lem ten wystepuje czesto w praktyce i jest Zeddtem wielu standardowych metad projektowania i narzedzi analizy algorytméw. Ponizej podajemy formaing de- finicje problemu sortowania. Dane wexciowe: Cigg n liczb - Wynik: Permutacja (amiana uporzadkowania) ciagu wejscio- wego taka, Ze aj wynikiem dziatania algoryimu sortowania bedzie ciag wyjéciowy (26, 31, 41, 41, 58, 59). Taki cigg wejéciowy jest nazywany ,,egzemplarzem” problemu sortowania. Ogélnie, egzemplarz problemu sktada si¢ z okreslonych danych wejéciowych spetniajacych wazyst- kie warunki podane w opisie problemu. Sortowanie ma liczne zaslosowania w informatyce (w wielu programach jest wykorzystywane jako krok posredni), czego rezultatem jest opracowanie duiej liczby dobrych algorytméw sortujgcych. Optymalnosé algorytmu w da- nym zastosowaniu zalezy od liczby sortowanych elementdw, stopnia posor- towania elementéw na wejéciu oraz rodzaju uzyte] pamigci: RAM, dysk lub tasma. Algorytm jest peprawny, gdy dla kazdego egzemplarza problem algorytm zatrzymuje sig i daje dobry wynik, Méwimy wtedy, ze poprawny algorytm »tozwiazuje" zadany problem obliczeniowy. Algorytm niepoprawny moze sig nigdy nie zatrzymaé albo po zatrzymaniu daé zly wynik. Niepoprawne algoryt- my moga byé jednakze uzyteczne, jesli ich bledne dziatanie moze byé kont- rolowane. Zobaczymy to na przykladzie algorytméw znajdowania duzych liczb pierwszych, w rozdz. 33. Z reguty jednak nie bedziemy sie zajmowaé algoryt- mami niepoprawnymi. Algorytm moana przedstawié w postaci programu komputerowego albo zrealizowaé sprzetowo. Jedynym wymaganiem jest precyzja opisu wynikajace} z hiego procedury obliczeniowej. W tej ksiazce bedziemy przewaznie zapisywac algorytmy w pseudojezyku programowania, ktéry jest bardzo podobny do C, Pascala jub Algolu. Jeéli ezytelaik ana ktorys z tych jezykow, to nie powinien mieé trudnosci w rozumie- niu naszego pseudojezyka programowania, W takim pseudojezyku (w odréz- nieniu od ,,prawdziwych" jezykow programowania) bedziemy uzywat wiekszej gamy sposobéw do wyrazenia konkretnych krokéw algorytmu. Czasami naj- lepszym sposobem jest wyrazenie czegos w jezyku naturalnym; czytelnik nie 22 1.1. ALGORYTMY powinien by¢ zatem zdziwiony, gdy wewnatrz programu sapotka zdania w j¢e- zyku poiskim. Pseudojezyk rézni sig tez tym od ..prawdziwego” jezyka, Ze nie uwzglednia sig tu technik programowania. Problemy abstrakeji danych, modularnosci i obstugi bledéw sa czgsto ignorowane w celu uproszczenia opisu algorytmu. Sortowanie przez wstawianie Rozpoczynamy od sortowania przez wstawianie, kt6re jest efektywnym algoryt- mem sortowania dla niewielkiej liczby elementéw. Algorytm ten dziaia w taki sposdb, w jaki czesto ludzie porzadkuja talie kart. Zaczynamy od ,,pustej” lewej reki, po czym bierzemy ze stolu kolejne karty i wstawiamy je we whasciwe miejsca w talii kart, trzymaane| w lewej rece. Aby znalezé wlaiciwe micjsce dla danej karty, poréwnujemy ja z kartami, ktore juz mamy w rece, Preswajac sig od strony prawej do lewej (patrz rys. 1.1). Rys. 1.1. Sortowanie tai kart za pomocg sortowania przez wstawianie Sortowanie przez wstawianie (zapisane w naszym pseudojezyku) jest przedsta- wione jako procedura o nazwie INSERTION-SORT, kt6rej parametrem jest tabli- ca All ..n) zawierajaca ciag diugosci 1, ktory mamy posortowaé. (W pseudo- jezyku licaba » elementéw tablicy A jest oznaczona przez length[A]). Elementy wejéciowej tablicy sa sortowane w miejscn, to znaczy, ze sq one przechowywane caty czas w tej samej tablicy, z wyjatkiem state] liczby elementow. Kiedy proce- dura jest zakoriczona, tablica A zawiera posortowany ciag wyjsciowy. INSERTION-SORT(A) 1 for j—2 to length[ A] 23 ROZDZiAt 1. WSTEP ao key ~ Al j) D> Wstaw A[j] w posortowany ciag 4[1..j — 1]. iej-t while i > 0 i 4[/] > key do Ali+ 1] Ali] iei-l Afi + Ue key wera dUurLN Na rysunku 1.2 widaé dziatanie algorytmu dia tablicy 4 = <5, 2, 4, 6, 1, 3>. Indeks j wskazuje ,,karte biezaca”, ktdra jest wlaSnie wstawiana do talii kart w rece. Elementy tablicy A[I ..j — 1] reprezentuja karty trzymane w rece, a ele- meaty Afj + 1 .. 1] odpowiadaja stosowi kart na stole, Indeks / przesuwa sig od strony lewej do prawej. W kazdej iteracji zewnetrznej petli for element A[j] jest pobicrany z tablicy (wiersz 2). Nastepnie, poczawszy od pozycji j ~ 1, clementy 8a, sukcesywnie przesuwane o jedng pozycig w prawo, az zostanie znaleziona wlaiciwa pozycja dla A[ j] (wiersze 4-7) i wtedy ten element zostaje tam wsta- wiony (wiersz 8). 1 2 3004 5 6 Posortowane Rys, 12. Dziatanie procedury INsERTION-SoRT dls tablicy 4 = (5, 2, 4, 6, 1, 3. Pozycja o indeksie _f jest omaczona kélkiem Konwencje przyjete w stosowanym pseudojezyku programowania ‘W naszym pseudojezyku uéywamy nastepujacych konwengji. 1. Weigcia odpowiadaja strukturze blokowej. Na przyktad treaé petli for, kt6- Ta zaczyna sie w wierszu 1, zawiera sig w wierszach 2-8, 2 ireé¢ petli while, ktora zaczyna sig w wierszu 5, zawiera sig w wierszach 6-7, ale nie obejmuje wiersza 8. Nasz styl wcieé odnosi sig rwniez do instrukcji if-then-else. Za- 24 stosowanie weieé zamiast normalnych oznaczet struktury blokowej, takich jak begin i end, znacznie redukuje liczbe detali, zachowujac (a nawet pod- noszac) kKlarownoéé prezentacji”. nN . Konstruktory iteracji while, for i repeat oraz warunkowe if, then i else maja, tutaj te sama interpretacje co w Pascalu. Symbol ,,[>” oznacza, ze reszta wiersza jest komentarzemn. Wiclokrotne przypisywanie w formie i. 11-2. Zmodyfikuj procedure INSERTION-SORT tak, zeby sortowala w porza- dku nicrosngcym. 1.1-3. Rozwazmy nastepujacy problem wyszukiwania: Dane wejSciawe: Ciag # liczb 4 = (aj, a5, ..., @,) i wartosé pv. Wynik: Indeks / taki, Ze v = A[i] lub NIL, jedli v nie jest zawarte w A. Napisz algorytm wyszukiwania liniowego, ktory przeglada ciag 4 od strony lewej do prawej, szukajgc v. 14-4. Rozwaimy problem dodawania dwéch n-bitowych liczb binarnych, pa- mi¢tanych jako n-clementowe tablice 4 i B. Wynik ma byé w postaci @ + 1}-elementowej tablicy C. Sformuhyj problem formalnie i napisz w przyjetym tu pseudojezyku procedure sumownia dwoch liczb tego typu. 1.2. Analiza algorytméw Analiza algorytmu polega na okreéleniu zasobéw, jakie sq potrzebne do jego wykonania. Zasobem zasadniczym jest dla nas czas obliczedi, jednakze innymi zasobami moga byé: pamigé, szeroko& kanalu komunikacyjnego lub uklady logicane. Zwykle analizowanie kilku algorytméw dla tego samego problemu prowadzi do wyboru najoptymalniejszego z nich. Przed przeprowadzeniem analizy algorytmu musimy wybra¢ odpowiedni model realizowania obliczeh, uwzgledniajac zasoby dostepne w przyjetej tech- nologii i ich koszty. W wiekszej czeéci tej ksiadki bedziemy przyjmowaé, ze naszym podstawowym modelem obliczen jest jednoprocesorowa maszyna o do- stepie swobodnym do pamigei (w skrdcie RAM od ang. Random Access Machi- ne), a nasze algorytmy sq realizowane jako programy komputerowe. W modelu RAM instrukcje sq wykonywane jedna po drugiej (sekwencyjnic), W dalszych rozdziatach bedziemy mieli sposobnosé badania modeli obliczeti rownolegtych (dla komputeréw rownoleglych) oraz modeli dla sprzetowych implementacji algorytméw. Czasami zanalizowanie nawet prostego algorytmu moze byé wyzwaniem. ‘TFraeba przy tym korzystaé z kombinatoryki, rachunku prawdopodobienstwa, wykazaé si¢ sprawnoscia w obliczeniach algebraicznych ezy teZ umie¢ ziden- tyfikowaé naistotniejsze cztony pewnych wzoréw. Poniewaz zachowanie si¢ algorytmu moze byé rézne dla réznych mozliwych danych wejsciowych, po- trzebujemy Srodkéw do wyradania tego zachowania w postaci prostych, lat- wych do zrozumienia formul. 26 1.2. ANALIZA ALGORYTMOW Chociaz do analizy danego algorytmu wybieramy z reguty tylko jeden model obliczei, mamy jednak wicle mozliwoéci przedstawienia naszej analizy algorytmu. BezpoSrednim celem jest znalezienie takiego sposobu analizy, aby by! on Jatwy do zapisania i przeksztaleania, wyrazal najwazniejsze wlasciwosci algorytmu i pomijal zbedne szczegély. Analiza sortowania przez wstawianie Czas dzialania procedury INSERTION-SORT Zalezy od danych wejéciowych: sortowanie tysiaca elementéw pochtania wigcej czasu niz trzech elementow. Ponadto czas ten zalezy rownicz od stopnia posortowania ciagow wejéciowych. W ogélnoéci czas dzialania algorytmu rosnie razem z roamiarem danych wej- Sciowych, tak wigce tradycyjnie zapisujemy czas dziatania jako funkcje tego rozmiaru, Musimy zatem precyzyjnie] zdefiniowaé pojecia: ,,czas dzialania” i ,,tozmiar danych wejsciowych”. Definicja rozmiaru danych wejSclawych zalezy istotnie od rozwazanego problemu. W wielu problemach, takich jak sortowanie fub obliczanie dyskret- nej transformaty Fouriera, najbardzie} naturalng miarq jest liczba elementéw w ciggu wejiciowym — na przyktad liczba m elementéw do posortowania. W in- nych problemach, takich jak mnofenie dwéch liczb calkowitych, najlepsza miara rozmiaru danych wejéciowych jest calkowita liczba bitdw, potrzebnych do reprezentowania tych danych w postaci binarnej. Czasami bardziej odpo- wiednie do opisania rommiaru jest uiycie dwéch liczb. Jeli na przyktad dane wejSciowe stanowi graf, to ich rozmiar jest zadany liczba wierzchotkéw i liezbq krawedzi, wysigpujacych w tym grafic. Dla kazdego rozwazanego problemu bedziemy okreglaé, co jest przyjete za rommiar danych wejéciowych. Czas dziatania algoryimu dla konkretnych danych wejiciowych jest wyra- zony liczba wykonanych prostych (elementamych) operacji lub ,,krokow”. Jest dogodne zrobienie zatozenia, z¢ Operacja clementarna jest maszynowo nicza- jezna. Na razie przyjmujemy, ze do wykonania jednego wiersza naszego pro- gramu wymagamy stalego czasu. Wykonanie jednego wiersza programu nie musi irwaé tyle co wykonanie innego wiersza. My zakladamy, ie kaide wyko- nanie i-tego wiersza wymaga czasu c, przy czym c, jest stalg. Taki punkt widzenia jest zgodny z przyjetym modelem RAM i odzwierciedla spos6b im- plementacji naszego programu na nowoczesnych komputerach”. » Pojawiaja sig tu pewne subtelnokci, Kroki obliczenia, ktére wyraiamy w jezyku natural- ‘aym, to cegsto odwolania do procedur, ktérych wykonanie moze wymagaé czasu dhviszego ni staty. Mozemy na przykiad powiedziet ,,posortuj punkty wagledem x”, co, jak sig przekonamy, zabiera czas dhutszy nid staly. Zauwaimy ted, 4e instrukeja polegaigea na wywoluniu procedury zajmuje czas staly, wykonanie zaé tej procedury moze trwad dhuixj, tan. odrézniamy proces wywo- Janla procedury — przekazywania jej parametrow itd. - od procesu wykenywanta tej procedury. 27 ROZDZIAt 1. WSTEP W prowadzonych ponizej rozwadaniach wyradenie opisujqce czas dzialania algorytmu INSERTION-SORT otrzymamy w wyniku uproszczenia skompliko- wanej formuly, w ktérej wykorzystuje sig koszty ¢,, czynigc go bardziej zwiez- jym i latwiejszym do przeksztalceh. Ta uproszczona notacja pozwala latwo rozstrzygaé, ktore z algorytmow sq bardziej efektywne. Rezpoczynamy od prezentacji procedury INSERTION-SORT z podanym »kosztem” kagdej instrukeji i liczba jej wykonan. Dla kazdego j = 2, 3, ..., m, gdzie n = length{A], niech t, bedzie liczba sprawdzen warunku wejécia do petli while w wierszu 5 dla danej wartoSci j, Uwaga: nie liczymy kosztu wykonania komentarzy. INSERTION-SORT(A) koszt liczba wykonan 1 for je 2 to length] oy n 2 dokey « ALi] oe n-1 3 & Wstaw 4[j] do posortowanego ciggu 0 n-i > Afl..j— 1} 4 ieje-l fy a-l while i> 0 i Ali] > key < es > 4 6 do Ali + I] + Ali] «s Fu- ia 1 iminl : ‘ e, TG-D se 8 Ali + 1] + key fg n-} Czas dziaiania algorytmu jest suma czas6w wykonania poszczegétnych instrukeji; jedii instrukcja wykonuje sig w czasic c, i jest powtarzana n razy, to mamy w sumie czas cn’. Aby obliczy¢ czas dzialania 7(7) procedury INSER- TION-SORT, sumujemy iloczyny Koszidw i liczby wykonan, otrzymujac Tn) = on + (0 — 1) + on ~ Deas yt eeSs @-1) de fed 4aS @—1) + egfa— 1) j=2 Nie stasuje sig to na prryktad do pamigc; instrukeja potrzebujgca m slow pamigci wykony- wana m razy nickoniecanie potrzebuje w sumie ma slow. 28 1.2. ANALIZA ALGORYTMOW Czas dzialania algorytmu moze sig jednak romié nawet dia danych o tym samym roaniarze. W procedutze INSERTION-SORT na przykiad najlepszy przy- padek (optymistyezny) wystepuje wéwezas, gdy wejéciowa tablica jest juz po- sortowana. Dla kazdego j = 2, 3, ..., m stwierdzamy, ze A{i} < key w wierszu 5, gdy éma poczatkowa wartos¢ j — 1. Zatem ¢;= 1 dla j= 2,3, ..., 2, aminimal- ny czas dzialania wynosi Tin) = en + n(n — 1) + Cen — 1) + €9( ~ 1) + eg(n — 1) = (Cy + cy Hey + lg + Cg) ~ (Cy + Cg + C5 + Cy) Ten czas dziatania mozna wyrazié jako an +- b dla stalych a, b zaleinych od kosztéw ¢; pojedynczych instrukaji; jest to zatem funkeja liniowa wzgledem 7. Jeali tablica jest posortowana w porzgdku odwrotnym ~ to znaczy w po- szadku malejacym — mamy do czynienia z przypadkiem najgorszym (pesymis- tycznym). Musimy poréwnaé kaédy element 4[/] z kazdym elementem pod- tablicy Afl ..j~ 1], a wigs t=] dla j= 2, 3, .., n. Zauwaimy, te vis mato -1 io {sumami takimi zajmiemy si¢ w rozdz. 3), wnioskujemy zatem, ze czas dziata- nia procedury INSERTION-SORT wynosi Te) = emt ex Y-hedn—Y ro OED — :) wae) ty a (25 4 26 4 1) 92 Se -($+$4+g)e+(atatard . Ftc) — (eg + €4 + Cy + Cy) Ten pesymistyczny czas dzialania mozna przedstawi¢ jako an? + bn+c dla stalych a, b ic, ktére znowu zaleza od kosztéw ¢,; jest to zatem funkeja kwad- ratowa wzgledem 7. 23 ROZDZIAL 1. WSTEP W typowych sytuacjach, takich jak sortowanie przez wstawianie, czas dziatania algorytmu jest ustalony dla okreglonych danych wejiciowych, nato- miast w dalszych rozdziatach pokazemy algorytmy probabilistyczne’, ktorych czasy dziatania moga byé rézne dla tych samych danych wejéciowych. Analiza przypadkéw pesymistyeznego i Sredniego 'W analizie sortowania przez wstawianie rozwazaliémy zaréwno przypadek apty- imistycany, w ktorym tablica z danymi wejéciowymi byla juz posortowana, jak iprzypadek pesymistyczny, w ktérym tablica ta byla posortowana w odwrotnym porzadku. Jednakze w dalazej czesci ksiazki koncentrujemy si¢ jedynie na pray- padku pesymistycznym, a wi¢c rozwazamy najdtuzszy czas dziatania dla kaidych danych wejiciowych okreslonego rozmiaru. Sq irzy powody takiego podejécia. © Pesymistyczny czas dziatania jest g6rna granicg mozliwego czasu dziatania algorytmu dla kazdych danych wejiciowych. Znajgc ten czas, mamy gwa- rancje, de algorytm nie bedzie dziatal dhuzej. © Dia niektorych algorytméw pesymistyczny czas dzialania wystepuje dosyé czesto. Zdarza sig tak na przyktad przy wyszukiwaniu w bazie danych infor- macji, ktérej w tej bazie nie ma. © ,Praypadek sredni”” jest czgsto zblizony do pesymistycanego. Zaloimy, de wybieramy losowo n liczb i stosujemy sortowanie przez wstawianie. Jak duzo czasu potrzeba na znalezienie miejsca w tablicy 4[1 ..j — 1], aby wsta- wié element A[/]? Srednio potowa elementéw w [1 ..j — 1] jest mniejsza niz A[j], natomiast polowa elementéw jest wigksza. Sprawdzamy zatem srednio polowe elementow podtablicy, tak wigc ¢, = j/2. Jeili policeymy éredni czas dziatania, to otrzymamy, Ze jest to Funkcja kwadratowa wzgledem rozmiaru danych, podobnie jak w przypadku pesymistycznym. W nicktérych sytuacjach bedziemy zainteresowani przypadkiem Srednim dub oczekiwanym czasem dziatania algorytmu. Jednym z probleméw przy ana- Hizowaniu praypadku éredniego jest okreélenie ,,rednich” danych wejéciowych. Zakladamy czesto, 2¢ wszystkie dane wejéciowe okredlonego rozmiaru sq réw- nie prawdopodobne. W praktyce nie zawsze musi tak byé, ale algorytmy zran- domizowane moga czasami to zapewni¢. Rzad wielkosci funkeji Przy analizie procedury INSERTION-SorT korzystalimy z pewnych uprosz- czen. Najpierw zignorowalismy rzeczywisty kosat katdej instrukeji, uzywajac T Uiywane jest rowniez okretlenie algorytmy randomizowane pochodzgee bezpoirednio od terminu angielskiego randomized algorithms (przyp. red.). 30 1.2, ANALIZA ALGORYTMOW abstrakcyjnych statych c, do reprezentowania tych kosztéw. Nastepnie abs- trahowaliémy jeszcze dalej, pomijajgc te stale i wprowadzajac nowe stale a, b, cw funkcji an’ + bn + c, okreglajacej czas dzialania algorytmu. Przyjmijmy teraz jeszcze jedno uproszezenie. Dotyezy ono rzedu wielkosci funkeji, Rozwazamy jedynie najbardziej znaczgacy skladnik w formule (tan an), poniewaz inne skladniki sq, nieistotne dla dudych n. Pomijamy rowniez state czynniki, poniewad nie sq one istotne dla bardzo duzych danych. Piszemy zatem na przyktad, ze sortowanie przez wstawianie ma pesymistyczny czas dziatania @(7”). Notacji @ udywamy w tym rozdziale nieformalnic; bedzie ona zéefiniowana precyzyjniej w rozdz. 2. Przewainie uwazamy, ze dany algorytm jest lepszy od innego, jedli jego pesymistyczny czas dzialania jest funkejg nifszego rzedu. Mode to byé nieshusz- ne dla malych danych wejsciowych, ale dla doslatecunie duzych danych na przyklad czas @(n”) jest zdecydowanie mniejszy iz O(n*). ZADANIA 1.21. Rozwaimy sortowanie n liceb z tablicy A nastepujaca metodg. Znaj- dujemy najmniejszy element tablicy A i wstawiamy na pierwsze miejsce w pewnej tablicy B. Nastepnie znajdujemy drugi najmniejszy element z Ai wstawiamy na drugie miejsce w B. W ten sposdb postepujemy dla wszystkich n elementow tablicy A. Napisz dla tego algorytmu ~ ktory jest znany jako sortowanie przez selekeje — program. Podaj pesymistyczny i op- tymistyczny czas dzialania tego algorytmu, uzywajac notacji ©. 12-2, Rozwaimy znowu wyszukiwanie liniowe (patrz zad. {.1-3). Ile elemen- téw ciggu wejéciowego irzeba srednio sprawdzié przy szukaniu losowego elementu w tablicy? Jak to wyglada w przypadku pesymistycznym? Jaki jest Sredni i pesymistyczny czas dziatania tego algorytmu wyragony za pomoca notacji @? Odpowied uzasadnij. 12-3, Rozwaimy problem wykrywania powtarzajacych sig elementow w ciagu nliczb (x4, 2) «.) Xy)- Pokad, ze mozna rozwigzaé ten problem w czasie @(nign), gdzie lgn oznacza log, n. 12-4. Rozwaimy problem obliczania wartosci wielomianow. Mamy danych nn wspolezynnikow ap, @y, «. dy, i liczbe rzeczywista x, chcemy obliczyé ach > ax'. Opisz bezposredai algorytm rozwiazujacy ten problem w czasie =o Oe). Opisz algorytm dzialajacy w czasie @{n), w ktorym do obliczania wielomianéw jest zastosowana nastepujaca metoda (2wana metoda Ho- mera); net Saye! = (Gg 1X + Oya) X + Faye + ay =o 12-5. Wyraz funkeje n°/1000 — 100n? — 100n + 3, uzywajac notacji @. 31 ROZDZIAL 1. WSTEP 1.2-6. Jak zmodyfikowaé (prawie kazdy) algorytm, aby polepszyé jego czas dzialania w przypadku optymistycznym? 1.3. Projektowanie algorytmow Jest wiele podejéé do projektowania algorytmu. W sortowaniu przez wstawia- nie stosuje sig metode przyrostowg: majgc posortowang podtablice A[! ..j ~ 1], wstawiamy pojedynczy element A[j] we wlasciwe miejsce, otrzymujac wiekszq, posortowang podtablicg Af] ..j]. W tym podrozdziale rozwazamy inna metode, zwana ,,dziel i zwycigzaj” (ang. divide-and-conquer). Uzyjemy tej metody do zaprojektowania algorymmu sortowania znacznie szybszego niz sortowanie przez wstawianie, Jedna z zalet algorytmu zaprojektowanego w stylu ,,dziel i zwycigdaj” jest modliwoé szaco- wania czasu dzialania przy wykorzystaniu metod, ktére beda wprowadzone w rozdz. 4. 1.3.1. Metoda ,,dziel i zwyciezaj" Wiele waznych algorytmoéw ma stukture rekurencyjng: W celu rozwiazania da- nego problemn algorytm wywohyje sam siebie pray rozwiazywaniu podobnych podprobleméw. W algorytmach tych ezesto stosuje sie metode ,,dziel i zwycig- daj”: problem jest dzielony na kilka mniejszych podproblemdow podobaych do poczatkowego problemu, problemy te sq rozwiazywane rekurencyjnie, a na- stepnie rozwiqzania wszystkich podprobleméw sq lgczone w celu utworzenia rozwiqzania calego problemu. W podejiciu ,,dziel i zwycigzaj” kazdy poziom rekursji sktada sig z na- stepujacyeh trzech etapow: Dziel: Dzielimy problem na podproblemy. Zwycigiaj: Rozwigzujemy podproblemy rekurencyjnie, chyba ze s4 one mate- go rozmiaru i juz nie wymagaja zastosowania rekursji — uzywamy wtedy bezposredaich metod. Polaez: Laczymy rozwiqzania podprobleméw, aby otrzymaé rozwiazani¢ ca- tego problemu. Algorytm sortowania przez scalanie otrzymujemy, stosujgc metode ,,dziel i zwy- cigzaj”. Jego intuicyjny opis jest nastepujacy. Diiel: Dziclimy n-elementowy ciag na dwa podciagi po n/2 elementow kazdy. Zwycighaj: Sortujemy otrzymane podciagi, uzywajac rekurencyjnie sortowa- nia przez acalanie. Polgez: Laczymy posortowane podciagi w jeden posortowany cig. 32 1.3. PROJEKTOWANIE ALGORYTMOW Zauwaimy, ze mechanizmu rekursji nie uruchamia sig, gdy ciag przezna- czony do posortowania ma dlugos< 1, a wigc jest automatycznie posortowany. Podstawowa operacia algorytmu sortowania przez scalanie jest scalanie dwéch posortowanych ciagow dokonywane w krokn ,,polgcz”. W celu wyko- nania sealania korzystamy z pomocniczej procedury MERGE(A, p, q, r), gdzie A jest tablica, a p, q, r sa indeksami takimi, ze p < q r to podtablica jest juz posortowana. W przeciwnym razie znajdujemy q, ktére dzieli Alp ..r] na dwie podtablice: A[p..q], zawierajacq [n/2] elementéw, oraz Alq +1..7], zawierajaca {n/2] elementow”, MERGE-SORT(A, p, 7) lifp, wywotujemy procedure MERGE-SorT(A, 1, /ength[A}), gdzic lengthlA] = n. Patrzac na drzewo wywo- Jan rekurencyjnych od dohi (gdy n jest potega dwéjki), widzimy, ze algorytm najpierw sortuje pojedyncze ciqgi w ciagi 2-elementowe, nastepnie 2-elemen- ” Zapis [x] omacza najmniejsza liczbe cakkowitg nie mniejsza niz x, natomiast |x| oznacza najwigks7q liczbe catkowitg nie wieksza niz x. Notacja (a jest ziefiniowana réwniez w rozdz. 2. 33 ROZDZIAL 1. WSTEP Cigg posortowany as Zor a f= fd fd fd fo 4 a are, ° * ie 4] Rys. 1.3, Oporacia sortowania przez scalanie tablicy 4 = <5, 2, 4, 6, 1, 3, 2, 6). Diugoéei posortowa- nych ciggow werastaja w miare posuwania si¢ algorytmu ,.w gore” towe w 4-elementowe itd. Na koticu z ciagow n/2-elementowych otrzymujemy ciag dlugoSci n. Opisany proces jest przedstawiony na rys. 1.3. -3.2. Analiza algorytméw typu ,,dziel | zwyciezaj” Kiedy algorytm zawiera rekurencyjne wywolania siebie samego, jego czas dziala- nia mozna czesto opisaé zaleinosciq rekurencyjng (rekurencja) wyrazajaca czas dia problemu rozmiaru n za pomocg czasu dla podprobleméw mniejszych roz- miarow. Mogemy potem skorzysta¢ z aparatu matematycznego, aby rozwiazac te rekurencj¢ i w ten spos6b otrzymat oszacowania czasu dzialania algorytmu. Rekurencja odpowiadajaca czasowi dziatania algorytmu typu ,,dziel i zwy- cigzaj" opiera si¢ na podziale jednego poziomu rekurgji na trzy etapy. Niech Tn) bedzie czasem dziatania dla problemu rozmiaru n. Jeéli rozmiar problemu jest wystarczajaco maly, powiedzmy n < c dla pewnej stalej c, to jego rozwiaza- nie zajmuje staly czas, co zapiszemy jako Q(1). Zaloamy, ze dzielimy problem na a podprobleméw, kazdy rozmiaru n/6. Jesli D(7) jest czasem dziclenia prob- Jemu na podproblemy, a C(n) czasem scalania rozwigzai podprobleméw w pene rozwigzanie dla oryginalnego problemu, to otrzymujemy rekurencij¢ it) {2 jesli nse aT(n/b)+D(a)+C(n) — w przeciwnym razie W rozdziale 4 pokazemy, jak rozwiazywaé typowe rekurencje tego typu. 34 1.3. PROJEKTOWANIE ALGORYTMOW Analiza sortowania przez scalanie Chociaz algorytm MERGE-SORT dziala poprawnie nawet wéwozas, gdy n jest nieparzyste, jednakze dla uproszczenia analizy zaloimy, Ze n jest potega dwéj- ki. Wtedy dzielimy problem na pedproblemy rozmiaru doktadnie n/2. W roz- dziale 4 pokazemy, ze nasze upraszczajace zatozenic nie wplywa na rzad wiel- kosci funkeji bedgce] rozwigzaniem. Rekurencje okreslajaca czas 7{n) sortowania przez scalanie otrzymujemy, jak nastepuje. Sortowanie przez scalanie jednego elementu wykonuje sig w cza- sie stalym. Jcéli n > 1, to czas dzialania zalezy od trzech etapow. Duiel: Podezas tego etapu znajdujemy srodek przedzialu, co zajmuje czas sta- Jy. Zatem D(n) = @(1). Zwycigzaj: Rozwiazujemy rekurcncyjnic dwa podproblemy, kazdy rommiaru n/2, co daje w sumie czas dziatania 27(n/2). Polgez: Jak to juz poprzednio stwierdzilismy, procedura MERGE dziala w czasic Q(n), a wigs C(x) = O(n). Funkcje Dw) i C(v) daja po zsumowaniu funkcje rzedu O(n). Dodajac do tego 27(n/2) z etapu ,,zwyci¢zaj”, otrzymujemy nastepujaca rekurencje na T(n): @(1), jesti n= 1 Tn) = tone +O(n), jedli n> 1 W rozdziale 4 pokazemy, ze T(n) wynosi @(nign), gdzic Ign oznacza log, n. Dla dostatecznie duzych n sortowanie przez scalanie, w czasie O(nlgn), jest lepsze niz sortowanic przez wstawianie, ktére dziaia w czasie pesymistycanym (0. ZADANIA 13-1, Zilustruj (podobnie jak na rys, 1.3) dzialanie procedury MERGE-SORT dla tablicy 4 = <3, 41, 52, 26, 38, 57, 9, 49). 13-2. Napisz program dla MERGE(4, p, g, P). 1,3-3. Pokad, stosujgc metode indukeji matematycanej, ze rozwigzaniem row- nania rekurencyjnego nny = jesli n=2, = VoTn2) +n, jedi n= 2 kod jest 7(n) = niga. 13-4. Sortowanie przez wstawianie moze by¢ wyrazone jako procedura reku- rencyjna, jak nastepuje. Aby posortowaé A[] .. a], rekurencyjnie sortujemy 35 ROZDZIAL 1. WSTEP Ali..1— 1], po czym wstawiamy Afni] w posortowang tablice A[] ..2 — £]. Napisz réwnanie rekurencyjne na czas sortowania przez wstawianie. 13-5. Wrdémy jeszeze do problemu wyszukiwania (patrz zad. 1.1-3). Zauwaz- my, Ze jedli cigg A jest posortowany, to mozemy porbwnaé srodkowy ele- ment z elementem v, pomijajac dzi¢ki temu przeszukiwanie polowy tablicy. ‘Wyszukiwanie binamme polega na powtarzaniu tej operacji rekurencyjnie. Napisz program, rekurencyjny lub nie, wyszukiwania binarnego. Uzasad- nij, Ze jego czas dzialania wynosi (ig n). 13-6. Zauwaimy, Ze w petli while w wierszach 5-7 procedury INSERTION- -SORT w podrozdz. E.1 jest zastosowane szukanie liniowe (do tylu) w po- sortowanej podtablicy 4[1 ..j— 1]. Czy mozna skorzystaé z wysvukiwania binarnego (patrz zad. 1.3-5), aby zmniejszyé czas dzialania do O(n1gn)? * 143-7, Opisz algorytm dziatajacy w czasie O(a lgx), ktéry dla danego zbioru S aiozonego z n liczb rzeczywistych i liczby rzeczywiste] x sprawdza, czy istnieja dwa elementy w 5S, ktérych suma jest rowna dokfadnie x. 1.4. Podsumowanie Dobry algorytm jest jak ,,ostry né2” — robi dokladnie to, co ma robié, z naj- muniejszym wysitkiem. Uzywanie ztego algorytmu to jak .,krajanie steku kor- kociagiem”’. Rezultat moze nic byé ani cfektywny, ani ,,apetyczny”. Algorytmy shizgce do rozwigzania tego samego problemu moga sie zna- czaco réani¢ efektywnosciq. Réznice te moga byé wigksze nid rznica migdzy komputerem osobistym i ,,superkomputerem”. Dia praykladu rozwazmy sytu- acje, gdy na superkomputerze zastosowano algorytm sortowania przez wsta- wianie, a na malym komputerze osobistym — algorytm sortowania przez scala- aie, W obu wypadkach nalezy posortowaé tablicg zawierajaca milion elemen- tow. Zaléamy, 2¢ superkomputer wykonuje 100 miliondw operacji na sekunde, podczas gdy komputer osobisty wykonuje w tym czasie tylko milion operacii. Aby réznica byla jeszcze bardzie} widoczna, zalbtmy, te sortowanie przez wstawianie jest zaprogramowane przez niezwykie dobrego programiste i wyni- kowy program wykonuje 21? operacji superkomputera, aby posortowa¢é n liczb. Natomiast sortowanie przez scalanie jest zaprogramowane w ten spo- 6b, ze wynikowy program wykonuje 50m lpn operacji. Aby posortowaé milion liczb, superkomputer potrzebuje czasu 2-(10°} instrakej = 20000 sekund = 5,56 godzin podezas gdy komputer osobisty potrzebuje 36 PROBLEMY 50-10° ig 10% instrukeji . 10° instrukoji/sekunde 1000 sekund 16,67 minut Uzywajac algorytmu, ktérego czas dzialania jest opisany funkejg nizszego rze- du, napisanego nawet przez stabszego programiste, komputer osobisty dziata 20 razy szybciej niz superkomputer! Przykiad ten éwiadczy o tym, ze szybkos¢ dziatasia algorytmu jest co naj- muniej rownie istotna jak szybkosé dziatania komputera. Calkowity czas zalezy zaréwno od wyboru dobrego algorytmu, jak i dobrego komputera. Dlatego wlaénie, podobnie do rozwoju nowych technologii, mozna zacbserwowaé gwaltowny rozw6j algorytmiki. ZADANIA 14-1. Zalsimy, ze poréwnujemy implementacje sortowania przez scalanie i sortowania przez wstawianie na tym samym komputerze. Dia danych wejéclowych rozmiaru n sortowanie przez wstawianie dziata w czasie Bn’, podczas gdy sortowanie przez scalanie dziata w czasie 64n ign. Dla jakich wartosei 7 sortowanie przez scalanie jest Jepsze niz sortowanie przez wsta- wianie? Jak mozna zmodyfikowaé program sortowania przez scalanic, aby dzialat szybciej dla matych danych? 142. Jaka jest najmniejsza wartoéé n, dia ktérej algorytm wykonujgcy 100n? operacji dziala szybciej niz algorytm wykonujacy 2" operacji na tym sa- mym komputerze? Problemy 1-1. Poréwnanie ezaséw dzialania Dia funkeji f() i czasu tz ponizszej tabeli wyznacz najwigkszy rozmiar n prob- lemu, ktéry moze byé rozwigzany w czasie 1, zakladajac, ze algorytm dziala w ciagu f(n) mikrosekund. i 1 1 L 1 1 1 1 f sekunda_ min, godz. aziet miesigc tok wick Ign vn n nigh me nm ¥ no | | ROZDZIAL 1. WSTEP 1-2. Sortowanie przez wstawianie dia malych tablic podczas sortowania przez scalanie Pomimo ée sortowanie przez scalanie dziala w czasie @(nlgn), natomiast sor- towanic przez wstawianie dziata w czasie @(n”), stale czynniki w sortowaniu przez wstawianie czynia ten algorytm szybszym dla matych n, Zatem ma sens korzystanie z sortowania przez wstawianie podczas sortowania przez scalanie, kiedy rozmiar danych jest maty. Rozwazmy modyfikacje sortowania przez sca- Janie, w ktérej nfk podlist rozmiara & sortujemy, uzywajac sortowania przez wstawianie, a nastepnic uzywamy mechaniznu scalania, gdzie k jest wartoscia, ktérg nalezy wyznaczyé, (a) Pokad, de n/k podlist, kazda dhigoSci k, mode byé posortowanych za po- moca sortowania przez wstawianie w czasie (nk). {b) Pokad, ze podlisty moga byé scalone w czasie O(n lg (n/k)). () Zaktadajac, ze zmodyfikowany algorytm dziata w czasie @(nk + ng (n/k)), podaj, jaki jest maksymalny rzad. wartosci k jako funkeji zaleznej od n, dla ktorego zmodyfikowany algorytm ma ten sam 124d zlozonoéci co normal- ne sortowanie przez scalanie? (@) Sakic k wybraé w praktyce? 1-3. Inwersje Niech A[1..n] bedzie tablica zawierajaca n réinych liczb. Jeéli i AL], to para (i, /) jest nazywana inwersj A. (a) Wypisz pigé inwersji tablicy <2, 3, 8, 6, 1). (b) Jaka tablica n-clementowa ma najwigcej inwersji? Ie ich jest? (c) Jaka jest relacja migdzy czasem dzialania sortowania przez wstawianie i liczba inwersji sortowanej tablicy? Opowied2 uzasadnij. (@) Podaj algoryim wyznaczajacy liczbe inwersji permutacji n-clementowej w czasic @(n ign) (Wskazéwka; Zmodyfikuj sortowanie przez scalanie). Uwagi do rozdziatu Jest wiele doskonalych ksigzek o algorytmach, ktorych autorami sq migdzy innymi Aho, Hopcroft i Uilman (4, 5], Baase [14], Brassard i Bratley [33], Horowitz i Sahni [105], Knuth [121, 122, 123], Manber [142], Mehlhorn [144, 145, 146], Purdom i Brown [164], Reingold, Nievergelt i Deo [167], Sedge- wick [175] i Wilf [201]. Nicktére aspekty praktyczne sq dyskutowane w ksiazkach Bentleya [24, 25] i Gonneta {90}. 'W 1968 r. Knuth opublikowat pierwszy z traech toméw ksiqzki The Art of Computer Programming {121, 122, 123]. Pierwszy z nich byt wstepem do al- 38 UWAGI DO ROZDZIALL gorytméw, ze szczegolnym uwzglednieniem analizy dozonosci. Wszystkie trzy tomy zawieraja material zwiazany z niniejsza ksiazka. Cytujac Knutha, stowo »algorytm” pochodzi od nazwiska ,,al-Khow4rizmi", matematyka perskiego zIX w. Aho, Hoperoft i Uliman [4] zajmowali si¢ asymptotycana analiza algoryt- mow jako narzedziem porownywania optymalnosci algorytmaw. Spopularyzo- wali oni réwnied uzycie rekurencji do analizy zlozonoSei. Knuth [123] przedstawit encyklopedyczny przeglad podstawowych aloryt- méw sortowania. Jego poréwnanie algorytmdéw sortujacych zawiera dokladna analize czasu dzialania, podobna do tej jaka wykonaliimy dla sortowania przez scalanie. Knuth, rozwazajac sortowanie przez wstawianie, przeanalizo- wal rownied niektore jego wersje. Najwadniejsza spoirod nich jest sortowanie metoda Shella (wprowadzone przez D.L. Shella), w ktérym korzysta sig z sor- towania przez wstawianie na okresowych podciagach (co daje szybszy algo- rytm sortujacy). Knuth opisat réwnied sortowanie przez scalanie. Wspomina on, iz w 1938 1. skonstruowano mechaniczne urzadzenie scalajace dwa zbiory kart perforowanych. J. von Neumann, jeden z pionieréw informatyki, skonstruo- wal program sortowania przez scalanie na komputerze BDVAC w 1945 r. Czesé | Podstawowy aparat matematyczny Wprowadzenie Analiza algorytméw wymaga czesto uiycia aparatu matematycznego. Mode wystarczyé tylko znajomosé algebry na poziomie szkoly éredniej, ale moze zdarzyé sig i tak, te tracba bedzie sig wykazaé umicjetnoscig rozwiazywania réwnat rekurencyjnych. Ta. czesé ksiqzki stanowi kompendium metod i narzg- dzi, ktére bedziemy stosowaé w analizie algoryimow. Jest pomyélana tak, aby modna sie byto do niej odwotywaé w dalszych partiach ksig#ki, Niektére tema- ty sq oméwione dok szczegdtowo. Radzimy czytelnikowi, aby nie starat sig zglebié calego materiahz matema- tycznego od razu. Uwazamy, ze lepiej bedzie, jesli najpierw pobieznie zapozna sig z zawartoscia rozdzialow tej czesci ksiazki, po czym przejdzie do rozdziatow poswigconych algorytmom. Po przeczytaniu ich moze wrécié do tej czeéci, kiedy tylko dojdzie do wniosku, ze powinien lepiej zrozumieé stosowane narze- dzia matematyczne. Rozdzial 2 zawicra dokladne definicje kilku notacji asymptotycznych (przyktadem jest notacja ©, o ktérej byla juz mowa w rozdz. 1). Naszym celem. jest tutaj nauczyé czytelnika postugiwania sie notacja uzywang w ksiaice, a nie rozumienia nowych koncepcji matematycznych. Rozdzial 3 dotyczy metod obliczania i szacowania sum, z czego czesto si¢ korzysta w analizie algorytméw. Wicle przedstawionych tu wzoréw moina znalesé w ksiq?kach z analizy matematycznej, ale wygodnie jest mieé je 2gro- madzone w jednym miejscu. Metody rozwigzywania rownah rekurencyjnych, ktore stosowalismy do analizy sortowania przez scalanic w rozdz. t, sq tematem rozdz. 4. Jedna ze skuteczniejszych metod jest tzw. ,,metoda rekurencji uniwersalnej”, ktéra mo- de byé udyia w rekurencjach powstajacych w algorytmach typu ,,dziel i zwycig- zaj”. Znacana czeSé roadz. 4 jest poswigcona dowodowi poprawnoéei tej meto- dy, chociaz dowéd mozna pominaé. 42 WPROWADZENIE Rozdziat 5 zawiera podstawowe definicje i notacje zwiazane ze zbiorami, telacjami, funkcjami, grafami i drzewami. $4 w nim tez opisane podstawowe wiasnoéci tych obickt6w matematycanych. Material ten jest istotny do zro- zumienia ksiqzki, ale moze byé pominiety, jeSli ma sig pewne podstawy z mate- matyki dyskretnej. Rozdzial 6 rozpoczyna si¢ opisem podstawowych poje¢ kombinatorycz- nych: permutacji, kombinagji itp. Reszta rozdziatu zawiera definicje i wlasnogci zwiazane z elementarnym rachunkiem prawdopodobienstwa. Do analizy wig- kszosci algorytmow w tej ksigéce nie jest wymagana znajomoé¢ rachunku pra- wdopodobienstwa; mozna zatem bezpiecznie pominaé ostatnic partie tego roz- driatu przy pierwszym czytaniu. Rozdzial ten jest jednak bardzo przydatny, kiedy chee sig lepiej zrozumieé omawiang dalej analize probabilistyczng al- gorytméw. Rozdziat 2 Rzedy wielkosci funkeji Na podstawie rzedu wielkosci funkeji, za pomocg ktérej opisuje sig czas dziata- nia algorytmu (0 czym wspominaligmy w rozdz. 1), mozna scharakteryzowaé efektywnosé algorytmu i porownaé zlozonosé dwéch réinych algorytméw. Gdy na przyklad romiar danych wejéciowych n staje sig bardzo duzy sortowa- nic przez scalanie, ktore dziaia w czasi¢ pesymistycznym O(n lg 7), ,. wygrywa” z sortowaniem przez wstawianie, ktérego pesymistyczny czas dziatania wynosi @(n"). Chociag nickiedy mozemy wyznaczyé dokladnie czas dzialania algoryt- mu, jak na przyklad w sortowaniu przez wstawianie w rozdz. 1, jednak taka dokladnosé czesto jest nicpotrzebna, a je} osiagniecie zbyt pracochionne, Dla dostatecznie duzych danych wejéciowych stale wspétezynniki i mniej znaczgce skladniki we wzorze na czas dzialania sq zdominowane przez rozmiar samych. tych danych, Kiedy dla dostatecznie duzych danych wejiciowych liczymy jedynie rzqad wielkosoi czasu dzialania algorytmu, wtedy zajmujemy sie asymptotyemg zlo- 2onoscia algorytméw. Oznacza to, 2e interesuje nas, jak szybko wzrasta ozas dziatania algorytmu, gdy rozmiar danych day do nieskoiczonosci. Zazwyczaj dla dostatecznie duzych danych najlepszy jest algorytm asymptotycznie bar- dziej efcktywny. W tym rozdziale pokazemy kilka standardowych metod upraszczania ana- lizy asymptotycznej algorytmow. Rozpoczniemy od podania definicji kilku ty- péw ,,notacji asymptotycznej”, ktorej przyktad zaprezentowaligmy, wspomina- jac o notacji @, Nastepnie przedstawimy podstawowe notacje oraz zbadamy zachowanie sig funkcji czgsto wystepujacych w analizie algorytméw. 24, NOTACJA ASYMPTOTYCZNA. 2.1. Notacja asymptotyczna W notacji uzywanej do opisu asymptotycznego czasu dziatania algoryiméw korzysta sig z funkeji, kt6rych zbiorem argumentow jest zbidér liczb natural- nych N =: {0, 1, 2, ...}. Notacja taka jest uzytecana przy opisie pesymistyeznego czas dzialania T(n), ktory zazwyczaj jest funkcja rozmiaru danych wejécio- wych, bedacego liczbq naturalng. Czasami jednak wygodna jest pewna modyfi- kacia, na prayidad rozszerzenie podobnej notacji na zbidr liczh rzeczywistych. Niemniej jednak istotne jest, aby modyfikacja notacji nie prowadzila do straty precyaji. W podrozdziale tym definiujemy podstawowe notacje asymptotyezne, a takze wprowadzamy kilka ich modyfikagji. Notacja © W rozdziale 1 stwierdzilismy, ze pesymistyczny czas dzialania algorytmu sor- towania przez wstawianie wynosi T(n) = @(n”). Zdefiniujmy formalaie, co to oznacza. Dia danej funkoji g(t) oznaczamy przez O(g(n)) zbiér funkcfi Q(e(n)) = (fn): istnieja dodatnie state ¢,, cz ing takie, a 0 < ca(n) < f(a) < ¢,g(n) dla wszystkich n > no} Funkcja f(7) nalezy do zbioru @(g(n)), jedli istniejg dodatnie state c, oraz c, takie, ze funkeja mode byé ,,wstawiona migdzy” c,g(n) i cag(n) dla dostatecznie duzych n. Chociaz @(g(n)) jest zbiorem, piszemy ,, f(t) = @(g(n))”, Zeby wyra- zig, 20 f(a) jest elementem O(g(n)), lub ,, f(n)€ O(g(n))”. Formalnie taka nota- cja moze wydawaé sie mylaca, ale zobaczymy, Ze ma ona swoje zalety. ‘Na rysunku 2.la widaé, dlaczego /(n) = @(g(n)). Dla wszystkich wartosci n wigkszych od ng warto8 f(n) znajduje sig migdzy c,g(n) i ¢,g(n). Inaczej méwigc, dia wszystkich n > my funkcja f(#) jest rowna g(n) z dokladnoscig do stalego wspélczynnika. Mowimy, ie g(n) jest asymptotycznie dokiadaym osza- cowaniem dla /(7). Definicja @(g(n)) implikuje tez, 2¢ kazda funkcja, ktora jest rzedu @(g(n)), ma byé asymptetycznie nieujemna, to znaczy, ze f(n} ma byé nieujemna dla dostatecanie duzych n. Zatem funkeja g() musi byé rowniez asymptotycznie nieujemna, w przeciwnym razie zbiér funkeji @(g(n)) jest pusty. W zwiazku z tym zakladamy, ze kazda funkcja rzedu © jest asymptotycznie nicujemna. Podobne zalozenie przyjmujemy dla innych asymptotycznych notacji wprowa- dzonych w tym rozdziale. W rozdziale | wprowadziliémy nieformalnie notacje @, dzieki ktérej mo- glismy pominaé sktadniki nizszych ragdéw i staty wspdtezynnik pray skladniku 0 najwigkszym rzedzie. Uzasadnimy krétko, uzywajge formalnych definicji, 45 ROZDZIAL 2. RZEDY WIELKOSCI FUNKCJt 6 a) extn) Siny feo fie eam catn) n 2 a : a "0 jum) = 819m) "0 fon= Ot) "0 Fn) = Mga), @ ®) @ Rys. 2.1, Graficene przyklady notecii ©, O10. Pokazana w kaidej cepéci wartose ny jest minimaing moiliwg wartoicia; kaida wigksza wartoié jest r6wnicz dobra. (a) Za pomoca notagji @ szacuje sie funkeje z doktadnoscig do statego wspotezynnika. Piszemy f() = O(g(n)), jeili istnicja dodatnic state no, ¢; i €; takie, 2 na prawo od n, wartost /(n) lezy zawsze migdzy c,8(n) i cpg(n). (b) Notacia @ daje gime ograniczenie funkeji 2 dokiadnogcig do statego wspbkzynnika, Piszemy f(a) = O(g(n)), jedli istniejg dodatnic stale no i c takie, #e na prawo od My wartosé f(x) jest nie ‘wigksza niz og(n). (c) Notacja 1 daje dolne ograniczmnie funkeji z dokadnoécig do stakogo wspét- caynnike, Piszemy fin) =(e(n)), jeéli istnieja dodatnie stale , ic tekie, 22 na pravo od ny wartosé f(n) jest nie nmiejsza niz cen) te ; n® ~ 3n = @(n"). W tym celu musimy znaledé dodatnie stale c,, c, oraz ftp takie, 1 yn < ng. Dzielac powy2szq zaleznosé przez n*, otrzymujemy 1.3 “Sg - Se Prawa strona jest prawdziwa dla kaidej wartoéci n> 1, gdy wybierzemy ¢, 2 1/2. Podobnie, lewa strona jest prawdziwa dla kazdej wartosci n > 7, gdy wybierzemy c, < 1/14. Wybierajac c, = 1/14, c, = 1/2 oraz my) = 7, mozemy sprawdzié, ze fet — 3n = O(n”). Z pewnoscig istnieja inne modliwogci wyboru statych, ale istotne jest gléwnie to, ze istnieje jakakolwiek mozliwosé. Zauwaz- my, ze wybor stalych zalezy od konkretnej funkeji ~ tutaj fat —3n; inne funkeje raedu @(n?) beda wymagaly uzycia innych stalych wspélczynnikéw. 46 2.1. NOTACJA ASYMPTOTYCZNA. Korzystajac z formalne definicji, mozemy rowniez stwierdzid, ie 6n3 4 @(n”), Zatozmmy (przez zaprzeczenic), Ze istnieja state c, i ny takie, ie 6n3 < con? dla wazystkich n > no. Ale wtedy n < c,/6, co nie mode byé prawda dla dowolnie duzych n, poniewaz c, jest stala. Intuicyjnic, skladniki nizszego ragdu moga byé pominiete, gdyz sq malo istotne dia duzych n. Niewielka czgéé skladnikow wyzszego rzedu jest w rzeczy- wistosei dominujgca. Zatem przypisujgc c, warto& odrobine mniejszq niz wspdlezynnik przy skladniku najwyiszego rzedu oraz praypisujac c, wartosé odrobing wigksza, powodujemy, ze notacja @ ma sens. Wspdlezynnik przy najbardzie} znaczacym skladniku moze byé pominigty, gdy2 zmicnia on c, ic, tylko o staly wspdtezynnik. Jako przyklad rozwaimy funkeje kwadratowa f(a) = an? + bn + ¢, gdzie a, 6, ¢ sa statymi i a > 0. Odrzucajgc sktadniki nizszego rzedu i state wspdt- ozynniki, otrzymujemy, Ze f(r) = @(n). Formalnie, dowodzimy tego samego, biorac stale ¢, = a/4, c, = 7a/4 i ny = 2+maa((|l/a), /(lel/a)). Czytelnik moze sprawdzié, ze 0 < cn? < an? + bn +¢< cn" dla wszystkich n > ny. Ogdinie, dla kazdego wielomianu p(n) = J) ayn’, gdzie a; 94 stalymi i a,> 0, mamy imo p(n) = OC) (patez problem 2-1). Poniewaz kazda stata jest wielomiancm stopnia 0, mozemy wyrazié funk- Gje stata jako @(n°) lub @(1). Ta ostatnia notacja formalnie nie jest calkiem poprawna, gdyz nie bardzo wiemy, co tutaj dazy do nieskoniezonosci”. Bedzie- my czesto uzywaé notacji @(1) do oznaczenia albo wartosci stalej lub funkeji state] wzgledem pewnej zmiennej. Notacja 0 Notacja © asymptotycznie ogranicza funkcje od géry oraz od dolu. Kiedy mamy tylko asymptotycang granieg gérna, uzywamy notacji O. Dla danej fank- gi g(a) oznaczamy przez O(g(n)) zbidr funkgji O(g(n)) = {f(n): istnieja dodatnie stale c i ny takie, ze 0 < f(n) < cg(n) dla wszystkich n > no} Z notacji O korzystamy po to, zeby oszacowaé funkcje 2 gory, z doktadnoé- cia do stalego wspdiczynnika. Rysunek 2.1b ilustruje pewna intuicje zwiazana ” Pewnym problemem jest to, 2¢ nasza notacja dla funkeji nie odrdinia funkeji od ich warto- ici. W rachunku 4 parametry funkeji s@ opisane bardziej formalnie: funkeja n® mode byé zapisana jako An.n? albo dr.r*, Preyimujac bardziej rygorystyczng notacie, skomplikowalibyimy przeksztal- cenia algebraicene, tak wigc: tolerujemy pewng niezgodnok formalizmu. a7 ROZDZIAt 2, AZEDY WIELKOSCE FUNKCJI z notacja O. Dia kazdego n wigkszego od ny wartos¢ funkcji f(1) nie prze- kracza g(n). Piszemy f(m) = O(g(#), edy funkcja f(n) jest elementem zbioru O(g(n)). Zauwamy, ze /(#) = @(g(n)) implikuje /(n) = O(g(n)), poniewaz notacja © jest silniejsza niz notacja O. Korzystajac z zapisu teoriomnogosciowego, mamy @(g(n)) = O(g()). Zatem z naszego dowodu na to, ze kaizda kwadrato- wa funkcja an? + 6n + c, gdzie a> 0, nalezy do zbioru @(n”}, wynika tez, ze kazda kwadratowa funkcja nalezy do zbioru O(n”). Ciekawe jest to, 2e kaida liniowa funkcja an + 6 réwniez nalezy do zbiorm Of"), co latwo zauwaiyé, biorac e = at [bling =1. Czytelnikom, ktérzy sie zetkneli wozedniej z notacja O, moze sie wydaé driwne, ze piszemy n = O(n”). Czesto notacja © jest stosowana nieformalnie do opisu asymptotycznic doktadnych oszacowan, dla kt6rych my uzywamy notacji @. Jednakze w tej ksiqéce, piszac f(n) = O(g(n)), rozumiemy jedynie, ze po przemnozeniu g(n) przez pewna stala otrzymujemy asymptotyczng granice gérng na f(m), nie méwiac nic o tym, na ile jest ona dokladna. Rozrédnienie gérnego oszacowania od dokladnego oszacowania stato si¢ standardem w lite- raturze zwigzanej z algorytmami. Za pomoca notacji O opisujemy czesto czas dziatania algorytmu, badajac jego ogéing strukture. Na przykad struktura podwéjnie zagniezdzonej petli w algorytmie sortowania przez wstawianie z gozdz, 1 daje od razu gorne osza- cowanie O(n”) na pesymistycany czas dzialania: koszt wewngtranej petli jest ograniczony z gory przez O(1) (stalq), indeksy oraz j sa nie wigksze niz 1, wewnetrzna petla jest wykonywana co najwyzej raz dla kazdej spoéréd n? par wartosci i oraz j. Poniewaz notacja O odpowiada gérnej granicy, szacujac pesymistyczny czas dzialania algorytmu, automatycznie szacujemy z gory czas dzialania tego algorytmu. dla wszystkich danych wejéciowych. A wigc oszacowanie O(n?) na pesymistyezny czas dziatania algorytmu sortowania przez wstawianie stosuje si¢ do czasu dziatania dla wszystkich danych. Jednakze oszacowanie @(n*) na pesymistyczny czas dziatania algorytmu sortowania przez wstawianie nie im- plikuje oszacowania @(n*) na czas dziatania tego algorytmu dla wszystkich danych. Jak widzieliémy na przykdad w rozdz. 1, jeéli dane sq juz posortowane, to algorytm sortowania przez wstawianie dziala w czasie @(n). Technicznie rzecz biorgc, pewnym naduzyciem jest powiedzenie, ze czas dziatania algorytmu sortowania przez wstawianie wynosi O(n*), gdyz dla da- hego n rzeezywisty czas dziatania zalezy od konkretnych danych wejéciowych rozmiaru n. To znaczy, ze czas dziatania nie jest jedynie funkejq zalezng od n. Mowigc ,,czas dzialania wynosi O(n?)", rozumiemy, Ze pesymistyczny czas dziatania (ktory rzecaywiscie jest funkeja n) wynosi O(n"), lub r6wnowainie, ze niezaleinie od konkretnych danych wejéciowych roamiaru n czas dzialania al- gorytmu dla tych danych wynosi O(n”). 48 2.1, NOTACJA ASYMPTOTYCANA Notacja Q Podobnie jak notacja O ckreéla asymptotyczng granice gérnq, notacja 2 okres- la asymptotyczng granice dolna. Dia danej funkcji g(n) oznaczamy praez Alg(n)) zbidr funkeji AEln) = {/(n): istnieja dodatnie state ci ny takie, 4e 0 < cg(n) < f(n) dla wszystkich n % 1g} Intuicja zwigzana z notacja M jest pokazana na rys. 2.1¢. Dia wszystkich war- tosci n wiekszych od ny wartosé f(n) jest nie mnicjsza niz cg(n). Z definicji dotychezas wprowadzonych notacji asymptotycznych latwo wy- kazaé skusznosé nastepujgcego waznego twierdzenia (patrz zad. 2.1-5). TWIERDZENIE 2.1. Dla kaadych dwéch funkeji f(n) i a(n) zachodzi zaleznosé f(x) = @(g(n)) wtedy i tylko wtedy, ady f(m) = OCg(n)) i fe) = Agim). > Przyktadem zastosowania tego twierdzenia jest fakt, ze z dowodu na to, id an? + bn + ¢ = O(n) (gdzie a, b, c sq statymi i a> 0), wynika bezposrednio, Ze an? + bn + ¢ = Q(n*) oraz an? + bn + ¢ = O(n). W praktyce, zamiast ko- raystaé z twierdzenia 2.1 do uzyskania gornego i dolnego oszacowania 2 asym- ptolycznie dokladnych oszacowas, jak to zrobiliimy w tym prayldadzie, za- rwyczaj uzywamy go do wykazania istnienia asymptotycznie dokladnych gra- nic na podstawie istnienia asymptotycznej granicy gérnej i asymptotycznej gra- nicy dolnej. Poniewaz notacja Q opisuje granicg dolna, wigc uzywajac jej do oszacowa- nia czasu dziatania algorytmu dia najlepszego przypadku, szacujemy rownied czas dziatania algorytmu dla wszystkich danych wejéciowych. Na przyktad czas dzialania algorytmu sortowania przez wstawianie dla najlepszego przypadku wynosi O(n), 2 czego wynika, Ze czas dzialania tego algorytmu wynosi Q(x). Czas dziatania algorytmu sortowania przez wstawianie lezy zatem miedzy Q(n) a O(n?). Ponadto oszacowania te sq asymptotycznie najlepsze z mo?li- wych: na prayklad czas dzialania algorytmu sortowania przez wstawianie nie wynosi 2(n"), gdyz algorytm ten dziala w czasie @(), gdy dane sq juz posorto- wane. Nie jest jednak sprzecznoscia powiedzenic, ze pesymistyczny czas dziala- nia algorytmu sortowania przez wstawianie wynosi O(n"), poniewaz dla pew- nych danych wejsciowych algorytm ten wymaga czasu Q(n”). Gdy méwimy, ze czas dzialania algorytmu wynosi O{g(n)), rozumi przez to, ze niezaleznie od konkretnych danych wejiciowych roumiaru n czas dziatania algorytmu dla tych danych wynosi co najmniej g(m) razy pewna staia, dla dostatecanie duzych n. 49 ROZDZIAL 2. RZEDY WIELKOSCI FUNKCJi Notacja asymptotyczna w réwnaniach Widzieligmy juz, jak notacja asymptotyczna move byé uzyta we wzorach mate- matycznych. Wprowadzajac na prayktad notacje O napisaligmy ,n = O(n")”. Moglismy rowniez napisaé 2n? + 3n+ 1 = 2n* + @(n). Jak interpretujemy wzory tego typu? Gdy notacja asymptotyczna wystepuje po prawej stronie rownania, tak jak w n= O(n”), oznacza to, Ze zdefiniowalimy zak réwnosci jako oznaczenie przynaleznosci: ne O(n"). Jednakie ogélnie, gdy notacja asymptotyczna poja- wia sig we wzorze, interpretujemy jg jako anonimowa funkcje o pomijalnej nazwie. Na przyktad wzér 2n?+3n+1=2n?+@(m) oznacza, ie 2n® + 3n + 1 = 2n? + f(n), gdzie (qm) jest pewng funkcig naleiaca do zbioru Om). W tym wypadku f(n) = 3n + 1, co faktycznie nalezy do O(n). Uiywajac notacji asymptotyczne] w ten sposdb, eliminujemy nicistotne detale oraz uptaszczamy rownanie. W rozdziale | ma przykiad wyrazilismy pesymistycany czas dzialania algorytmu sortowania przez scalanie jako reku- rencjg Tn) = 2T(n/2) + O@) Jeéli jestesmy zainteresowani tylko asymptotycznym zachowaniem si¢ 7(n), to nie ma sensu dokiadne zajmowanie sig nie znaczacymi skladnikami; sa one W pewnym stopniu zawarte w anonimowej funkcji okreSlonej przez sktadnik Om). Liczba anonimowych funkeji w wyrazeniu jest rozumiana jako liczba sytu- acji, w ktérych notacja asymptotyczna wystepuje. Na przyklad w wyrazeniu Me 0) i 1 Jest tylko jedna funkcja anonimowa (funkeja wzgigdem /). Wyrazenic to zatem nie jest tym samym co O(1) + O(2) +... + O(n). To ostatnie nie ma jasnej interpretagji. W pewnych wypadkach notacja asymptotyczna pojawia si¢ po lewej stro- nie réwnania, na przyktad 2n? + @(m) = O(n") Rownanie takic interpretujemy, korzystajac z nastepujacej reguly: Niezaleinie od tego, jak anonimowe funkcje sq wybrane po lewej stronie znaku réwnosci, moina wybraé anonimowe funkcje po prawej stronie tak, ze rdwnanie bedzie zachodzié, Nasz przyklad oznacza zatem, ze dla kazdej funkeji f(m) ¢ O(n) ist- 50 21. NOTACIA ASYMPTOTYCZNA. nieje pewna funkeja g(n)e O(n?) taka, Ze 2n? + f(n) = g(n) dla wszystkich n. Inaczej méwiac, prawa strona rownania jest bardziej zgrubnym opisem lewej strony. Relacje takie moga tworzyé taticuch relacji, jak na przyktad 2n? + 3n +1 = 2n? + @(n) = Qn?) Kaide 2 rownadi mozemy zinterpretowaé, uzywajac podanej wezeiniej reguly. Pierwsze z rownah mowi, ze istnieje pewna funkeja f(n)e@(m) taka, te 2n? + 3n +1 = 2n? + f(a) dla wszystkich n. Dragie z nich méwi, ze dla kaidej funkeji g(t) ¢ @()} (takiej jak wspomniana funkcja f(7)) istnieje pewna funkcja Hn) € @(7?) taka, te 2n? + g(n) == h(n) dla wazystkich n. Z interpretacji tej wy- nika, #e 2n? + 3n + 1 = @(n?), co jest implikacjg intuicyjnego rozumienia lari- cuchéw relagji, Notacja o Asymptotyczna granica gorna okreglona przez notacjg O moze byé Jub nie byé asymptotycznie dokladna. Granica 2n” = O(n”) jest asymptotycznie dokladna, ale granica 2n = O(n?) nie jest. Notacja o duty do okseilenia granicy g6mnej, ktéra nie jest dokladna. Formalnie definiujemy o(g(n)) (,,male o od g w zalez- nosci od 7”) jako zbior o(g(n)) = {f(n): dla kazdej dodatniej state] ¢ > 0 istnieje stata m, > 0 taka, 260 < f(r) < cg(n) dla wszystkich n > mo} Na prayklad 2n = o(n”), ale 2n? # on”). Definicje notacji O oraz notacji o s, podobne. Gtéwna réénica polega na tym, e w przypadku f(n) = O(g(n)) oszacowanie 0 < f() < eg(n) zachodzi dia pewnej stalej c>0, natomiast w przypadku f(n) = o(g(n)) oszacowanie 0 0. Intuicyjnie, w notacji o funkcja f() staje sig pomijalna w stosunku do g(n), ady n dazy do nieskor- czonoéci; to znaczy fa) nm a) ~° en) Niektorzy autorzy uzywajg tej granicy jako definicji notacji o. Definicja w tej ksiagce dotyczy jedynie anonimowych funkcji, ktore sq asymptotycanie nie- ujemne. 51 ROZDZIAL 2. RZEDY WIELKOSCI FUNKCJI Notacja Notacja «@ ma sie tak do notacji Q jak notacja o do notacji O. Notacje w stosujemy do oznaczania oszacowania, ktre nie musi byé dokladne. Mozna to adefiniowaé przez S(@) €e(g(n)) wtedy i tylko wtedy, ady g(n)eo(f(m)) Jednakée formalnie definiujemy c(g(n)) jako zbiér e@(g(n)) = {f(n): dla kaidej dodatnic} state] c> 0 istnieje stata ny > 0 taka, de 0 < og(n) < f(n) dla wszystkich n > ng} Na przyktad n7/2 = on), ale n?/2 # can”). Relacia f(x) = en(g(n)) implikuje, ze JeSli powyésza granica istniejc. To znaczy f(n) staje sie dowolnic duze w stosun- ku do g(a), dy 1 dazy do nieskoriczonoici. Poréwnywanie funkcji Wiele relacji dotyczacych liczb rzeczywistych dotyczy tex poréwnywania rze- dow wielkosci funkeji. W dalszym tekécie zakladamy, ie f() i g(t) sa asymp- totycznie dodatnie. Przechodniosé: f(r) = Om) i g(t) = OF) implikuje f() = O(h(m)) S(t) = Og) i xn) = ofh(n)) implikuje f(m) = o(A(n)) Zwrotnosé: f(a) = O(f(m) f(r) = O(n) Fin) = 20) Symetria: f(r) = O(g(@n)) wtedy i tylko wtedy, ady g(x) = @(f(n)} 52 2.1, NOTACJA ASYMPTOTYCZNA Symetria transpozycyjna: S(n) = O(g(n)) wtedy i tylko wtedy, edy g(n) = OU/(n)) (n) = o(g(n) wtedy i tylko wtedy, gdy g(n) = o( f() Poniewaz wlasnoéci te zachodza dla notacji asymptotycanych, mozna sig doszukiwaé analogii migdzy poréwnywaniem dwach funkeji fig oraz poréw- nywaniem dwéch lich rzeczywistych a i b: J) = O@@)) sab S(n) = O(n) wa=b Sf) = og@)) vab Jednak pewna wlasnoéé liczb rzeczywistych nie przenosi sig na funkcje: Wiasnoéé trichotomii: Dla kazdych dwéch liczb rzecaywistych @ i b zachodzi dokladnie jeden z nastepujacych faktow: a < b,a=bluba> ob. Chociaz mozna poréwnaé katde dwie liczby, nie mozna tego zrobié dla funk- gji w sensie asymptotycznym. Oznacza to, ze dla dwoch funkeji f(n) i g(n) moie nie wystapié Zaden z dwach faktow: fn) = O(g(n)), fn) = A(g(n)). Na przyklad funkeje m oraz n'*** nie moga byé w tym sensie porownane, gdyz warto& wyktadnika w 2'+%@" waha sie miedzy 0 i 2, przyjmujac wszystkie posrednie wartosci. ZADANIA 21-1. Niech /(#) i g(#) beda funkcjami asymptotycanie nieujemnymi. Korzys- tajac z podstawowych definicji notacji @, udowodnij, ze max(f(n), a(n) = O(/(n) + 80). 2.1-2. Pokaz de dla kazdych dwéch statych ai b, gdzie b > 0, zachodzi @ + a? = O(n’) Q.2) 2.1-3. Wyjasnij, dlaczego prawdziwoSé stwierdzenia ,,Czas dziatania algoryt- mu 4 wynosi co najmniej O(a)”, nie zalezy od A. 21-4, Cay 2"*! = O(2")? Cay 27* = O(2")? 21-5. Udowodnij twicrdzenic 2.1. 53

You might also like