Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Java. Algorytmy
i struktury danych
Autor: Robert Lafore
Tumaczenie: Przemysaw Kowalczyk (rozdz. 1 5),
Piotr Rajca (rozdz. 6 9), Pawe Koronkiewicz
(rozdz. 9 15, dod. A C)
ISBN: 83-7361-123-1
Tytu oryginau: Data Structures & Algorithms
in Java, 2nd Edition
Format: B5, stron: 704
Ksika Java. Algorytmy i struktury danych jest atwym do zrozumienia
podrcznikiem powiconym zoonym zagadnieniom gromadzenia i zarzdzania
danymi w taki sposb, aby uzyska maksymaln efektywno dziaania programw
komputerowych. Niezalenie od uywanej platformy systemowej oraz jzyka
programowania, opanowanie zagadnie przedstawionych w niniejszej ksice poprawi
jako i efektywno tworzonego oprogramowania. Dziki wykorzystaniu Javy
do implementacji najwaniejszych poj, uniknito problemw zwizanych ze
zoonoci jzykw C oraz C++ i w peni skoncentrowano si na prezentacji
algorytmw i struktur danych.
Autor Robert Lafore prezentuje proste i zrozumiae przykady unikajc
niepotrzebnej matematyki i skomplikowanych dowodw, czsto pojawiajcych si
w ksikach o tej tematyce. W prezentowanym drugim wydaniu ksiki, autor
udoskonali i rozbudowa przykady, wykorzystujc w nich najnowsze moliwoci Javy.
Na kocu kadego z rozdziaw zostay zamieszczone pytania i odpowiedzi,
umoliwiajce sprawdzenie stopnia zrozumienia i opanowania omawianych zagadnie.
W ksice opisano:
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Tablice
Proste i zoone algorytmy sortowania
Stosy i kolejki
Listy
Zastosowania rekurencji
Rne rodzaje drzew i sposoby ich implementacji
Tablice rozproszone
Sterty
Grafy i grafy waone
Dobr waciwych algorytmw i struktur danych
Robert Lafore pisze o programowaniu od 1982 roku. Do jego najbardziej poczytnych
ksiek nale: Object-oriented Programming in C++, ktra zostaa sprzedana
w ponad 200 tysicach egzemplarzy na caym wiecie, Assembly Language
Programming for the IBM PC, C Programming Using Turbo C++ oraz C++ Interactive
Course. Lafore posiada tytuy naukowe z matematyki i elektryki, a programowaniem
zajmuje si aktywnie od czasw, gdy krloway komputery PDP-5 i gdy 4 kB
Spis treci
O Autorze...............................................................................................................19
Drogi Czytelniku....................................................................................................20
Wprowadzenie .......................................................................................................21
Co nowego w drugim wydaniu? ....................................................................................................................... 21
Dodatkowe tematy ................................................................................................................................ 21
Pytania kocowe................................................................................................................................... 22
Eksperymenty ....................................................................................................................................... 22
Projekty programistyczne ..................................................................................................................... 22
O czym jest ta ksika? ..................................................................................................................................... 22
Czym ta ksika rni si od innych? ............................................................................................................... 23
atwa do zrozumienia .......................................................................................................................... 23
Warsztaty algorytmw.......................................................................................................................... 24
Przykady w Javie................................................................................................................................. 24
Komu moe si przyda ta ksika? ................................................................................................................. 25
Co musimy wiedzie, zanim zaczniemy j czyta? .......................................................................................... 25
Potrzebne oprogramowanie............................................................................................................................... 25
Organizacja ksiki ........................................................................................................................................... 25
Dobrej zabawy! ................................................................................................................................................. 27
1.
Przegld .................................................................................................................29
Do czego s przydatne struktury danych i algorytmy? ..................................................................................... 29
Przechowywanie danych ze wiata zewntrznego ............................................................................... 30
Narzdzia programisty.......................................................................................................................... 31
Modelowanie danych ze wiata zewntrznego..................................................................................... 31
Przegld struktur danych................................................................................................................................... 31
Przegld algorytmw ........................................................................................................................................ 31
Kilka definicji.................................................................................................................................................... 32
Baza danych.......................................................................................................................................... 32
Rekord .................................................................................................................................................. 33
SPIS TRECI
Pole ....................................................................................................................................................... 33
Klucz..................................................................................................................................................... 33
Programowanie obiektowe................................................................................................................................ 34
Problemy z jzykami proceduralnymi.................................................................................................. 34
Obiekty w telegraficznym skrcie........................................................................................................ 35
Dziaajcy program obiektowy............................................................................................................. 37
Dziedziczenie i polimorfizm ................................................................................................................ 39
Inynieria programowania................................................................................................................................. 40
Java dla programistw C++ .............................................................................................................................. 40
Brak wskanikw ................................................................................................................................. 41
Operatory przecione .......................................................................................................................... 44
Typy proste ........................................................................................................................................... 44
Operacje wejcia-wyjcia ..................................................................................................................... 44
Struktury danych w bibliotece Javy .................................................................................................................. 47
Podsumowanie .................................................................................................................................................. 47
Pytania............................................................................................................................................................... 48
2.
Tablice ...................................................................................................................49
Aplet demonstracyjny ....................................................................................................................................... 49
Wstawianie ........................................................................................................................................... 51
Wyszukiwanie ...................................................................................................................................... 51
Usuwanie .............................................................................................................................................. 52
Kwestia duplikatw .............................................................................................................................. 53
Niezbyt szybko ..................................................................................................................................... 55
Tablice w Javie.................................................................................................................................................. 55
Tworzenie tablicy ................................................................................................................................. 55
Dostp do elementw tablicy ............................................................................................................... 56
Inicjalizacja........................................................................................................................................... 56
Przykad uycia tablic........................................................................................................................... 57
Dzielenie programu na klasy............................................................................................................................. 59
Klasy LowArray i LowArrayApp......................................................................................................... 61
Interfejsy klas .................................................................................................................................................... 61
Niezbyt wygodnie................................................................................................................................. 62
Kto i za co odpowiada? ........................................................................................................................ 62
Program highArray.java ....................................................................................................................... 63
i ycie uytkownika stao si prostsze............................................................................................. 66
Abstrakcja............................................................................................................................................. 66
Aplet demonstrujcy tablic uporzdkowan ................................................................................................... 66
Wyszukiwanie liniowe ......................................................................................................................... 66
Wyszukiwanie binarne ......................................................................................................................... 67
Tablica uporzdkowana w Javie ....................................................................................................................... 69
Wyszukiwanie binarne w metodzie find()............................................................................................ 70
Klasa OrdArray..................................................................................................................................... 71
Korzyci wynikajce z uywania tablic uporzdkowanych ................................................................. 74
Logarytmy ......................................................................................................................................................... 74
Potgowanie.......................................................................................................................................... 75
Przeciwiestwo podnoszenia do potgi................................................................................................ 76
Przechowywanie obiektw................................................................................................................................ 76
Klasa Person ......................................................................................................................................... 76
Program classDataArray.java ............................................................................................................... 77
SPIS TRECI
Notacja O()........................................................................................................................................................ 81
Wstawianie do tablicy nieuporzdkowanej: czas stay......................................................................... 81
Wyszukiwanie liniowe: czas proporcjonalny do N .............................................................................. 81
Wyszukiwanie binarne: czas proporcjonalny do log(N) ...................................................................... 82
Staa niepotrzebna................................................................................................................................. 82
Czy tablice nadaj si do wszystkiego? ............................................................................................................ 83
Podsumowanie .................................................................................................................................................. 84
Pytania............................................................................................................................................................... 85
Eksperymenty.................................................................................................................................................... 86
Projekty programistyczne.................................................................................................................................. 86
3.
Proste algorytmy sortowania .................................................................................87
W szeregu zbirka!............................................................................................................................................ 88
Sortowanie bbelkowe ...................................................................................................................................... 89
Sortowanie bbelkowe zawodnikw druyny ...................................................................................... 89
Aplet demonstracyjny sortowania bbelkowego.................................................................................. 91
Sortowanie bbelkowe w Javie............................................................................................................. 94
Niezmienniki ........................................................................................................................................ 97
Wydajno sortowania bbelkowego ................................................................................................... 97
Sortowanie przez wybr.................................................................................................................................... 98
Sortowanie przez wybr druyny baseballowej ................................................................................... 98
Aplet demonstracyjny sortowania przez wybr ................................................................................. 100
Sortowanie przez wybr w Javie ........................................................................................................ 101
Niezmiennik........................................................................................................................................ 103
Wydajno sortowania przez wybr................................................................................................... 103
Sortowanie przez wstawianie .......................................................................................................................... 103
Sortowanie przez wstawianie druyny baseballowej ......................................................................... 103
Aplet demonstracyjny sortowania przez wstawianie.......................................................................... 104
Sortowanie przez wstawianie w Javie ................................................................................................ 107
Niezmiennik w sortowaniu przez wstawianie .................................................................................... 110
Wydajno sortowania przez wstawianie ........................................................................................... 110
Sortowanie obiektw....................................................................................................................................... 111
Program sortujcy tablic obiektw ................................................................................................... 111
Porwnania leksykograficzne............................................................................................................. 114
Stabilno............................................................................................................................................ 115
Porwnanie prostych algorytmw sortowania ................................................................................................ 115
Podsumowanie ................................................................................................................................................ 115
Pytania............................................................................................................................................................. 116
Eksperymenty.................................................................................................................................................. 117
Projekty programistyczne................................................................................................................................ 118
4.
Stosy i kolejki ......................................................................................................121
Inny rodzaj struktur danych............................................................................................................................. 121
Narzdzia programisty........................................................................................................................ 121
Ograniczony dostp ............................................................................................................................ 122
Bardziej abstrakcyjne ......................................................................................................................... 122
Stosy ................................................................................................................................................................ 122
Analogia pocztowa ............................................................................................................................. 123
Aplet demonstracyjny stosu................................................................................................................ 124
SPIS TRECI
5.
Listy powizane ...................................................................................................177
Poczenia........................................................................................................................................................ 178
Referencje i typy proste ...................................................................................................................... 179
Relacja, nie pozycja ............................................................................................................................ 180
Aplet demonstracyjny listy powizanej .......................................................................................................... 181
Przycisk Ins......................................................................................................................................... 181
Przycisk Find ...................................................................................................................................... 182
Przycisk Del........................................................................................................................................ 182
Prosta lista powizana ..................................................................................................................................... 183
Klasa Link........................................................................................................................................... 183
Klasa LinkList .................................................................................................................................... 184
Metoda insertFirst() ............................................................................................................................ 185
Metoda deleteFirst() ........................................................................................................................... 186
Metoda displayList()........................................................................................................................... 187
Program linkList.java ......................................................................................................................... 187
Wyszukiwanie i usuwanie okrelonych elementw........................................................................................ 190
Metoda find()...................................................................................................................................... 193
Metoda delete()................................................................................................................................... 193
Inne metody ........................................................................................................................................ 194
Listy dwustronne ............................................................................................................................................. 194
Wydajno list powizanych........................................................................................................................... 198
Abstrakcyjne typy danych............................................................................................................................... 199
Implementacja stosu przy uyciu listy powizanej ............................................................................ 199
Implementacja kolejki przy uyciu listy powizanej ......................................................................... 202
Typy danych i abstrakcja .................................................................................................................... 205
Listy abstrakcyjne............................................................................................................................... 206
Abstrakcyjne typy danych jako narzdzia projektowe ....................................................................... 206
SPIS TRECI
6.
Rekurencja ...........................................................................................................239
Liczby trjktne............................................................................................................................................... 239
Okrelanie wartoci n-tego elementu przy uyciu ptli...................................................................... 240
Okrelanie wartoci n-tego elementu przy uyciu rekurencji ............................................................ 241
Program triangle.java.......................................................................................................................... 243
Co si tak naprawd dzieje? ............................................................................................................... 244
Charakterystyczne cechy metod rekurencyjnych ............................................................................... 245
Czy rekurencja jest efektywna? .......................................................................................................... 246
Indukcja matematyczna ...................................................................................................................... 247
Silnia ............................................................................................................................................................... 247
Anagramy ........................................................................................................................................................ 248
Rekurencyjne wyszukiwanie binarne.............................................................................................................. 254
Zastpienie ptli rozwizaniem rekurencyjnym ................................................................................. 255
Algorytmy dziel i zwyciaj ........................................................................................................... 258
Wiee Hanoi.................................................................................................................................................... 259
Aplet Towers Workshop..................................................................................................................... 260
Przesuwanie poddrzew ....................................................................................................................... 261
Algorytm rekurencyjny....................................................................................................................... 262
Program towers.java ........................................................................................................................... 262
Sortowanie przez scalanie ............................................................................................................................... 265
Scalanie dwch posortowanych tablic................................................................................................ 265
Sortowanie przez scalanie .................................................................................................................. 268
Applet MergeSort Workshop.............................................................................................................. 271
Program mergeSort.java ..................................................................................................................... 272
Efektywno dziaania algorytmu sortowania przez scalanie ............................................................ 276
10
SPIS TRECI
7.
Zaawansowane algorytmy sortowania.................................................................297
Sortowanie Shella............................................................................................................................................ 297
Sortowanie przez wstawianie: zbyt wiele operacji kopiowania ......................................................... 298
N-sortowanie ...................................................................................................................................... 298
Usuwanie odstpw............................................................................................................................ 300
Aplet Shellsort Workshop .................................................................................................................. 301
Kod algorytmu Shella napisany w Javie............................................................................................. 303
Inne sekwencje dostpw ................................................................................................................... 306
Efektywno dziaania algorytmu Shella ........................................................................................... 306
Podzia danych ................................................................................................................................................ 307
Aplet demonstracyjny Partitioning..................................................................................................... 307
Program Partition.java ........................................................................................................................ 309
Algorytm podziau danych ................................................................................................................. 311
Efektywno dziaania algorytmu podziau........................................................................................ 314
Quicksort ......................................................................................................................................................... 314
Algorytm quicksort............................................................................................................................. 315
Wybr wartoci osiowej ..................................................................................................................... 316
Aplet demonstracyjny QuickSort1 ..................................................................................................... 321
Obnienie efektywnoci do rzdu O(N2)............................................................................................ 325
Wybr mediany trzech elementw ..................................................................................................... 326
Obsuga dzielenia niewielkich grup danych ....................................................................................... 331
Usuwanie rekurencji ........................................................................................................................... 335
Efektywno dziaania algorytmu quicksort....................................................................................... 335
Sortowanie pozycyjne ..................................................................................................................................... 338
Algorytm sortowania pozycyjnego..................................................................................................... 338
Projekt programu ................................................................................................................................ 339
Efektywno sortowania pozycyjnego ............................................................................................... 339
Podsumowanie ................................................................................................................................................ 340
Pytania............................................................................................................................................................. 341
Eksperymenty.................................................................................................................................................. 343
Projekty programw........................................................................................................................................ 343
8.
Drzewa binarne ....................................................................................................345
Dlaczego warto uywa drzew binarnych?..................................................................................................... 345
Wolne wstawianie elementw do tablicy uporzdkowanych............................................................. 346
Wolne wyszukiwanie w listach powizanych .................................................................................... 346
SPIS TRECI
11
12
SPIS TRECI
9.
Drzewa czerwono-czarne.....................................................................................405
Sposb omwienia struktury........................................................................................................................... 406
Zasada dziaania ................................................................................................................................. 406
Wstawianie zstpujce........................................................................................................................ 406
Drzewa zrwnowaone i drzewa niezrwnowaone ...................................................................................... 406
Degeneracja do O(N).......................................................................................................................... 407
Rwnowaenie drzewa ....................................................................................................................... 408
Cechy drzewa czerwono-czarnego ..................................................................................................... 408
Korygowanie struktury ....................................................................................................................... 410
Aplet demonstracyjny RBTree........................................................................................................................ 410
Kliknicie obrazka wza.................................................................................................................... 411
Przycisk Start...................................................................................................................................... 411
Przycisk Ins......................................................................................................................................... 411
Przycisk Del........................................................................................................................................ 411
Przycisk Flip ....................................................................................................................................... 411
Przycisk RoL ...................................................................................................................................... 412
Przycisk RoR ...................................................................................................................................... 412
Przycisk R/B ....................................................................................................................................... 412
Komunikaty tekstowe ......................................................................................................................... 412
Gdzie jest przycisk Find? ................................................................................................................... 412
wiczenia z apletem demonstracyjnym.......................................................................................................... 413
wiczenie 2. obroty ....................................................................................................................... 414
wiczenie 3. odwracanie kolorw................................................................................................. 414
wiczenie 4. drzewo niezrwnowaone ....................................................................................... 415
Dalsze wiczenia ................................................................................................................................ 416
Reguy RB i drzewa zrwnowaone .................................................................................................. 416
Potomek pusty .................................................................................................................................... 416
Obroty ............................................................................................................................................................. 417
Proste operacje obrotu ........................................................................................................................ 417
Tajemniczy wze krzyowy .............................................................................................................. 418
Obracanie gazi drzewa..................................................................................................................... 418
Ludzie przeciw komputerom .............................................................................................................. 420
Wstawianie nowego wza .............................................................................................................................. 421
Przebieg procedury wstawiania .......................................................................................................... 421
Odwrcenia kolorw w trakcie przeszukiwania................................................................................. 422
Obroty po wstawieniu wza .............................................................................................................. 423
Obroty w trakcie przeszukiwania ....................................................................................................... 429
Usuwanie......................................................................................................................................................... 432
Wydajno drzew czerwono-czarnych............................................................................................................ 432
Implementacja drzewa czerwono-czarnego .................................................................................................... 433
Inne drzewa zrwnowaone ............................................................................................................................ 433
Podsumowanie ................................................................................................................................................ 434
Pytania............................................................................................................................................................. 434
wiczenia ........................................................................................................................................................ 436
10.
Drzewa 2-3-4 i pami zewntrzna......................................................................437
Wprowadzenie................................................................................................................................................. 437
Skd nazwa? ....................................................................................................................................... 438
Organizacja drzewa 2-3-4................................................................................................................... 439
SPIS TRECI
13
11.
Tablice rozproszone .............................................................................................487
Algorytmy rozpraszania wprowadzenie..................................................................................................... 488
Numery pracownikw jako klucze danych ........................................................................................ 488
Sownik............................................................................................................................................... 489
Rozpraszanie....................................................................................................................................... 492
Kolizje ................................................................................................................................................ 494
Adresowanie otwarte....................................................................................................................................... 495
Aplet demonstracyjny Hash................................................................................................................ 496
Kod tablicy rozproszonej z sondowaniem liniowym ......................................................................... 500
Sondowanie kwadratowe.................................................................................................................... 507
Podwjne rozpraszanie ....................................................................................................................... 510
14
SPIS TRECI
12.
Sterty ....................................................................................................................541
Wprowadzenie................................................................................................................................................. 542
Kolejki priorytetowe, sterty i abstrakcyjne typy danych .................................................................... 542
Sabe uporzdkowanie ........................................................................................................................ 544
Usuwanie danych................................................................................................................................ 544
Wstawianie danych............................................................................................................................. 546
Operacja zamiany wzw.................................................................................................................. 546
Aplet demonstracyjny Heap ............................................................................................................................ 548
Przycisk Fill........................................................................................................................................ 548
Przycisk Chng..................................................................................................................................... 549
Przycisk Rem...................................................................................................................................... 549
Przycisk Ins......................................................................................................................................... 549
Przykad implementacji sterty......................................................................................................................... 549
Wstawianie danych............................................................................................................................. 550
Usuwanie danych................................................................................................................................ 551
Zmiana klucza..................................................................................................................................... 552
Rozmiar tablicy................................................................................................................................... 553
Program heap.java .............................................................................................................................. 553
Zwikszanie rozmiaru tablicy sterty................................................................................................... 558
Wydajno operacji na stercie ............................................................................................................ 559
Sterta oparta na drzewie .................................................................................................................................. 559
Sortowanie stertowe ........................................................................................................................................ 560
Opuszczanie wzw .......................................................................................................................... 561
Uycie tej samej tablicy...................................................................................................................... 563
Program heapSort.java........................................................................................................................ 563
Wydajno sortowania stertowego ..................................................................................................... 568
Podsumowanie ................................................................................................................................................ 568
Pytania............................................................................................................................................................. 569
wiczenia ........................................................................................................................................................ 570
Propozycje programw ................................................................................................................................... 570
SPIS TRECI
15
13.
Grafy ....................................................................................................................573
Wprowadzenie................................................................................................................................................. 573
Definicje ............................................................................................................................................. 574
Nota historyczna ................................................................................................................................. 576
Reprezentacja grafu w programie....................................................................................................... 577
Wstawianie wierzchokw i krawdzi ................................................................................................ 579
Klasa Graph ........................................................................................................................................ 580
Wyszukiwanie ................................................................................................................................................. 581
Wyszukiwanie wgb (DFS) ........................................................................................................... 582
Przeszukiwanie wszerz (BFS)......................................................................................................... 591
Minimalne drzewo rozpinajce ....................................................................................................................... 597
Aplet demonstracyjny GraphN........................................................................................................... 598
Kod algorytmu minimalnego drzewa rozpinajcego.......................................................................... 599
Program mst.java ................................................................................................................................ 600
Sortowanie topologiczne grafw skierowanych ............................................................................................. 603
Przykad warunki wstpne kursw ................................................................................................ 604
Grafy skierowane................................................................................................................................ 604
Sortowanie topologiczne .................................................................................................................... 605
Aplet demonstracyjny GraphD........................................................................................................... 606
Cykle i drzewa .................................................................................................................................... 607
Kod algorytmu sortowania topologicznego........................................................................................ 608
Spjno w grafach skierowanych .................................................................................................................. 613
Tabela pocze .................................................................................................................................. 614
Algorytm Warshalla ........................................................................................................................... 614
Implementacja algorytmu Warshalla.................................................................................................. 617
Podsumowanie ................................................................................................................................................ 617
Pytania............................................................................................................................................................. 617
wiczenia ........................................................................................................................................................ 618
Propozycje programw ................................................................................................................................... 619
14.
Grafy waone .......................................................................................................621
Minimalne drzewo rozpinajce grafu waonego ............................................................................................ 621
Przykad: telewizja kablowa w dungli .............................................................................................. 622
Aplet demonstracyjny GraphW .......................................................................................................... 622
Wysyamy inspektorw ...................................................................................................................... 623
Algorytm............................................................................................................................................. 627
Kod algorytmu.................................................................................................................................... 629
Program mstw.java ............................................................................................................................. 631
Problem najkrtszej cieki............................................................................................................................. 636
Linia kolejowa .................................................................................................................................... 636
Algorytm Dijkstry............................................................................................................................... 638
Agenci i podre pocigiem ............................................................................................................... 638
Aplet demonstracyjny GraphDW ....................................................................................................... 642
Kod algorytmu.................................................................................................................................... 646
Program path.java ............................................................................................................................... 650
Problem najkrtszej cieki dla wszystkich par wierzchokw ...................................................................... 654
Wydajno....................................................................................................................................................... 656
16
SPIS TRECI
15.
Waciwe stosowanie struktur i algorytmw .......................................................663
Uniwersalne struktury danych......................................................................................................................... 663
Szybko pracy i algorytmy ............................................................................................................... 664
Biblioteki ............................................................................................................................................ 665
Tablice ................................................................................................................................................ 666
Listy powizane .................................................................................................................................. 666
Drzewa przeszukiwa binarnych........................................................................................................ 666
Drzewa zrwnowaone....................................................................................................................... 667
Tablice rozproszone............................................................................................................................ 667
Porwnanie uniwersalnych struktur danych....................................................................................... 668
Wyspecjalizowane struktury danych............................................................................................................... 668
Stos ..................................................................................................................................................... 669
Kolejka................................................................................................................................................ 669
Kolejka priorytetowa .......................................................................................................................... 669
Porwnanie wyspecjalizowanych struktur danych............................................................................. 670
Sortowanie....................................................................................................................................................... 670
Grafy ............................................................................................................................................................... 671
Pami zewntrzna.......................................................................................................................................... 671
Zapis sekwencyjny ............................................................................................................................. 672
Pliki indeksowane............................................................................................................................... 672
B-drzewa............................................................................................................................................. 672
Algorytmy rozpraszania ..................................................................................................................... 672
Pami wirtualna ................................................................................................................................ 673
Co dalej?.......................................................................................................................................................... 674
A
Uruchamianie apletw demonstracyjnych i programw przykadowych............675
Aplety demonstracyjne.................................................................................................................................... 675
Programy przykadowe ................................................................................................................................... 676
Software Development Kit firmy Sun Microsystems ..................................................................................... 676
Wiersz polece ................................................................................................................................... 676
Ustawienie cieki .............................................................................................................................. 677
Wywietlanie apletw demonstracyjnych .......................................................................................... 677
Praca z apletami demonstracyjnymi ................................................................................................... 678
Uruchamianie przykadowych programw ........................................................................................ 678
Kompilowanie programw przykadowych ....................................................................................... 679
Modyfikowanie kodu rdowego...................................................................................................... 679
Koczenie pracy programw przykadowych .................................................................................... 679
Pliki klas.......................................................................................................................................................... 679
Inne systemy wspomagania programowania................................................................................................... 680
SPIS TRECI
17
B
Literatura..............................................................................................................681
Algorytmy i struktury danych ......................................................................................................................... 681
Obiektowe jzyki programowania .................................................................................................................. 682
Obiektowe projektowanie i inynieria oprogramowania ................................................................................ 682
C
Odpowiedzi na pytania sprawdzajce..................................................................683
Rozdzia 1., Przegld ................................................................................................................................... 683
Odpowiedzi na pytania ....................................................................................................................... 683
Rozdzia 2., Tablice ..................................................................................................................................... 684
Odpowiedzi na pytania ....................................................................................................................... 684
Rozdzia 3., Proste algorytmy sortowania ................................................................................................... 684
Odpowiedzi na pytania ....................................................................................................................... 684
Rozdzia 4., Stosy i kolejki .......................................................................................................................... 685
Odpowiedzi na pytania ....................................................................................................................... 685
Rozdzia 5., Listy powizane....................................................................................................................... 685
Odpowiedzi na pytania ....................................................................................................................... 685
Rozdzia 6., Rekurencja............................................................................................................................... 686
Odpowiedzi na pytania ....................................................................................................................... 686
Rozdzia 7., Zaawansowane algorytmy sortowania .................................................................................... 686
Odpowiedzi na pytania ....................................................................................................................... 686
Rozdzia 8., Drzewa binarne........................................................................................................................ 687
Odpowiedzi na pytania ....................................................................................................................... 687
Rozdzia 9., Drzewa czerwono-czarne ........................................................................................................ 687
Odpowiedzi na pytania ....................................................................................................................... 687
Rozdzia 10., Drzewa 2-3-4 i pami zewntrzna ....................................................................................... 688
Odpowiedzi na pytania ....................................................................................................................... 688
Rozdzia 11., Tablice rozproszone............................................................................................................... 688
Odpowiedzi na pytania ....................................................................................................................... 688
Rozdzia 12., Sterty...................................................................................................................................... 689
Odpowiedzi na pytania ....................................................................................................................... 689
Rozdzia 13., Grafy...................................................................................................................................... 689
Odpowiedzi na pytania ....................................................................................................................... 689
Rozdzia 14., Grafy waone......................................................................................................................... 689
Odpowiedzi na pytania ....................................................................................................................... 689
Skorowidz ............................................................................................................691
6
Rekurencja
W tym rozdziale:
Liczby trjktne.
Silnia.
Anagramy.
Rekurencyjne wyszukiwanie binarne.
Wiee Hanoi.
Sortowanie przez scalanie.
Eliminacja rekurencji.
Niektre interesujce zastosowania rekurencji.
Liczby trjktne
Twierdzi si, e pitagorejczycy grupa greckich matematykw pracujcych pod przewodnictwem
Pitagorasa (autor synnego twierdzenia nazwanego jego nazwiskiem) czuli mistyczny zwizek
z cigiem liczb: 1, 3, 6, 10, 15, 21, (gdzie trzykropek oznacza, e cig jest nieskoczony). Czy
jeste w stanie okreli kolejn liczb tego cigu?
240
6. REKURENCJA
N-ty element cigu jest uzyskiwany poprzez dodanie liczby n do poprzedniego elementu cigu.
A zatem, drugi element cigu to 2 plus warto pierwszego elementu (czyli 1), co daje 3. Trzeci element cigu to 3 plus 3 (warto drugiego elementu), co daje 6; i tak dalej.
Liczby nalece do tego cigu s nazywane liczbami trjktnymi, gdy mona je przedstawi
za pomoc odpowiedniej iloci obiektw rozmieszczonych w formie trjkta. Na rysunku 6.1 uyto
w tym celu niewielkich trjktw.
RYSUNEK 6.1.
Liczby trjktne
RYSUNEK 6.2.
Liczba trjktna
przedstawiona
w postaci kolumn
241
LICZBY TRJKTNE
W czwartym elemencie cigu pierwsza kolumna zawiera cztery kwadraciki, druga trzy kwadraciki, i tak dalej. Dodajc 4 + 3 + 2 + 1 uzyskujemy warto 10.
Przedstawiona poniej metoda
oblicza liczby trjktne, wykorzystujc opisan wczeniej metod kolumnow. Sumuje ona wszystkie kolumny, zaczynajc od tej o wysokoci n i koczc na kolumnie o wysokoci 1:
!
""
#
#
Metoda wykonuje zawarto ptli n razy; za pierwszym razem do zmiennej
dodawana
jest warto n, za drugim n 1 i tak dalej, a do wartoci 1. Ptla koczy si w momencie, gdy
zmienna n osignie warto 0.
RYSUNEK 6.3.
Liczba trjktna jako
suma kolumny i trjkta
242
6. REKURENCJA
$
!
%&
'(
#
Jednak jaka jest zaleta tego rozwizania? Mona sdzi, e napisanie metody $
!
%"
&
jest rwnie zoonym zadaniem jak napisanie metody
przedstawionej w poprzedniej czci rozdziau.
Patrzc na rysunek 6.3 mona jednak zauway, e suma wszystkich pozostaych kolumn dla
n-tego elementu cigu jest taka sama jak warto wszystkich kolumn elementu n 1. A zatem,
znajc metod sumujc wszystkie kolumny elementu n-tego, mona by jej uy do obliczenia wszystkich pozostaych kolumn tego elementu, przekazujc w jej wywoaniu argument n 1:
)!%&
"
'(
#
Zastanawiajc si nad powysz metod, mona doj do wniosku, e robi ona dokadnie to
samo co metoda
, czyli sumuje wszystkie kolumny dla pewnej wartoci n, przekazanej
jako argument jej wywoania. Czy zatem nie mona by uy samej metody
zamiast wprowadzania kolejnej metody? Rozwizanie takie miaoby nastpujc posta:
"
'(
#
By moe pomys, aby metoda wywoywaa sam siebie jest nieco szokujcy, ale dlaczego miaoby to by niemoliwe? W kocu wywoanie metody jest (midzy innymi) przekazaniem sterowania
na pocztek okrelonej metody. To przekazanie moe by wykonane zarwno spoza metody jak i z jej
wntrza.
Przekazywanie koszyka
Wszystkie te metody mog nieco przypomina przekazywanie koszyka. Kto kae nam okreli
warto dziewitej liczby trjktnej. Wiemy, e jej warto to * plus warto smej liczby trjktnej, zatem woamy Henia i prosimy go po okrelenie wartoci smej liczby trjktnej. Gdy Henio
udzieli nam odpowiedzi, podan przez niego warto dodajemy do 9 i w ten sposb uzyskujemy
poszukiwan odpowied.
Henio wie, e sma liczba trjktna to 8 plus warto sidmej liczby trjktnej, dlatego woa
Sabink i prosi j o obliczenie sidmej liczby trjktnej. Ten proces powtarza si, a kada kolejna
osoba przekazuje koszyk nastpnej.
W ktrym momencie to przekazywanie koszyka koczy si? W pewnym momencie kto musi
by w stanie poda odpowied bez koniecznoci proszenia o pomoc kolejnej osoby. Gdyby to si nie
zdarzyo, powstaby nieskoczony acuch osb, proszcych kolejne osoby o pomoc co w stylu
arytmetycznego schematu Ponziego, ktry nigdy by si nie zakoczy. W przypadku metody "
oznaczaoby to, e metoda ta w wywoywaaby sam siebie w nieskoczonej sekwencji, ktra
doprowadziaby do awarii programu.
LICZBY TRJKTNE
243
+
"
#
Warunek, ktry sprawia, e metoda rekurencyjna zwraca warto bez kolejnego wywoania, nazywany jest przypadkiem bazowym. Umieszczenie takiego warunku w kadej metodzie rekurencyjnej ma kluczowe znaczenie, gdy tylko dziki niemu metoda nie wywouje samej siebie w nieskoczono, doprowadzajc w kocu do awarii programu.
Program triangle.java
Czy metody rekurencyjne sprawdzaj si w praktyce? Uruchamiaj program triangle.java mona si
przekona, e tak. Po podaniu numeru obliczanego elementu (liczby n), program wywietli warto
odpowiedniej liczby trjktnej. Kod programu zosta przedstawiony na listingu 6.1.
LISTING 6.1.
Program triangle.java
,-
$
!%!
%%!./0%
1. %
'
'
23-41''
'
-,
,5
%41''
%6 .
' .%%-
789
:;<=%'
7,
,' >$
%!.2>
6 .:
1 6 .
7,
,' >)
%%!.
>1
#
%
244
6. REKURENCJA
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%
+
"
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%77
:;<=%'
:' 7?:' 7? 7,
@ ++?.@ ++?
7.,A
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%:
:;<=%'
77
:,':
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#
%41''
7,
,' >C%
2>
LICZBY TRJKTNE
245
+
7,
,' >D%
%>
#
' "
7,
,' >D%
%>'
'
#
#
246
6. REKURENCJA
RYSUNEK 6.4.
Rekurencyjna
metoda triangle()
247
SILNIA
Indukcja matematyczna
Rekurencja jest programistycznym odpowiednikiem indukcji matematycznej. Indukcja matematyczna to sposb definiowania pewnego zagadnienia poprzez to zagadnienie (ten sam termin jest take
uywany w odniesieniu do podobnej metody udowadniania poprawnoci twierdze). Wykorzystujc
indukcj matematyczn mona zdefiniowa liczby trjktne w nastpujcy sposb:
tri(n) = 1
tri(n) = n + tri(n 1)
jeli n = 1
jeli n > 1
Definiowanie pewnego zagadnienia przy uyciu jego samego moe si bardzo wydawa dziwne, niemniej jednak sposb ten jest cakowicie poprawny (zakadajc, e istnieje warunek bazowy).
Silnia
Silnia jest pojciowo zbliona do liczb trjktnych, z t rnic, i zamiast dodawania jest uywane mnoenie. Liczba trjktna dla pewnej wartoci n jest okrelana poprzez dodanie tej wartoci do
liczby trjktnej odpowiadajcej wartoci n 1. Z kolei warto n silnia uzyskiwana jest poprzez
pomnoenie n razy warto n 1 silnia. Oznacza to, e wartoci pitej liczby trjktnej jest 5 + 4
+ 3 + 2 + 1, natomiast 5 silnia to 5 4 3 2 1, co daje 120. W tabeli 6.1 zostay przedstawione
silnie liczb od 0 do 9.
Na mocy definicji warto 1 silnia wynosi 1. Jak wida wartoci silni rosn niezwykle szybko.
Silnie mona oblicza przy uyciu metody rekurencyjnej przypominajcej metod
.
Oto jej kod:
%+%
+
5+%
"
#
248
6. REKURENCJA
TABELA 6.1.
Silnie
Liczba
Obliczenie
Silnia
0
1
2
3
4
5
6
7
8
9
z definicji
11
21
32
46
5 24
6 120
7 720
8 5 040
9 40 320
1
1
2
6
24
120
720
5 040
40 320
362 880
A po drugie, warunek bazowy zachodzi w przypadku gdy argument ma warto 0, a nie 1, jak to
byo w przypadku metody
. Poniej zostay przedstawione przykadowe wyniki wygenerowane przez program obliczajcy silni, podobny do programu triangle.java:
$
%!.2
7IG
Rysunek 6.5 pokazuje, w jaki sposb kolejne inkarnacje metody +%
wywouj same
siebie, w przypadku gdy w pierwszym wywoaniu zostaa przekazana warto 4.
Obliczenie silni jest klasycznym sposobem prezentacji zagadnienia rekurencji. Niemniej jednak
sposobu obliczania silni nie mona przedstawi w sposb graficzny rwnie atwo jak wyznaczania
liczb trjktnych.
W podobny, rekurencyjny sposb mona rozwizywa wiele innych problemw numerycznych,
takich jak obliczanie najwikszego wsplnego dzielnika dwch liczb (sucego do uzyskania jak
najmniejszego uamka), podnoszenie liczby do potgi, i tak dalej. Take w tych przypadkach s to
jedynie ciekawe sposoby prezentacji algorytmw rekurencyjnych, ktre nie bd zapewne uywane w praktyce, gdy algorytmy wykorzystujce ptle s znacznie bardziej efektywne.
Anagramy
W tej czci rozdziau zosta przedstawiony kolejny problem, ktry w elegancki sposb mona
rozwiza przy uyciu rekurencji. Permutacja jest rozmieszczeniem elementw w cile okrelonej
kolejnoci. Zamy, e chcielibymy stworzy list anagramw pewnego sowa czyli wszystkie
permutacje liter tworzcych dane sowo (niezalenie do tego, czy uzyskane w ten sposb cigi liter tworz sensowne sowa, czy te nie). Stworzenie listy anagramw sowa kot daoby nastpujce wyniki:
ANAGRAMY
249
RYSUNEK 6.5.
Rekurencyjna
metoda factorial()
kot,
kto,
otk,
okt,
tok,
tko.
Warto sprbowa samodzielnie uoy tak list anagramw. Mona si przekona, e ilo dostpnych moliwoci odpowiada silni z iloci liter tworzcych sowo. Dla 3 liter istnieje 6 moliwych
sw, dla 4 liter 24 sowa, dla 5 liter 120 sw, i tak dalej (zakadamy przy tym, e wszystkie
litery sowa s unikalne; w przypadku powtarzania si liter ilo uzyskiwanych sw bdzie mniejsza).
W jaki sposb mona by napisa program tworzcy anagramy sowa? Oto jedno z moliwych
rozwiza. Zamy, e sowo skada si z n liter.
(1) Utworzenie anagramw n 1 liter sowa z pominiciem skrajnej lewej litery.
(2) Cykliczne przesunicie wszystkich n liter.
(3) Powtrzenie powyszych czynnoci n razy.
250
6. REKURENCJA
Cykliczne przesunicie sowa oznacza przesunicie wszystkich jego liter o jedn pozycj w lewo,
z wyjtkiem skrajnej, lewej litery, ktra jest zapisywana z prawej strony wyrazu, tak jak pokazano
na rysunku 6.6.
RYSUNEK 6.6.
Cykliczne
przesuwanie sowa
Cykliczne przesuwanie sowa n razy powoduje, e kada litera znajdzie si na jego pocztku.
W momencie gdy dana litera sowa zajmuje miejsce na jego pocztku, tworzone s anagramy wszystkich pozostaych liter (czyli s one zapisywane na wszystkich moliwych pozycjach). Dla sowa kot
skadajcego si wycznie z trzech liter, cykliczne przesunicie dwch pozostaych liter sprowadza
si do zamienienia ich miejscami. Caa sekwencja tworzenia anagramw sowa kot zostaa przedstawiona w tabeli 6.2.
TABELA 6.2.
Tworzenie anagramw sowa kot
Sowo
Wywietla?
Pierwsza litera
Pozostae litery
Operacja
MQV
MVQ
MQV
QVM
QMV
QVM
VMQ
VQM
VMQ
MQV
Tak
Tak
Nie
Tak
Tak
Nie
Tak
Tak
Nie
Nie
M
M
M
Q
Q
Q
V
V
V
M
QV
VQ
QV
VM
MV
VM
MQ
QM
MQ
QV
Cyklicznie przesuwamy QV
Cyklicznie przesuwamy VQ
Cyklicznie przesuwamy MQV
Cyklicznie przesuwamy VM
Cyklicznie przesuwamy MV
Cyklicznie przesuwamy QVM
Cyklicznie przesuwamy MQ
Cyklicznie przesuwamy QM
Cyklicznie przesuwamy VMQ
Gotowe
Naley zauway, e przed przesuniciem sowa trzyliterowego konieczne jest dodatkowe przesunicie sowa dwuliterowego, ktre przywraca ich oryginaln kolejno. W ten sposb generowana
jest sekwencja sw:
,
,
. Powtarzajce si sowa nie s wywietlane.
ANAGRAMY
251
A w jaki sposb mona stworzy anagramy n 1 liter oryginalnego sowa? Wystarczy wywoa
t sam metod. Rekurencyjna metoda
1
pobiera tylko jeden argument liczb okrelajc wielko sowa, dla ktrego naley utworzy anagramy. Sowo to tworzy n liter oryginalnego
sowa, zapisanych z jego prawej strony. Za kadym razem gdy metoda
1
wywouje sama
siebie, przetwarzane sowo jest o jedn liter krtsze ni poprzednio, co pokazano na rysunku 6.7.
RYSUNEK 6.7.
Rekurencyjna metoda
doAnagram()
Warunek bazowy jest speniony w momencie gdy sowo, dla ktrego metoda ma utworzy list anagramw, ma dugo jednej litery. W takim przypadku wykonywanie metody koczy si, gdy
nie mona zmieni kolejnoci w jakiej jest zapisana jedna litera. W kadym innym przypadku, metoda tworzy list anagramw wszystkich liter przekazanego sowa, z wyjtkiem jego skrajnej lewej
litery, a nastpnie cyklicznie przesuwa cae sowo. Te dwie czynnoci s wykonywane n razy, gdzie n
jest dugoci sowa przekazanego w wywoaniu metody. Poniej zosta przedstawiony kod rekurencyjnej metody
1
:
252
6. REKURENCJA
+ 7!
(
!.(
J%!
+
K7!
'
!%
1 7!"
!'
!
(%
+ 7!G
.!!(L.
(
')
(
7!
#
#
RYSUNEK 6.8.
Coraz mniejsze wyrazy
ANAGRAMY
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%-
1 7!
+ 7!
(
!.(M
J%!
+
K7!
'
!%M
1 7!"
'
!
(%
+ 7!G
.!L!M
')
(
7!
'! %%!(
#
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'!
0'
!%L
!
'
'
!%
J%(
' .%%-
7!
'
!"7!
%'38'
9!'L '!0L
+
'
K!
'! '
!
(
38"9389
38"9'!' '!0
J%
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%-
')
+ %
K**
253
254
6. REKURENCJA
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%77
:;<=%'
:' 7?:' 7? 7,
@ ++?.@ ++?
7.,A
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#
%11''
Metoda
cyklicznie przesuwa sowo o jedn liter w lewo, w sposb opisany we wczeniejszej czci rozdziau. Metoda ')
wywietla sowo, dodajc do niego liczb uatwiajc okrelenie iloci wygenerowanych sw. Poniej zostay przedstawione przykadowe wyniki
wygenerowane przez program:
)'!
2
GFEBH
IO*G
FEBHIO
*GGGGGFGE
@
''@
<"
% :
% :
@
''@
G
+ 8% :9%&
255
By moe warto przeczyta fragment dotyczcy przeszukiwania binarnego w tablicach uporzdkowanych zamieszczony w rozdziale 2., wyjaniajcy zasad dziaania powyszej metody. Mona take uruchomi aplet orderedArray.java przedstawiony w rozdziale 2., aby przekona si jak
dziaa wyszukiwanie binarne.
Powyszy algorytm wykorzystujcy ptl stosunkowo atwo mona przeksztaci na algorytm
rekurencyjny. W metodzie bazujcej na ptli najpierw modyfikowane s wartoci zmiennych
"
@
lub ''@
okrelajcych przeszukiwany zakres, a nastpnie wykonywana jest pozostaa
cz ptli. Kade wykonanie ptli powoduje podzielenie zakresu (mniej wicej) na poow.
% :
% :
@
''@
G
+ 8% :9%&
256
6. REKURENCJA
''@
oraz
@
. Dlatego te zostaa stworzona specjalna porednia, publiczna metoda
+
. Jest ona wywoywana przez metod
, a w jej wywoaniu naley przekaza tylko jeden
argument warto poszukiwanego klucza. Metoda +
podaje poprawne pocztkowe wartoci zmiennych
@
oraz ''@
(ktrymi s odpowiednio: oraz <"), a nastpnie
wywouje prywatn rekurencyjn metod %Q
. Poniej przedstawiono kod metody +
:
' .%+
%&
%Q %&MM<"
#
<#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%+
%&
%Q %&MM<"
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'-%Q
%&M
@
M
''@
% :
% :
@
''@
G
+ 8% :9%&
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%-
-
!' .%
+
K<
!
!'
+ 89-
!
.
+
<""
L!'! /L
898"9
89-
<'
L!
.%
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%-
'
!
%.%
+
K<
.%M
7,
,' 89>>
7,
,' >>
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#
%
1
%@7%1''
' .%%-
789
=7!
.%
1
(
.%
1 =7!
!.%L
, IG
!'
, *
, EB
, GH
, BE
, **
, EE
, GI
, FB
, O
, O
, O
, *
, I
, HF
, FH
257
258
6. REKURENCJA
,'
.%L
%&GI!
+ ,+ %&
R,!
W programie binarySearch.java w tablicy zostao zapisanych 16 liczb. Na rysunku 6.9 pokazano, w jaki sposb metoda %Q
rekurencyjnie wywouje sam siebie, za kadym razem zmniejszajc przeszukiwany zakres tablicy. Gdy wewntrzne wywoanie metody odnajdzie poszukiwany
element, ktry w tym przypadku ma warto 27, metoda koczy dziaanie i zwraca indeks odnalezionej wartoci, ktry w naszym przypadku ma warto 2 (o czym mona si take przekona, analizujc wywietlon zawarto tablicy). Warto wynikowa jest nastpnie przekazywana jako wynik kadego wywoania metody %Q
, a w kocu metoda +
zwraca go uytkownikowi klasy.
Rekurencyjny algorytm wyszukiwania binarnego ma t sam zoono dziaania co algorytm
wykorzystujcy ptl zoono O(logN). Jest on nieco bardziej elegancki, cho jednoczenie nieco
wolniejszy.
WIEE HANOI
259
RYSUNEK 6.9.
Rekurencyjna metoda
binarySearch()
Wiee Hanoi
Wiee Hanoi to staroytna zagadka skadajca si z pewnej iloci dyskw umieszczonych na trzech
kolumnach, w sposb przedstawiony na rysunku 6.10.
Wszystkie dyski maj rne rednice oraz otwory na samym rodku, dziki czemu mona je
umieszcza na kolumnach. Pocztkowo wszystkie dyski s umieszczane na kolumnie A. Celem zagadki jest przeniesienie wszystkich dyskw na kolumn C. W kadym ruchu mona przenosi tylko jeden dysk, a dodatkowo aden dysk nie moe by umieszczony na dysku o mniejszej rednicy.
260
6. REKURENCJA
RYSUNEK 6.10.
Wiee Hanoi
Istnieje staroytna legenda twierdzca, e gdzie w Indiach, w niedostpnej wityni, mnisi pracuj dzie i noc, aby przenie 64 zote dyski z jednej wysadzanej diamentami kolumny na drug.
Gdy skocz, ma nastpi koniec wiata. Na szczcie, wszelkie obawy jakie mona poczu po poznaniu tej legendy znikn, gdy okae si, jak wiele czasu zajmuje rozwizanie tej zagadki, nawet dla
znacznie mniejszej iloci dyskw.
RYSUNEK 6.11.
Aplet demonstracyjny
Wiee Hanoi
WIEE HANOI
261
Przesuwanie poddrzew
Zamy, e pocztkowe rozmieszczenie dyskw na kolumnie A, przypominajce ksztatem drzewo
lub piramid, okrelimy mianem drzewa. (Takie drzewa nie maj nic wsplnego z drzewiastymi
strukturami danych, opisywanymi w innych rozdziaach niniejszej ksiki). Bawic si apletem, mona zauway, e podobne, lecz mniejsze drzewa s generowane jako fragmenty procesu rozwizywania zagadki. Te mniejsze drzewa, zawierajce jedynie cz caoci dyskw uywanych z zagadce,
bdziemy nazywa poddrzewami. Na przykad mona zauway, e w przypadku zagadki wykorzystujcej cztery dyski, w jednym z krokw porednich wystpuje poddrzewo skadajce si z 3 dyskw
umieszczonych na kolumnie B (przedstawione na rysunku 6.12).
RYSUNEK 6.12.
Poddrzewo
na kolumnie B
262
6. REKURENCJA
Oto regua, ktra moe pomc w samodzielnym rozwizywaniu zagadki. Jeli poddrzewo, ktre
chcemy przesun, skada si z nieparzystej liczby dyskw, to dysk znajdujcy si na jego wierzchoku mona umieci bezporednio na docelowej kolumnie. Jeli natomiast przesuwane poddrzewo zawiera parzyst ilo dyskw, dysk znajdujcy si na jego wierzchoku naley przesun na rodkow kolumn.
Algorytm rekurencyjny
Rozwizanie problemu Wie Hanoi mona wyrazi w sposb rekurencyjny, wykorzystujc przy tym
notacj poddrzew. Zamy, e chcemy przenie wszystkie dyski z kolumny rdowej (nazwijmy
j Z) na kolumn docelow (oznaczon symbolem D). Dostpna jest kolumna pomocnicza (oznaczana symbolem I). Zakadamy take, e na kolumnie Z znajduje si n dyskw. Oto algorytm:
(1) Przenie poddrzewo skadajce si z n 1 dyskw z kolumny Z na kolumn I.
(2) Przenie ostatni (najwikszy dysk) z kolumny Z na D.
(3) Przenie poddrzewo z kolumny I na D.
Na samym pocztku kolumn rdow jest kolumna A, kolumn pomocnicz kolumna B,
a docelow kolumna C. Na rysunku 6.13 zostay przedstawione trzy kroki ilustrujce ten sposb
rozwizywania problemu Wie Hanoi.
W pierwszej kolejnoci poddrzewo skadajce si z dyskw 1, 2 oraz 3 jest przesuwane na
kolumn B. Nastpnie najwikszy dysk 4 jest przesuwany na kolumn C. W ostatnim kroku
cae poddrzewo jest przesuwane z kolumny B na C.
Oczywicie algorytm ten nie pokazuje, w jaki sposb mona przenie poddrzewo skadajce si
z dyskw 1, 2 oraz 3 na kolumn B, gdy w jednym ruchu nie mona przenie caego poddrzewa
jeden ruch umoliwia przeniesienie tylko jednego dysku. Przeniesienie poddrzewa skadajcego
si z trzech dyskw nie jest zadaniem prostym. Niemniej jednak jest prostsze ni przeniesienie drzewa skadajcego si z czterech dyskw.
Jak si okazuje, przesunicie trzech dyskw z kolumny A na docelow kolumn B take mona
zrealizowa poprzez wykonanie tych samych trzech czynnoci, koniecznych do przeniesienia czterech
dyskw. Te czynnoci to: przeniesienie poddrzewa skadajcego si z dwch pierwszych dyskw
z kolumny A na pomocnicz kolumn C, przeniesienie trzeciego dysku z kolumny A na docelow
kolumn B i w kocu przeniesienie poddrzewa z kolumny C na B.
A w jaki sposb mona przenie poddrzewo skadajce si z dwch dyskw z kolumny A na C?
Ot naley przenie poddrzewo skadajce si z jednego dysku (1) z kolumny A na B. To jest przypadek bazowy: przesuwajc jeden dysk, mona go po prostu zdj z jednej kolumny i umieci na
drugiej nie wymaga to adnych dodatkowych czynnoci. Nastpnie pozostaje przeniesienie wikszego dysku (2) z kolumny A na C i umieszczenie na nim poddrzewa (czyli dysku 1).
Program towers.java
Program towers.java rozwizuje zagadk Wie Hanoi przy uyciu algorytmu rekurencyjnego. Program przedstawia wykonywane czynnoci, wywietlajc stosowne opisy; takie rozwizanie znacznie upraszcza kod programu, ktry w przypadku koniecznoci wywietlania kolumn i dyskw byby znacznie bardziej skomplikowany. Zadaniem uytkownika programu jest odczytanie listy operacji
i samodzielne wykonanie odpowiednich czynnoci.
WIEE HANOI
263
RYSUNEK 6.13.
Rekurencyjne
rozwizanie
problemu
Wie Hanoi
264
6. REKURENCJA
4
CMT1TMT@TMT3T
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%-
4
'6M
%%M%M%
+
'6
265
266
6. REKURENCJA
Wyobramy sobie dwie posortowane tablice. Tablice te nie musz by tej samej wielkoci. Zamy przykadowo, e tablica A zawiera 4 elementy, a tablica B 6 elementw. W wyniku scalenia
zawarto tych tablic zostanie zapisana w tablicy C, ktra pocztkowo skada si z 10 pustych komrek. Tablice te zostay przedstawione na rysunku 6.14.
RYSUNEK 6.14.
Scalanie dwch tablic
Cyfry umieszczone w keczkach widoczne na rysunku 6.14 okrelaj kolejno, w jakiej elementy tablic A i B s zapisywane w tablicy C. W tabeli 6.3 zostay przedstawione porwnania, ktre
naley wykona, aby okreli, jakie elementy maj by skopiowane. Kroki zamieszczone w tabeli
odpowiadaj czynnociom przedstawionym na rysunku. Po kadym porwnaniu mniejszy z elementw jest zapisywany w tablicy C.
TABELA 6.3.
Czynnoci zwizane ze scalaniem tablic
Krok
Kopiowanie
1
2
3
4
5
6
7
8
9
10
Warto zwrci uwag, i po wykonaniu kroku 8. tablica B jest pusta, a zatem nie ma potrzeby
wykonywania jakichkolwiek dodatkowych porwna; wszystkie pozostae elementy tablicy A mona po prostu skopiowa do tablicy C.
267
Listing 6.5 przedstawia napisany w Javie program realizujcy operacj scalenia zaprezentowan na rysunku 6.14 oraz w tabeli 6.3. Nie jest to program rekurencyjny jest on jedynie wstpem, ktry pozwoli zrozumie dziaanie algorytmu sortowania przez scalanie.
LISTING 6.5.
Program merge.java
,-
$
0%%/%.!'%
!
%!%,
1. %
'
23-U1''
%U1''
' .%%-
789
891GFMEIMOM*B#
89@IMEMF*MBBMHGMIE#
89389
1MEM@MHM3
' 3M
#
%
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
(0%!.%1@!' 0%%!
.%3
' .%%-
891M!1M
89@M!@M
893
C=M.C=M%C=
C=K!1VV.C=K!@
.%'
+ 18C=9K@8.C=9
38%C=918C=9
38%C=9@8.C=9
C=K!1
.%@ @
' M
38%C=918C=9.%1 1
.C=K!@
.%1 1
' M
38%C=9@8.C=9.%@ @
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.%
' .%%-
' 891M!
+
K!
268
6. REKURENCJA
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#
%U1''
W metodzie
tworzone s trzy tablice 1, @ oraz 3, nastpnie wywoywana jest metoda
scalajca tablice 1 i @ i zapisujca ich zawarto w tablicy
3, a w kocu zawarto tablicy 3 jest wywietlana. Oto wyniki wykonania programu:
IEGFF*EIBBHGIEO*B
269
RYSUNEK 6.15.
Scalanie coraz
wikszych tablic
W grnej powce tablicy zakresy 4-4 i 5-5 s scalane do zakresu 4-5, zakresy 6-6 i 7- 7 do zakresu 6-7, a zakresy 4-5 i 6-7 do zakresu 4-7. W kocu dolna powka tablicy (zakres 0-3) oraz jej
grna powka (zakres 4-7) s czone w pen, posortowan tablic (zakres 0-7).
Jeli natomiast ilo elementw tablicy nie jest potg liczby 2, zachodzi konieczno scalenia
tablic o rnych wielkociach. Na przykad rysunek 6.16 przedstawia sytuacj, w ktrej sortowana
tablica zawiera 12 elementw. W tym przypadku naley scali tablice zawierajc 2 elementy z tablic zawierajc 1 element, uzyskujc w ten sposb tablic trjelementow.
270
6. REKURENCJA
RYSUNEK 6.16.
Scalanie tablic,
ktrych wielko
nie jest potg
liczby 2
W pierwszej kolejnoci jednoelementowy zakres 0-0 jest scalany z jednoelementowym zakresem 1-1, tworzc w ten sposb dwuelementowy zakres 0-1. Nastpnie zakres 0-1 jest scalany z jednoelementowym zakresem 2-2. W ten sposb tworzony jest trjelementowy zakres 0-2. Ten zakres
jest z kolei scalany z trjelementowym zakresem 3-5. Proces ten trwa a do posortowania caej tablicy.
271
Naley zauway, e algorytm sortowania przez scalanie nie scala dwch niezalenych tablic,
zapisujc ich elementy w trzeciej, jak to byo robione w programie merge.java. Zamiast tego scalane s dwa fragmenty tej samej tablicy, w ktrej take s zapisywane wyniki scalenia.
Mona si zastanawia, gdzie s przechowywane wszystkie te podtablice. Algorytm tworzy
w tym celu tablic robocz, ktrej wielko odpowiada wielkoci oryginalnej sortowanej tablicy.
Wszystkie podtablice s przechowywane w odpowiednich miejscach tej tablicy roboczej. Oznacza to,
e podtablice wyznaczone w oryginalnej tablicy s kopiowane w odpowiednie miejsca tablicy roboczej. Po kadym scaleniu zawarto tablicy roboczej jest kopiowana z powrotem do tablicy oryginalnej.
RYSUNEK 6.17.
Aplet demonstracyjny
sortowania przez scalanie
Strzaki lower oraz upper oznaczaj zakres liczb aktualnie analizowany przez algorytm, z kolei
strzaka mid wskazuje rodek rozpatrywanego zakresu. Pocztkowo zakres obejmuje ca sortowan tablic, a nastpnie jest dzielony na poowy za kadym razem, gdy metoda
wywouje
sama siebie. Gdy rozpatrywany zakres zawiera jeden element, metoda zostaje zakoczona jest
to warunek bazowy algorytmu. W przeciwnym przypadku scalane s dwie podtablice. Aplet wywietla take komunikaty tekstowe, na przykad: Will sort lower half: 0-5, informujc uytkownika
o wykonywanych czynnociach oraz o aktualnie rozpatrywanym zakresie tablicy.
Wiele krokw algorytmu polega na wywoaniu metody
lub zwracaniu wartoci. Operacje porwnywania oraz kopiowania s wykonywane wycznie podczas procesu scalania, kiedy to
aplet generuje komunikaty o postaci Merged 0-0 and 1-1 into workspace. Samego scalenia nie
mona zaobserwowa, gdy obszar roboczy nie jest prezentowany. Niemniej jednak, po skopiowaniu
272
6. REKURENCJA
odpowiedniego fragmentu obszaru roboczego do oryginalnej tablicy, mona zobaczy wyniki scalenia supki w danym zakresie zostan wywietlone w kolejnoci rosncej.
Na samym pocztku zostan posortowane dwa pierwsze supki, nastpnie pierwsze trzy supki,
potem pierwsze dwa supki zakresu 3-4, trzy supki zakresu 3-5, sze supkw zakresu 0-5, i tak
dalej, zgodnie z sekwencj przedstawion na rysunku 6.16. W kocu wszystkie supki zostan posortowane.
Klikajc przycisk Run (Uruchom), mona zada wykonania caego algorytmu. Proces ten
mona jednak w dowolnej chwili przerwa, klikajc przycisk Step. Po przerwaniu wykonywania algorytmu mona go realizowa krokowo naciskajc przycisk Step jak rwnie wznowi wykonywanie cige klikajc ponownie przycisk Run.
Podobnie jak w innych apletach demonstrujcych algorytmy sortowania, take i w tym kliknicie przycisku New (Nowe) powoduje zapisanie w tablicy nowej grupy nieposortowanych liczb oraz
przecza wypenianie tablicy liczbami losowymi bd liczbami zapisanymi w kolejnoci malejcej.
Przycisk Size (Wielko) umoliwia zmian iloci sortowanych liczb dostpne iloci to 12 oraz 100.
Wyjtkowo pouczajce jest obserwowanie dziaania algorytmu podczas sortowania 100 liczb zapisanych pocztkowo w kolejnoci malejcej. Wywietlane wyniki bardzo wyranie pokazuj, jak
kolejne zakresy s sortowane niezalenie do siebie, a nastpnie scalane, oraz jak zakresy staj si coraz to wiksze.
Program mergeSort.java
W dalszej czci rozdziau zostanie przedstawiony cay program mergeSort.java. W pierwszej kolejnoci przeanalizujemy jednak metod, ktra realizuje algorytm sortowania przez scalanie. Oto jej kod:
'--
%U7
89
7'%M
@
M
''@
+
@
''@
!!,M
! '
@
''@
G
0'
(/L
%U7
7'%M
@
M
'0'
(/L
%U7
7'%MM ''@
%'
'
(/
7'%M
@
MM ''@
#
% !
#
%
%U7
Jak mona si przekona, oprcz przypadku bazowego, kod metody zawiera wycznie cztery
inne instrukcje. Jednak z nich wyznacza punkt rodkowy analizowanego zakresu, dwie kolejne s
rekurencyjnymi wywoaniami metody %U7
(po jednym dla kadej powki analizowanego zakresu), a ostatni jest wywoanie metody
scalajcej posortowane powki zakresu. Przypadek bazowy zachodzi, gdy analizowany zakres zawiera tylko jeden element (czyli gdy
@
''@
); w takiej sytuacji dziaanie metody zostanie bezzwocznie zakoczone.
273
274
6. REKURENCJA
+
@
''@
!!,M
! '
@
''@
G
0'
(/L
%U7
7'%M
@
M
'0'
(/L
%U7
7'%MM ''@
%'
'
(/
7'%M
@
MM ''@
#
% !
#
%
%U7
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'--
89
7'%M
$M
$M ''@
.!
.
%!
@
$
$"
''@
"
@
/
$KVV$K ''@
7'%8918$9
+
K
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#
%%C1
%U7
1''
' .%%-
789
275
Wyniki wykonania tego programu przedstawiaj jedynie nieposortowan oraz posortowan zawarto tablicy:
HEGFFIGOBEEF**OFH
FGGFFFHEEHEIOB**O
276
6. REKURENCJA
Mniej wicej te same informacje zwrciby aplet demostracyjny MergeSort, gdyby by w stanie sortowa jedynie cztery elementy. Analiza powyszych wynikw oraz porwnanie ich z kodem
metody %U7
i rysunkiem 6.15 umoliwi dokadne zrozumienie zasady dziaania omawianego algorytmu sortowania.
Ilo kopiowa
Przeanalizujmy rysunek 6.15. Kada komrka umieszczona poniej grnego wiersza liczb reprezentuje dan skopiowan z tablicy do obszaru roboczego.
Dodajc do siebie ilo wszystkich komrek widocznych na rysunku 6.15 (w siedmiu ponumerowanych etapach), mona si przekona, e posortowanie 8 elementw wymaga wykonania 24 operacji kopiowania. Log28 ma warto 3, a zatem 8 log28 daje 24. Wynika std, e dla tablicy zawierajcej 8 elementw, ilo operacji kopiowania jest proporcjonalna do wartoci N log2N.
Na analizowany proces sortowania mona jednak spojrze w inny sposb. Ot posortowanie
8 liczb wymaga 3 poziomw, a kady z nich skada si z 8 operacji kopiowania. Poziom oznacza
w tym przypadku wszystkie operacje kopiowania do podtablicy o takiej samej wielkoci. Na pierwszym poziomie wykorzystywane s cztery podtablice 2-elementowe, na drugim poziomie dwie
podtablice 4-elementowe, a na trzecim poziomie jednak podtablica 8-elementowa. Kady poziom
zawiera 8 elementw. A zatem take przy takim podejciu wykonywanych jest 3 8, czyli 24 operacje
kopiowania.
Analizujc fragmenty rysunku 6.15, mona si przekona, e do posortowania 4 elementw koniecznych jest 8 operacji kopiowania (etapy 1, 2 oraz 3), a do posortowania 2 elementw dwie
operacje kopiowania. Identyczne obliczenia pozwalaj okreli ilo operacji kopiowania, jakie naley wykona w celu posortowania wikszych tablic. Podsumowanie tych informacji zostao przedstawione w tabeli 6.4.
277
TABELA 6.4.
Ilo operacji wykonywanych w przypadku gdy N jest potg liczby 2
N
log2N
2
4
8
16
32
64
128
1
2
3
4
5
6
7
2
8
24
64
160
384
896
4
16
48
128
320
768
1792
1 (1)
5 (4)
17 (12)
49 (32)
129 (80)
321 (192)
769 (448)
W rzeczywistoci sortowane liczby nie s kopiowane jedynie do obszaru roboczego, lecz take z powrotem do oryginalnej tablicy. Oznacza to, e ilo operacji kopiowania jest dwukrotnie
wiksza, co zostao odzwierciedlone w kolumnie czna ilo operacji kopiowania. Ostatnia kolumna tabeli 6.4 zawiera informacje dotyczce iloci porwna; to zagadnienie zostanie opisane
w dalszej czci rozdziau.
Nieco trudniej jest obliczy ilo operacji kopiowania oraz ilo porwna w przypadku gdy N
nie jest wielokrotnoci liczby 2. Wyniki uzyskiwane w tych przypadkach mieszcz si w granicach
uzyskiwanych dla liczb stanowicych potgi liczby 2. Na przykad dla 12 elementw koniecznych
jest 88 operacji kopiowania, a dla 100 elementw 1344 operacje kopiowania.
Ilo porwna
W przypadku algorytmu sortowania przez scalanie ilo porwna, jakie naley wykona w celu posortowania tablicy, zawsze jest nieco mniejsza od iloci koniecznych operacji kopiowania. O ile mniejsza? Zakadajc, e ilo sortowanych elementw jest wielokrotnoci liczby 2, dla kadej niezalenej operacji scalania maksymalna ilo porwna jest zawsze o jeden mniejsza od iloci scalanych
elementw. Z kolei minimalna ilo porwna odpowiada poowie iloci scalanych elementw.
O prawdziwoci tych oblicze mona si przekona, analizujc rysunek 6.18, przedstawiajcy dwie
sytuacje, jakie mog zaj podczas scalania dwch 4-elementowych tablic.
W pierwszym przypadku elementy s rozmieszczone naprzemiennie, a do scalenia tablic naley wykona siedem porwna. W drugim przypadku wszystkie elementy pierwszej tablicy s
mniejsze od wszystkich elementw drugiej tablicy, a zatem do scalenia obu tablic konieczne bd
tylko cztery porwnania.
Podczas kadego sortowania wykonywanych jest wiele operacji scalania, a zatem naley zsumowa iloci porwna wykonywanych w ramach poszczeglnych operacji scalania. Odwoujc si
ponownie do rysunku 6.15, mona si przekona, e posortowanie omiu elementw wymaga wykonania siedmiu operacji scalania. Iloci scalanych elementw oraz odpowiadajce im iloci porwna zostay przedstawione w tabeli 6.5.
Maksymalna ilo porwna, jakie naley wykona podczas kadej operacji scalania, jest o jeden mniejsza od iloci scalanych elementw. Po dodaniu odpowiednich liczb dla wszystkich wykonywanych operacji scalania okazuje si, e maksymalna ilo porwna wynosi 17.
Z kolei minimalna ilo porwna zawsze jest o poow mniejsza od iloci scalanych elementw, co, po zsumowaniu wszystkich operacji scalania, daje w rezultacie wynik 12. W taki sam sposb zostay wyznaczone wyniki podane w kolumnie Ilo porwna tabeli 6.4. Faktyczna ilo
porwna, jakie naley wykona w celu posortowania konkretnej tablicy, zaley od kolejnoci, w jakiej s zapisane jej elementy; niemniej jednak zawsze bdzie to liczba leca pomidzy przedstawion
powyej wartoci minimaln i maksymaln.
278
6. REKURENCJA
RYSUNEK 6.18.
Maksymalna
i minimalna
ilo porwna
TABELA 6.5.
Porwnania wykonywane podczas sortowania 8 elementw
Numer kroku
Ilo sumaryczna
Ilo scalanych
elementw (N)
Maksymalna ilo
porwna (N 1)
Minimalna ilo
porwna (N / 2)
24
17
12
Eliminacja rekurencji
Niektre algorytmy mona zaimplementowa w sposb rekurencyjny, a inne nie. Jak mona si byo
przekona, rekurencyjne metody
oraz +%
mona zaimplementowa przy uyciu
ptli, a co wicej, rozwizanie takie bdzie bardziej efektywne ni uycie rekurencji. Niemniej jednak, wiele algorytmw dziaajcych wedug zasady dziel i zwyciaj, takich jak na przykad sortowanie przez scalanie, dziaa bardzo dobrze, wykorzystujc wanie rekurencj.
Czsto zdarza si, e algorytm mona atwo wyobrazi sobie jako metod rekurencyjn, jednak
po jego implementacji okazuje si, e takie rozwizanie jest mao efektywne. W takich przypadkach
warto przeksztaci algorytm rekurencyjny na odpowiadajcy mu algorytm, ktry nie wykorzystuje
rekurencji. Takie przeksztacenie algorytmu rekurencyjnego czsto moe bazowa na wykorzystaniu stosu.
ELIMINACJA REKURENCJI
279
Rekurencja i stosy
Istnieje bardzo bliski zwizek pomidzy rekurencj i stosami. W rzeczywistoci przewaajca wikszo kompilatorw implementuje mechanizmy rekurencyjne wanie w oparciu o stosy. Zgodnie
z informacjami podanymi wczeniej, w momencie wywoywania metody kompilator zapisuje na stosie argumenty przekazywane do metody oraz adres powrotu (okrelajcy miejsce, gdzie zostanie przekazane sterowanie po jej zakoczeniu), po czym przekazuje sterowanie do metody. Gdy metoda koczy
dziaanie, informacje zapisane na stosie przed jej uruchomieniem zostaj ze stosu usunite. Argumenty metody znikaj, a sterowanie jest przekazywane pod wskazany adres powrotu.
+
"
#
Algorytm ten zostanie teraz podzielony na poszczeglne czynnoci, z ktrych kada bdzie reprezentowana przez osobn klauzul % w instrukcji % (podobnego podziau metody mona
take dokona, stosujc instrukcj
dostpn w C++ oraz innych jzykach programowania, jednak w Javie instrukcja ta nie istnieje).
Instrukcja % zostaa umieszczona w metodzie o nazwie '
. Kade wywoanie tej metody powoduje wykonanie jednej z klauzul % umieszczonych w instrukcji %. Cykliczne wywoywanie metody '
spowoduje w kocu wykonanie wszystkich operacji algorytmu.
Przedstawiona powyej metoda
wykonuje dwa rodzaje operacji. Pierwsz z nich
jest wykonanie oblicze arytmetycznych koniecznych do wyznaczenia wartoci liczby trjktnej. Wymaga ona sprawdzenia, czy warto jest rwna oraz dodanie do wartoci zwrconej przez rekurencyjne wywoanie metody. Niemniej jednak metoda
wykonuje take inne operacje,
konieczne do jej poprawnego wykonania; mona do nich zaliczy przekazywanie sterowania, pobieranie argumentw oraz zwracanie wartoci wynikowej. Operacji tych nie mona zauway, analizujc kod metody, jednak wystpuj one we wszystkich tworzonych metodach. Poniej zostay oglnie
opisane czynnoci wykonywane podczas wywoywania metody:
W momencie wywoywania metody jej argumenty oraz adres powrotu s zapisywane na stosie.
Metoda moe uzyska dostp do argumentw, pobierajc je z wierzchoka stosu.
Bezporednio przed zakoczeniem dziaania metody ze stosu pobierany jest adres powrotu,
a nastpnie zarwno ten adres, jak i argumenty wywoania metody s usuwane ze stosu.
280
6. REKURENCJA
Program stackTriangle.java zawiera trzy klasy: $, 7%W oraz 7%41''. Klasa
$ reprezentuje adres powrotu oraz argument wywoania metody ; obiekty tej klasy s zapisywane na stosie. Klasa 7%W przypomina klasy implementujce stosu przedstawione w innych rozdziaach tej ksiki; wyrnia j jedynie to, i umoliwia operowanie na obiektach klasy $.
Klasa 7%41'' zawiera cztery metody:
, %4
, '
oraz znan ju metod :
suc do pobierania danych liczbowych.
Metoda
prosi uytkownika o podanie liczby, nastpnie wywouje metod %4
(ktrej zadaniem jest wyznaczenie liczby trjktnej odpowiadajcej liczbie podanej w wywoaniu),
a w kocu wywietla wyniki.
Metoda %4
tworzy obiekt 7%W i przypisuje waciwoci %
$ warto . Pozosta czci metody jest ptla , ktra cyklicznie wywouje metod '
. Ptla ta zostanie
zakoczona dopiero w momencie, gdy metoda '
zwrci warto , co nastpi w przypadku
wykonania szstej klauzuli % czyli punktu zakoczenia metody. Metoda '
jest w zasadzie du instrukcj %, ktrej klauzule % odpowiadaj fragmentom kodu oryginalnej metody
. Kod programu stackTriangle.java zosta przedstawiony na listingu 6.7.
LISTING 6.7.
Program stackTriangle.java
%4,-
$
!%!%!./0M!L' 0% %L
1. %
'
23-7%41''
'
-,
,5+
:;
%$'!'
' .%
' .% 1
' .%$ M
1
#
#
%$
%7%W
'-=7!
.%7%W
'-$89%1
'-
'!%
(
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%7%W
=7!
.%
%1$8=7!9
!.%L
'"!.%'
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%-
' $'
!%! !%
(
ELIMINACJA REKURENCJI
281
%18
'9' !%
(M
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%$'
'
'
. !!%
(
%18
'""9'
.M !%
(
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%$'
%! !!%
(
.!
%18
'9
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#
%7%W
%7%41''
%6 .
%1
%7%W7%
%%
$
%$$
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%-
789
:;<=%'
7,
,' >$
%!.2>
6 .:
%4
7,
,' >;'
%%!.
>1
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%-
%4
7%7%W
%
$
'
+
( '
!/%
%'
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%.
'
% %
$
%2
('
%!0
$$ 6 .MH
7%,' $
%
$G
.
%G2>%>
$7%,'
+ $,
'!
282
6. REKURENCJA
1
%
$B
%
#
%
$F
( %
.
%F2
(
$$$ $,"ME
7%,' $
%
$G%
.
%E2
.%!
$7%,'
11$,
%
$B
.
%B2%!
$7%,'
%
$$, 1 E .H
7%,'
'
.
%H2!
J%!!(
#
% %%
+
#
%
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%77
:;<=%'
:' 7?:' 7? 7,
@ ++?.@ ++?
7.,A
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%:
:;<=%'
77
:,':
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#
%7%41''
Powyszy program wyznacza warto liczb trjktnych, podobnie jak program triangle.java
przedstawiony na pocztku tego rozdziau (na listingu 6.1). Oto przykadowe wyniki jego wykonania:
$
%!.
;'
%%!.
BB
Rysunek 6.19 przedstawia relacj pomidzy poszczeglnymi klauzulami % oraz fragmentami algorytmu.
ELIMINACJA REKURENCJI
283
RYSUNEK 6.19.
Klauzule case oraz
metoda step()
Cho cay przedstawiany program symuluje jedn metod, nie nosi adnej nazwy, gdy w rzeczywistoci nie jest on prawdziw metod. Tej symulowanej metodzie nadamy umown nazw "
U
. Jej pocztkowe wywoanie (w klauzuli %) zapisuje na stosie warto podan przez uytkownika oraz warto wynikow 6, po czym przechodzi do punktu pocztkowego (klauzula %G).
W punkcie pocztkowym (klauzula %G) metoda U
sprawdza, czy przekazany argument ma warto 1. W tym celu odczytywana jest warto elementu znajdujcego si na wierzchoku
stosu (bez jego usuwania). Jeli argument ma warto 1, zachodzi przypadek bazowy i sterowanie
przekazywane jest do punktu kocowego (klauzula %B). W przeciwnym wypadku, czyli gdy warto przekazanego argumentu jest rna od 1, metoda rekurencyjnie wywouje sama siebie (klauzula
%F). To rekurencyjne wywoanie polega na umieszczeniu na stosie wartoci " i adresu
powrotu wynoszcego 4 oraz przejcia do punktu pocztkowego metody (klauzula %G).
Podczas zakaczania rekurencyjnego wywoania metody metoda U
dodaje argument
do wartoci zwrconej przez wywoanie rekurencyjne. W kocu rekurencyjne wywoanie metody
284
6. REKURENCJA
zostanie zakoczone (klauzula %B). W tym momencie ze stosu jest usuwany obiekt $ umieszczony na jego wierzchoku; obiekt ten nie jest ju do niczego potrzebny.
Adres powrotu, podany w pocztkowym wywoaniu, mia warto 6. A zatem, w momencie
zakaczania dziaania metody U
, sterowanie jest przekazywane do klauzuli %H. Umieszczony w niej kod zwraca warto , co powoduje zakoczenie ptli w metodzie %"
4
.
Warto zwrci uwag, i w powyszym opisie metody U
uywane s takie zwroty jak:
argument, wywoanie rekurencyjne oraz adres powrotu. Naley pamita, e w tym kontekcie opisuj
one jedynie symulowane cechy, a nie faktyczne informacje i operacje wykonywane przez program.
Gdyby w poszczeglnych klauzulach % zostay umieszczone instrukcje wywietlajce informacje o czynnociach wykonywanych przez metod U
, to wygenerowane wyniki mogyby
przypomina te przedstawione poniej:
$
%!.2
%,17
2
%G,17
2 EMH
%F,17 2 EMH
%G,17
2 EMH
FME
%F,17
2 EMH
FME
%G,17
2 EMH
FME
GME
%F,17
2 EMH
FME
GME
%G,17
2 EMH
FME
GME
ME
%B,17
2 EMH
FME
GME
ME
%E,17
2 EMH
FME
GME
%B,1F7
2 EMH
FME
GME
%E,1F7
2 EMH
FME
%B,1H7
2 EMH
FME
%E,1H7 2 EMH
%B,17 2 EMH
%H,17
2
;'
%%!.
Cyfra wywietlana przy sowie case okrela aktualnie wykonywany fragment kodu. Wywietlana jest take zawarto stosu (skadajca si z obiektw $ zawierajcych argument oraz
adres powrotu). Metoda U
jest rozpoczynana i zakaczana cztery razy (czemu odpowiadaj
klauzule %G oraz %B). Dopiero w momencie zakaczania tej metody obliczone wyniki zostaj
zapisywane w zmiennej 1.
Czego to dowodzi?
Program stackTriangle.java przedstawiony na listingu 6.7 jest przykadem programu, ktry, w sposb mniej lub bardziej systematyczny, przeksztaca algorytm rekurencyjny w rozwizanie wykorzystujce stos. Sugeruje to, e w podobny sposb mona przeksztaci dowolny program wykorzystujcy rekurencj. I faktycznie jest to moliwe.
Wkadajc nieco dodatkowej pracy, mona systematycznie zmodyfikowa przedstawiony program w celu poprawienia efektywnoci jego dziaania. Modyfikacje te mog nawet doprowadzi do
cakowitego zlikwidowania instrukcji %.
ELIMINACJA REKURENCJI
285
W rzeczywistoci znacznie bardziej praktycznym rozwizaniem jest przemylenie i zaimplementowanie algorytmu od podstaw, z wykorzystaniem stosu, a nie rekurencji. Listing 6.8 pokazuje
jak w takim przypadku moe si zmieni kod metody
.
LISTING 6.8.
Program stackTriangle2.java
%4G,-
$
!%!%!./0M
! 0%
M %L
1. %
'
23-7%4G1''
'
-,
,5
%!
'%%%
%7%W
'-=7!
.%
'-89%1
'-
'!%
(
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%7%W
=7!
%18=7!9
'"
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%-
' '
!%! !%
(
%18
'9'#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%'
'
'
. !!%
(
%18
'""9#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%'
%!
% !!%
(
%18
'9#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%.
<'
'
'"
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#
%7%W
%7%4G1''
%6 .
%1
%7%W7%
' .%%-
789
:;<=%'
7,
,' >$
%!.2>
7,
,+
6 .:
%4
7,
,' >;'
%%!.
>1
#
286
6. REKURENCJA
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%-
%4
7%7%W
!
1%!%
%
6 .
7%,' 6 .
!'
""6 .%%!.
#
R7%,<'
' M
67%,'
'
'
.
%M
16
%
'
!
#
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%77
:;<=%'
:' 7?:' 7? 7,
@ ++?.@ ++?
7.,A
#
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' .%%:
:;<=%'
77
:,':
#
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#
%7%4G1''
W metodzie %4
zostay umieszczone dwie krtkie ptle , zastpujce ca
metod '
wykorzystywan w programie stackTriangle.java. Oczywicie, analizujc ten program, mona si przekona, e istnieje moliwo rezygnacji z wykorzystania stosu i sprowadzenia
caego programu do prostej ptli . Niemniej jednak, w bardziej zoonych algorytmach stos
musi by wykorzystywany.
Bardzo czsto naley przeprowadza eksperymenty, aby przekona si, ktre z rozwiza rekurencyjne, wykorzystujce stos, czy te bazujce na prostej ptli jest najbardziej efektywne
w danej sytuacji.
287
rozdziau zostan przeanalizowane trzy zagadnienia: podnoszenie liczby do potgi, rozwizanie problemu plecakowego oraz wybieranie czonkw ekspedycji alpinistycznej. We wszystkich tych przypadkach zostan przedstawione wycznie oglne pojcia zwizane z danym zagadnieniem, natomiast
implementacja programu bdzie stanowi wiczenie, ktre Czytelnik moe wykona we wasnym
zakresie.
288
6. REKURENCJA
metody, argumentom x oraz y s przypisywane nowe wartoci. Konkretnie rzecz biorc, argumentowi x przypisywana jest warto x x, a argumentowi y warto y / 2. Poniej zostaa przedstawiona sekwencja argumentw i zwracanych wartoci dla argumentw pocztkowych wynoszcych
odpowiednio x = 2 oraz y = 8:
=GMO
=EME
=HMG
=GBHM
)GBHM=GBHM
)GBHM=HMG
)GBHM=EME
)GBHM=GMO
Metoda zwraca warto wynikow w momencie, gdy argument y uzyska warto 1. Gdy to nastpi, warto wynikowa jest przekazywana bez adnych modyfikacji a na sam pocztek sekwencji
wywoa metody.
Przedstawiony przykad zakada, e warto y zawsze jest parzysta (nawet po kolejnych dzieleniach). Jednak nie jest to jedyny moliwy przypadek. Poniej pokazano, w jaki sposb mona zmodyfikowa algorytm, tak aby obsugiwa take nieparzyste wartoci wykadnika (y). Realizujc kolejne rekurencyjne wywoania metody, naley uywa dzielenia cakowitego lub pomija wszelkie
uamki, ktre mog wystpi podczas dzielenia wartoci y przez 2. Natomiast pniej, podczas procesu koczenia kolejnych rekurencyjnych wywoa metody, w przypadku gdy warto y jest nieparzysta, zwrcony wynik naley dodatkowo pomnoy razy x. Oto sekwencja wywoa realizowana podczas wyznaczania wartoci 318:
=FMO
=*M*
=OME
=HBHMG
=EFEHIGM
)EFEHIGM=EFEHIGM
)EFEHIGM=HBHMG
)EFEHIGM=OME
)FOIEGEO*M=*M*'!ML%
!=
)FOIEGEO*M=FMO
Problem plecakowy
Jest to klasyczny problem informatyczny. W najprostszej postaci polega on na podejmowaniu prb
umieszczenia w plecaku elementw o rnej wadze, tak aby sumaryczna waga plecaka osigna pewn okrelon warto. Nie ma wymogu, by w plecaku zostay umieszczone wszystkie elementy.
Na przykad, zamy, e sumaryczna waga plecaka ma wynosi 20 kilogramw, a do dyspozycji mamy elementy o wagach 11, 8, 7, 6 oraz 5 kilogramw. W przypadku niewielkiej iloci elementw, ludzie cakiem dobrze radz sobie z rozwizywaniem tego problemu, sprawdzajc kolejne
moliwoci. Dlatego Czytelnik zapewne nie bdzie mie wikszych problemw z okreleniem, e
zamierzon warto 20 mona uzyska dodajc liczby 8, 7 oraz 5.
289
Jednak, aby to komputer rozwiza ten problem, konieczne bdzie podanie mu bardziej szczegowych instrukcji. Poniej zosta przedstawiony algorytm rozwizania:
(1) Jeli w jakimkolwiek momencie realizacji procesu suma wag wybranych elementw zrwna
si z wag docelow, naley zakoczy dziaanie.
(2) Pocztkowo wybierany jest pierwszy element. Wagi pozostaych elementw musz zrwna
si z wag docelow, pomniejszon o wag pierwszego wybranego elementu. Jest to nowa waga docelowa.
(3) Kolejno naley wyprbowa wszystkie dostpne kombinacje pozostaych elementw. Naley
jednak zauway, e w rzeczywistoci wcale nie trzeba sprawdza wszystkich kombinacji,
gdy sumowanie mona zakoczy w momencie, gdy sumaryczna waga wybranych elementw
przekracza wag docelow.
(4) Jeli nie uda si odnale kombinacji elementw o zadanej wadze, to naley odrzuci pierwszy
element i rozpocz cay proces od pocztku, wybierajc element kolejny.
(5) W podobny sposb naley rozpocz cay proces sprawdzania, wybierajc na pocztku trzeci,
czwarty oraz kolejne elementy, a do momentu przeanalizowania caego zbioru dostpnych elementw. Sprawdzenie wszystkich moliwoci bdzie oznacza, e poszukiwane rozwizanie
nie istnieje.
W przedstawionym powyej przykadzie rozpocznijmy od wybrania elementu o wadze 11. Teraz
suma wag pozostaych elementw ma wynosi 9 (20 minus 11). Spord dostpnych elementw
wybieramy ten o wadze 8. Sumaryczna waga wybranych elementw jest jednak mniejsza od wagi docelowej. Wyznaczamy zatem now wag docelow, wynoszc 1 (9 minus 8). Wybieramy element
o wadze 7, lecz jest on zbyt ciki, wic sprawdzamy pozostae elementy o wagach 6 i 5, jednak
take one s zbyt cikie. W tym momencie zbir dostpnych elementw zosta wyczerpany, a zatem
wiadomo, e nie istnieje kombinacja zawierajca element o wadze 8, ktrej waga sumaryczna bdzie
wynosi 9. Nastpnie wybieramy element o wadze 7, a zatem poszukiwana nowa waga docelowa wynosi 2 (9 minus 7). Na tej samej zasadzie wykonywane s kolejne czynnoci przedstawione poniej:
<2MOMIMHMB
)
%
GM
!.(
MO)
%
*MO
!.(
MOMI)
%
MI
!.
MOMH)
%
MH
!.
MOMB)
%
MB
!.
,@/
MI)
%
*MI
!.(
MIMH)
%
GMH
!.
MIMB)
%
GMB
!.
,@/
MH)
%
*MH
!.(
MHMB)
%
FMB
!.
,@/
MB)
%
*MB
!.(
,@/
O)
%
GMO
!.(
OMI)
%
GMI
!.(
OMIMH)
%
BMH
!.
OMIMB)
%
BMB' RY(
LR
Jak mona si domyli, rekurencyjna metoda mogaby wybra pierwszy element ze zbioru dostpnych elementw, a nastpnie, jeli jego waga jest mniejsza od sumarycznej wagi docelowej, wywoa sam siebie, by sprawdzi sum wag pozostaych dostpnych elementw.
290
6. REKURENCJA
W jaki sposb mona by napisa taki program? Okazuje si, e istnieje eleganckie, rekurencyjne rozwizanie tego problemu. Wie si ono z podzieleniem wszystkich kombinacji na dwie grupy: tych ktre rozpoczynaj si od alpinisty A, oraz wszystkich pozostaych. Zamy, e zadanie
wybrania druyny trzech osb spord grupy picioosobowej zapiszemy skrtowo (5, 3). Nastpnie
zamy, e wielko grupy oznaczymy przez n, a ilo osb w zespole przez k. W takim przypadku nasze twierdzenie ma posta:
(n, k) = (n 1, k 1) + (n 1, k)
W przedstawionym przykadzie, wymagajcym wybrania trzech osb spord piciu, uzyskujemy:
(5, 3) = (4, 2) + (4, 3)
W ten sposb wikszy problem zosta podzielony na dwa mniejsze. Zamiast wybierania spord grupy piciu osb, przeprowadzane s dwie operacje wyboru z grupy czterech osb. Pierwsza z nich
sprowadza si do wyznaczenia wszystkich sposobw wybrania dwch osb spord czterech, a druga do wyznaczenia wszystkich sposobw wybrania trzech osb z grupy czterech osb.
Istnieje sze sposobw wybrania dwch osb z grupy czterech osb. A zatem wyraenie (4, 2),
ktre nazwiemy wyraeniem lewym, daje sze nastpujcych kombinacji:
@3M@CM@<M3CM3<MC<
Brakujcym czonkiem grupy jest alpinista A, a zatem, aby uzyska zesp trzyosobowy, dopisujemy A do uzyskanych wynikw:
1@3M1@CM1@<M13CM13<M1C<
Istniej cztery sposoby wybrania trzech osb z grupy czterech osb. A zatem wyraenie (4, 3),
ktre nazwiemy wyraeniem prawym, daje cztery kombinacje:
@3CM@3<M@C<M3C<
291
Ten sam proces rozbioru mona zastosowa take do wyznaczenia kombinacji dla obu grup
skadajcych si z czterech osb. I tak, (4, 2) to (3, 1) + (3, 2). Jak wida, wykorzystanie rekurencji jest naturalnym sposobem rozwizania tego problemu.
Przedstawiony tu problem mona sobie wyobrazi jako drzewo, w ktrym w pierwszym wierszu znajduje si wyraenie (5, 3), w drugim wyraenia (4, 3) oraz (4, 2), i tak dalej; przy czym
poszczeglne wzy drzewa odpowiadaj rekurencyjnym wywoaniom metody. Wygld takiego
drzewa dla problemu wyboru trzech osb z grupy piciu (5, 3) zosta przedstawiony na rysunku 6.20.
RYSUNEK 6.20.
Wybieranie
trzyosobowego
zespou z grupy
piciu osb
Przypadkiem bazowym omawianego algorytmu s kombinacje nie majce adnego sensu takie, w ktrych wybierany zesp lub wielko grupy wynosi 0, lub w ktrych wielko wybieranego
zespou jest wiksza od iloci osb w caej grupie. Kombinacja (1, 1) jest poprawna, lecz jej dalszy
rozbir nie ma sensu. Na przedstawionym rysunku linie kropkowane przedstawiaj przypadki bazowe, ktre powoduj zakoczenie metody.
Gboko rekurencyjnych wywoa odpowiada iloci czonkw grupy. I tak: wierzchoek w grnym wierszu odpowiada alpinicie A, dwa wierzchoki w drugim wierszu odpowiadaj alpinicie B
i tak dalej. Jeli grupa liczy pi osb, drzewo bdzie miao pi poziomw gbokoci.
Schodzc w d drzewa, naley pamita sekwencj odwiedzanych czonkw grupy. Oto
w jaki sposb mona to zrealizowa: w przypadku wywoywania metody odpowiadajcej lewemu
wyraeniu, aktualny wierzchoek jest zapamitywany poprzez dodanie jego litery do sekwencji. Wywoania odpowiadajce lewym wyraeniom oraz litery dodawane do sekwencji zostay przedstawione na rysunku pogrubion lini. W czasie powrotu do gry konieczne bdzie usuwanie kolejnych
liter z sekwencji.
Aby zapamita wszystkie sekwencje, mona je wywietla podczas dziaania algorytmu. Podczas realizacji wywoa odpowiadajcych lewym wyraeniom nie s wywietlane adne wyniki. Jednak podczas realizacji wywoa odpowiadajcych prawym wyraeniom, sekwencja jest sprawdzana,
a w przypadku gdy aktualny wierzchoek jest poprawny i gdy dodanie do niego jednej osoby dopeni
wybierany zesp, wierzchoek zostaje dodany do sekwencji, a wyznaczony w ten sposb zesp
jest wywietlany.
292
6. REKURENCJA
Podsumowanie
Metoda rekurencyjna cyklicznie wywouje sam siebie, za kadym razem przekazujc w wywoaniu inne argumenty.
Przekazanie argumentu o pewnej wartoci powoduje, e metoda koczy dziaanie bez kolejnego wywoania samej siebie. Sytuacja ta jest nazywana przypadkiem bazowym.
Gdy najbardziej wewntrzne wywoanie metody zostaje zakoczone, rozpoczyna si proces
zakaczania kolejnych wywoa, ktry w kocu doprowadza do zakoczenia pocztkowego
wywoania.
Liczba trjktna to suma danej liczby oraz wszystkich liczb mniejszych od niej (w tym kontekcie liczba oznacza liczb cakowit). Na przykad liczba trjktna odpowiadajca liczbie 4
ma warto 10, gdy 4 + 3 + 2 + 1 wynosi 10.
Silnia liczby jest iloczynem tej liczby oraz wszystkich liczb mniejszych od niej. Na przykad
silnia 4 wynosi 4 3 2 1, czyli 24.
Zarwno liczby trjktne, jak i silnie mona oblicza za pomoc metod rekurencyjnych lub
zwyczajnej ptli.
Anagram sowa (wszystkie moliwe kombinacje n liter tworzcych sowo) mona wyznaczy
rekurencyjnie poprzez cykliczne przesuwanie wszystkich liter sowa i wyznaczanie anagramu
wszystkich n 1 liter sowa z pominiciem jego skrajnej lewej litery.
Wyszukiwanie binarne mona przeprowadzi rekurencyjnie, sprawdzajc, w ktrej powce posortowanego zakresu znajduje si poszukiwany klucz, a nastpnie wykonujc te same czynnoci
dla wyznaczonej powki.
Zagadka Wie Hanoi skada si z trzech kolumn oraz dowolnej iloci dyskw.
Zagadk Wie Hanoi mona rozwiza rekurencyjnie, przenoszc cae poddrzewo dyskw, z wyjtkiem najwikszego z nich, na kolumn pomocnicz, a nastpnie przenoszc ostatni, najwikszy dysk na kolumn docelow.
Scalenie dwch posortowanych tablic oznacza utworzenie trzeciej tablicy, zawierajcej wszystkie elementy scalanych tablicy, ktre dodatkowo s odpowiednio posortowane.
W algorytmie sortowania przez scalanie jednoelementowe podtablice stanowice fragmenty caej
tablicy s scalane w podtablice dwuelementowe, ktre nastpnie s scalane w podtablice czteroelementowe, i tak dalej. Proces ten jest kontynuowany do momentu posortowania caej tablicy.
Algorytm sortowania przez scalanie ma zoono rzdu O(N logN).
Algorytm ten wykorzystuje przestrze robocz, ktrej wielko odpowiada wielkoci sortowanej tablicy.
Rekurencyjne metody, wyznaczajce liczby trjktne, silnie, anagramy oraz realizujce wyszukiwanie binarne, zawieraj tylko jedno rekurencyjne wywoanie samych siebie (w kodzie metody realizujcej wyszukiwanie binarne s, co prawda, umieszczone dwa rekurencyjne wywoania,
jednak podczas realizacji metody wykonywane jest tylko jedno z nich).
W przypadku rekurencyjnego algorytmu rozwizujcego problem Wie Hanoi oraz algorytmu
sortowania przez scalanie, metoda zawiera dwa rekurencyjne wywoania samej siebie.
Kady problem, ktry mona rozwiza rekurencyjnie, mona take rozwiza z wykorzystaniem stosu.
Niektre rozwizania rekurencyjne mog by nieefektywne. W takim przypadkach mona je
zastpi rozwizaniami wykorzystujcymi zwyczajn ptl lub stos.
PYTANIA
293
Pytania
Przedstawione poniej pytania, naley potraktowa jako test, ktry pozwoli Czytelnikowi sprawdzi
wiadomoci. Odpowiedzi na postawione pytania mona znale w dodatku C.
(1) Jeli w programie triangle.java (listing 6.1) uytkownik wpisze 10, to jaka jest maksymalna
ilo kopii metody
(a w zasadzie ilo kopii argumentw tej metody)?
(2) Gdzie s przechowywane kopie argumentw, o ktrych bya mowa pytaniu 1.?
(a) W zmiennej zdefiniowanej w metodzie
.
(b) We waciwociach klasy 41''.
(c) W zmiennej zdefiniowanej w metodzie 7
.
(d) Na stosie.
(3) Zamy, e w pytaniu 1. uytkownik wpisa warto 10. Jaka bdzie warto , w momencie
gdy metoda
zwrci warto inn ni 1?
(4) Zamy, e zachodzi ta sama sytuacja, ktra zostaa opisana w pytaniu 1. Jaka bdzie warto , w chwili gdy metoda
przekae warto do metody
?
(5) Prawda czy fasz: wartoci zwracane przez metod
s przechowywane na stosie.
(6) W programie anagram.java (listing 6.2) na pewnym etapie rekurencyjnej sekwencji wywoa
metoda
1
operuje na acuchu znakw . Na jakich literach bdzie operowa
kolejna, rekurencyjnie wywoana wersja metody?
(7) Przedstawione przykady (a konkretnie program orderedArray.java z listingu 2.4 wykorzystujcy ptl oraz rekurencyjny program binarySearch.java z listingu 6.3) pokazay, e wywoania rekurencyjne mona umieszcza wewntrz ptli. Ktre z poniszych stwierdze nie jest
prawdziwe?
(a) Oba ze wspomnianych programw dzieliy tablic, na ktrej operoway, na poow.
(b) Jeli klucz nie zosta odnaleziony, to program wykorzystujcy ptl koczy si, gdy zostanie
przekroczony zakres tablicy, natomiast program rekurencyjny ze wzgldu na dotarcie do
najniszego poziomu rekurencyjnych wywoa.
(c) Jeli klucz zostanie odnaleziony, to w programie wykorzystujcym ptl koczy si dziaanie
caej metody, natomiast w programie rekurencyjnym tylko jednego poziomu wywoania.
(d) W rekurencyjnej wersji metody przeszukiwany zakres naley okreli przy uyciu argumentw; natomiast w programie wykorzystujcym ptl nie ma takiej koniecznoci.
(8) W algorytmie wyszukiwania binarnego, ktry nie wykorzystuje rekurencji, uywana jest ptla. Co zastpuje t ptl w metodzie %Q
w programie binarySearch.java (listing 6.3)?
(a) Metoda %Q
.
(b) Argumenty metody %Q
.
(c) Rekurencyjne wywoanie metody %Q
.
(d) Wywoanie metody %Q
umieszczone w metodzie
.
(9) Program binarySearch.java jest przykadem _________ rozwizywania problemu.
(10) Co staje si coraz mniejsze podczas wykonywania kolejnych rekurencyjnych wywoa metody %Q
?
(11) Co staje si coraz mniejsze podczas wykonywania kolejnych rekurencyjnych wywoa metody w programie towers.java (listing 6.4)?
(12) W algorytmie stosowanym w programie towers.java
(a) S wykorzystywane drzewa bdce urzdzeniami sucymi do przechowywania danych.
(b) Mniejsze dyski s potajemnie umieszczane pod wikszymi dyskami.
(c) Kolumna docelowa i pomocnicza s zamieniane.
(d) Przenoszony jest jeden najmniejszy dysk, a nastpnie cay stos wikszych dyskw.
294
6. REKURENCJA
Eksperymenty
Wykonanie poniszych eksperymentw umoliwi dokadne zrozumienie zagadnie omawianych
w tym rozdziale. Eksperymenty te nie wymagaj pisania jakichkolwiek programw.
(1) W programie triangle.java (listing 6.1) naley usun przypadek bazowy (fragmenty kodu: +
, oraz ), a nastpnie uruchomi program i sprawdzi, co si stanie.
(2) Korzystajc z apletu Towers Workshop, naley rozwiza zagadk Wie Hanoi, operujc na
siedmiu lub wikszej iloci dyskw.
(3) Naley zmodyfikowa metod
programu mergeSort.java (listing 6.6) w taki sposb, aby
tablica moga by wypeniana setkami tysicy losowych liczb. Po wprowadzeniu modyfikacji
naley uruchomi program w celu posortowania tablicy i porwna szybko jego dziaania z algorytmami sortowania przedstawionymi w rozdziale 3., Proste algorytmy sortowania.
Projekty programw
Napisanie programw stanowicych rozwizanie projektw przedstawionych w tej czci rozdziau
moe utrwali zrozumienie zagadnie omawianych w tym rozdziale i pokaza, w jaki sposb zagadnienia te mog by stosowane w praktyce.
(6.1) Zamy, e kupilimy tani kieszonkowy komputer PC i odkrylimy, e jego procesor nie jest
w stanie wykonywa operacji mnoenia jedynie dodawanie. W celu rozwizania tego problemu napisalimy rekurencyjn metod
, ktra wykonuje mnoenie liczby x i y, dodajc liczb x do siebie samej y razy. Napisz t metod oraz metod
, w ktrej bdzie
ona wywoywana. Czy operacja dodawania jest wykonywana w momencie rekurencyjnego wywoywania metody, czy te w chwili gdy metoda zwraca wynik?
(6.2) W rozdziale 8., Drzewa binarne zostan przedstawione zagadnienia zwizane z drzewami
binarnymi, w ktrych kada ga (potencjalnie) ma dokadnie dwie podgazie. Gdyby takie
drzewo narysowa na ekranie, to w grnym wierszu znalazaby si jedna ga, w nastpnym
PROJEKTY PROGRAMW
295
wierszu dwie, a w kolejnych: 4, 8 16 i tak dalej. Poniej zosta przedstawiony wygld takiego drzewa o szerokoci 16 znakw:
""""""""W"""""""
""""W"""""""W"""
""W"""W"""W"""W"
"W"W"W"W"W"W"W"W
WWWWWWWWWWWWWWWW