Znajdowanie największego i najmniejszego elementu w zbiorze n liczb całkowitych



Podobne dokumenty
Luty 2001 Algorytmy (4) 2000/2001

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 9. Karol Tarnowski A-1 p.

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

2.8. Algorytmy, schematy, programy

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Algorytmy i struktury danych. Wykład 4

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Programowanie w VB Proste algorytmy sortowania

Sortowanie danych. Jolanta Bachan. Podstawy programowania

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Opis problemu i przedstawienie sposobu jego rozwiązania w postaci graficznej. Gimnazjum nr 3 im. Jana Pawła II w Hrubieszowie 1

Strategia "dziel i zwyciężaj"

Analiza algorytmów zadania podstawowe

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Struktury danych i złożoność obliczeniowa Wykład 2. Prof. dr hab. inż. Jan Magott

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Zapisywanie w wybranej notacji algorytmów z warunkami i iteracyjnych

Programowanie w Turbo Pascal

EGZAMIN MATURALNY 2012 INFORMATYKA

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Wprowadzenie do algorytmiki

Programowanie i techniki algorytmiczne

Temat 20. Techniki algorytmiczne

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

KONSPEKT ZAJĘĆ KOŁA INFORMATYCZNEGO LUB MATEMATYCZNEGO W KLASIE III GIMNAZJUM LUB I LICEUM ( 2 GODZ.)

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Algorytm. a programowanie -

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Algorytmy. Programowanie Proceduralne 1

if (wyrażenie ) instrukcja

1 Wprowadzenie do algorytmiki

Sortowanie przez scalanie

Luty 2001 Algorytmy (7) 2000/2001

KOŁO MATEMATYCZNE LUB INFORMATYCZNE - klasa III gimnazjum, I LO

WHILE (wyrażenie) instrukcja;

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Język programowania PASCAL

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

Programowanie dynamiczne cz. 2

Algorytmy. Programowanie Proceduralne 1

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Wykład 3. Metoda dziel i zwyciężaj

WHILE (wyrażenie) instrukcja;

Algorytmy i Struktury Danych.

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

ZADANIE 1. Ważenie (14 pkt)

Algorytmy i struktury danych

Sortowanie. LABORKA Piotr Ciskowski

TEORETYCZNE PODSTAWY INFORMATYKI

Podprogramy. Procedury

TEORETYCZNE PODSTAWY INFORMATYKI

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Zapisywanie algorytmów w języku programowania

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Wszechnica Informatyczna: Algorytmika i programowanie Algorytmy poszukiwania i porządkowania. Elementy języka programowania.

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Algorytmy i struktury danych. wykład 2

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Teoretyczne podstawy informatyki

Procedury i funkcje. Przykład programu z procedurą. Definicja. Cechy procedury

Wyszukiwanie największej spośród czterech liczb. Przykładowe rozwiązanie

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Programowanie dynamiczne

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Algorytmika i pseudoprogramowanie

Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

1. Informatyka - dyscyplina naukowa i techniczna zajmująca się przetwarzaniem informacji.

Złożoność obliczeniowa zadania, zestaw 2

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

W. Guzicki Zadanie 41 z Informatora Maturalnego poziom podstawowy 1

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

WYSZUKIWANIE I PORZĄDKOWANIE INFORMACJI

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

ALGORYTMY POSZUKIWANIA I PORZĄDKOWANIA ELEMENTY JĘZYKA PROGRAMOWANIA

Indukcja matematyczna. Zasada minimum. Zastosowania.

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Podstawy Programowania

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Wstęp do Informatyki

Algorytmy sortujące i wyszukujące

Algorytm. Krótka historia algorytmów

Scenariusz lekcji. podać przykłady zalet użycia takiej instrukcji; opisać algorytm obliczania średniej n liczb;

Warunki logiczne instrukcja if

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Transkrypt:

1/12 Opracowała Kozłowska Ewa ekozbelferek@poczta.onet.pl nauczyciel przedmiotów informatycznych Zespół Szkół Technicznych Mielec, ul. Jagiellończyka 3 Znajdowanie największego i najmniejszego elementu w zbiorze n liczb całkowitych wykorzystanie programu ELBOX Laboratorium Informatyczne (ELI) oraz języka programowania TURBO PASCAL (zastosowanie zasady dziel i zwyciężaj) Analizując metody znajdowania największego i najmniejszego elementu, dostrzegamy w nich przeglądanie wszystkich elementów zbioru. W przeciwnym bowiem razie element pominięty wrozważaniach mógłby się okazać szukanym. Oto propozycja algorytmu znajdowania największego elementu w zbiorze n liczb (nazwijmy go Max). Dane: Zbiór n liczb całkowitych. Wynik: Największy element max w danym zbiorze. Krok 1. Krok 2. Przyjmij za max dowolny element ze zbioru. Dla każdego innego elementu x zbioru wykonuj: jeśli x jest większe niż max, tozamax przyjmij x. Należyzauważyć, że w kroku 2 tego algorytmu, polecenie po dwukropku musi być wykonane dla wszystkich elementów zbioru, z wyjątkiem wziętego w kroku 1, czyli n-1 razy. Przez prostą modyfikację otrzymuje się algorytm (nazwijmy go Min) znajdowania najmniejszego elementu w zbiorze n liczb. Do znajdowania największego i najmniejszego elementu w zbiorze n liczb można zastosować algorytmy Max i Min. Wkażdym z nich liczba działań wynosi n-1, awięc rozpiętość zbioru n liczb (aby znaleźć rozpiętość zbioru n liczb, wystarczy odszukać wśród nich maksimum i minimum, a potem obliczyć ich różnicę)można obliczyć, wykonując 2n-2 porównania. Tę liczbę działań można jeszcze zmniejszyć o jedno porównanie, usuwając maksimum ze zbioru danych przed wyznaczaniem w nim minimum. Wniżej prezentowanym algorytmie znajdowania maksimum i minimum wykonujemy znacznie mniej porównań i ponadto znajdujemy te dwie liczby jednocześnie (w metodzie z poprzedniego akapitu najpierw wyznaczamy maksimum, a później minimum). W algorytmach Max i Min, zkażdego wykonanego sprawdzenia, czy x>y wyciągamy jeden wniosek: x jest kandydatem na maksimum - w algorytmie Max, y jest kandydatem na minimum - w algorytmie Min.

2/12 WykonującalgorytmyMax i Min niezależnie, jeden po drugim, tę nierówność sprawdzamy dwa razy, aby uzyskać oba te wnioski. Spróbujmy połączyć działanie obu algorytmów. Porównajmy najpierw kolejne pary elementów - takich operacji wykonamy około n/2 (około, ponieważ zbiór możezawierać nieparzystą ilość elementów). Zkażdego porównania, mniejsza liczba jest kandydatem na minimum, a większa kandydatem na maksimum. Zatem w drugim etapie, będziemy szukać maksimum i minimum w zbiorach o połowę mniejszych. Algorytm Max-Min znajdowania w zbiorze maksimum i minimum jednocześnie Dane: Wyniki: Zbiór n liczb całkowitych. max i min, odpowiednio największy i najmniejszy element w zbiorze danych. Krok 1. {Podział zbioru danych na dwa podzbiory.} Połącz elementy zbioru danych w pary. Jeśli n jest liczbą nieparzystą, tojedenz elementów pozostaje wolny - oznaczmy go przez z. Porównaj elementy w parach: przypuśćmy, żedlaparyx i y mamy x>y; wtedy dołącz x do zbioru kandydatów na maksimum - oznaczmy ten zbiór przez M, ay do zbioru kandydatów na minimum - oznaczmy go przez N. Krok 2. Znajdź max w zbiorze M za pomocą algorytmu Max. Krok 3. Znajdź min w zbiorze N za pomocą algorytmu Min. Krok 4. Jeśli n jest liczbą nieparzystą, to:jeśli z<min, tozamin przyjmij z, w przeciwnym razie, jeśli z>max, tozamax przyjmij z. Krok 2: M= 4 3 9 7 max = 9 Krok 1: Podział zbioru 1>4 3>2 4>9 5>7 Krok 3: N= 1 2 4 5 min = 1 Rys. 1 Przykład działania algorytmu Max-Min Algorytm ten jest bardzo prostym przykładem postępowania zgodnie z zasadą dzielizwyciężaj.pierwszaczęść tej zasady jest zilustrowana na rys. 1. W kroku 1 tego algorytmu zbiór danych jest dzielony na dwa rozłączne podzbiory, dla których w dwóch następnych krokach są rozwiązywane podobne problemy. Zatem problem Max-Min rozpada się na dwa podproblemy, Max imin, na rozłącznych podzbiorach. Uwagi dotyczące realizacji algorytmu Max-Min: Załóżmy, że zbiór danych jest zapisany na taśmie (lub w tablicy). W algorytmie Max-Min ten zbiór jest dzielony na dwa podzbiory M i N. 1. Przyjmujemy, żejeśli w wyniku porównania dwóch kolejnych liczb x i y otrzymamy x>y, to będziemy te liczby przestawiać. W ten sposób po pierwszym kroku algorytmu, na nieparzystych miejscach na taśmie znajdą się elementy zbioru N, a na parzystych - elementy zbioru M.

3/12 2. Ponadto ujednolicamy kroki 2 i 3 oraz pozbywamy się kroku 4; jeśli liczba n jest nieparzysta, to przedłużymy ciąg, powielając ostatni jego element. Dzięki temu najmniejszy element zbioru będzie szukany w połowie komórek taśmy o indeksach nieparzystych, a największy - w drugiej połowie, o indeksach parzystych. Przy takiej organizacji danych, dla przykładu przedstawionego na rys. 1, po wykonaniu kroku 1 algorytmu liczby w ciągu danych będą występowały w kolejności:1,4,2,3,4,9,5,7, a dla zbioru złożonego z pierwszych siedmiu liczb - w kolejności:1,2,4,2,3,5,5. 3. W realizacji algorytmu Max-Min korzystamy z rozwiązań innych problemów (jest to jedna z podstawowych zasad i technik stosowanych w rozwiązywaniu problemów), możemy skorzystać z algorytmów Max i Min jako procedur (nieznacznie zmodyfikowanych - elementy największy i najmniejszy są szukane w krokach 2 i 3 wciągach złożonych z co drugiego elementu taśmy, a nie jak w algorytmie Max, wciągu kolejnych liczb). Dysponując realizacją algorytmu Max, zbudowanie realizacji Min wymaga tylko kilku ingerencji w opisach klocków tworzących schemat (schematy procedur Maksimum i Minimum nie różnią się wyglądem) 4. Krok 1 algorytmu zrealizujemy zrealizujemy również w postaci procedury. 5 6 7 8 2 3 4 1 1 2 3 4 9 5 10 6 4 11 7 12 8 9 10 4 5 1 2 3 7 6 8 iteracyjnie 10 9 4 1 2 3 5 6 7 8 10 9 13 9 11 program główny MaxMin procedura Podział procedura Minimum procedura Maximum Rys. 2 Plansze z projektu Max-Min, któryskładasię z programu głównego i trzech procedur Dla skonstruowania schematu blokowego Max-Min wprowadzamy następujące oznaczenia na zmienne: dane n -ilość elementów na taśmie, dodatnia liczba całkowita; zmienne pomocnicze m -zmienna globalna określająca liczbę iteracji w procedurach Maksimum i Minimum, gdziem=n/2, gdy n jest liczbą parzystą i (n+1)/2, gdyn jest liczbą nieparzystą,

4/12 i -w procedurach Podział, Maksimum, Minimum: lokalny licznik iteracji (liczba całkowita dodatnia), x, y - w procedurze Podział: porównywane pary zmiennych lokalnych przyjmujące wartości kolejnych wczytywanych z taśmy elementów (całkowite), u -w programie głównym MaxMin: zmienna przyjmująca wartość ostatniego elementu na taśmie, gdy n jest liczbą nieparzystą, - w procedurach Maksimum i Minimum: zmienna lokalna przyjmująca wartość kolejnych wczytywanych z taśmy elementów, max - w procedurze Maksimum: zmienna lokalna przyjmująca wartość największego elementu z dotychczas porównanych (jej wartość jest zwracana do programu głównego), - w programie głównym: zmienna przyjmująca wartość zwracaną przez procedurę Maksimum, min - w procedurze Minimun: zmienna lokalna przyjmująca wartość najmniejszego elementu z dotychczas porównanych (jej wartość jest zwracana do programu głównego), - w programie głównym: zmienna przyjmująca wartość zwracaną przez procedurę Minimun. Omówienie schematu blokowego program główny MaxMin 1. Deklaracja zmiennej globalnej m. 2. Przesunięcie wskaźnika na początek taśmy. 3. Odczyt z taśmy: n. 4. Wykonanie obliczeń: m:= n div 2 + n mod 2 (dla n parzystego m staje się równe n/2, dla nieparzystego m staje się równe (n+1)/2), tzn. m jest parzyste dla każdego n, 5. Sprawdzenie warunku: m*2<>n (sprawdzenie, czy n jest parzyste), jeżeli TAK, to 6, jeżeli NIE, to 9. 6. Przesunięcie wskaźnika na pozycję n (na ostatni element na taśmie), 7. Odczyt z taśmy do zmiennej u (automatyczne przesunięcie wskaźnika taśmy na następną pozycję,tzn.napozycję n+1). 8. Zapis na taśmę wartości zmiennej u. 9. Wywołanie bezparametrowej procedury Podział. 10. Wywołanie funkcji Maksimum. 11. Wywołanie funkcji Minimum. 12. Wyprowadzenie wartości najmniejszej liczby w ciągu (na taśmie) pamiętanej w zmiennej min, zwróconej przez procedurę Minimum. 13. Wyprowadzenie wartości największej liczby w ciągu (na taśmie) pamiętanej w zmiennej max, zwróconej przez procedurę Maksimum. procedura Podział 1. Początek procedury. 2. Przesunięcie wskaźnika na pozycję 1. 3. Przypisani licznikowi iteracji wartości początkowej 0 (i:=0). 4. Odczyt z taśmy do zmiennej x. 5. Odczyt z taśmy do zmiennej y. 6. Sprawdzenie, czy x>y, jeśli TAK to 7, jeśli NIE to 10. 7. Przesunięcie wskaźnika taśmy na pozycję 2*i+1. 8. Zapis na taśmę y. 9. Zapis na taśmę x. 10. Zwiększenie licznika iteracji o 1 (i:=i+1). 11. Sprawdzenie, czy wszystkie pary liczb zostały uwzględnione, tzn., czy i=m, jeśli TAK, to wyjście z procedury, jeśli NIE, to powrót do 4.

5/12 procedura Maksimum 1. Początek procedury. 2. Przesunięcie wskaźnika taśmy na pozycję 2(wskaźniki nieparzyste dotyczą kandydatów na min, wskaźniki parzyste dotyczą kandydatów na max). 3. Wyzerowanie licznika iteracji: i:=0 oraz przypisanie zmiennej max wartości początkowej -1 (max:= -1). 4. Sprawdzenie, czy wszystkie liczby (kandydaci na max) zostały uwzględnione: i=m, jeśli TAK, to 5, jeśli NIE, to 6. 5. Wyjście z procedury z wartością maksymalną zapamiętaną w zmiennej max. 6. Odczyt z taśmy do zmiennej u. 7. Sprawdzenie, czy u<=max, jeśli TAK, to 9, jeśli NIE, to 8. 8. Przypisanie zmiennej max wartości u (max := u). 9. Zwiększenie licznika iteracji o 1 (i:=i+1). 10. Odczyt z taśmy do zmiennej u (wskaźnik nieparzysty, kandydat na min) i powrót do 4. procedura Minimum 1. Początek procedury. 2. Przesunięcie wskaźnika taśmy na pozycję 1(wskaźniki nieparzyste dotyczą kandydatów na min, wskaźniki parzyste dotyczą kandydatów na max). 3. Wyzerowanie licznika iteracji: i:=0 oraz przypisanie zmiennej min wartości początkowej 1000 (max:= 1000). 4. Sprawdzenie, czy wszystkie liczby (kandydaci na min) zostały uwzględnione: i=m, jeśli TAK, to 5, jeśli NIE, to 6. 5. Wyjście z procedury z wartością maksymalną zapamiętaną w zmiennej min. 6. Odczyt z taśmy do zmiennej u. 7. Sprawdzenie, czy u>=min, jeśli TAK, to 9, jeśli NIE, to 8. 8. Przypisanie zmiennej min wartości u (min:= u). 9. Zwiększenie licznika iteracji o 1 (i:=i+1). 10. Odczyt z taśmy do zmiennej u (wskaźnik parzysty, kandydat na max) i powrót do 4.

6/12 Program w języku Turbo Pascal dla algorytmu Max-Min program MaxMin_Iter; type var Tablica=array[1..100] of integer; x:tablica; n,max,min:integer; procedure Czytaj(n:integer; var x:tablica); var i:integer; begin for i:=1 to n do begin write('podaj element tablicy nr ',i,': '); read(x[i]); end end; {Czytaj} procedure MaxMin(n:integer; x:tablica; var max,min:integer); {Procedura wyznacza maksimum max i minimum min jednocześnie spośród n liczb danych w tablicy x[1..n]. var i,y:integer; begin i:=2; while i<=n do begin {Podział ciągu na mniejsze i większe.} if x[i-1]>x[i] then begin y:=x[i-1]; x[i-1]:=x[i]; x[i]:=y end; i:=i+2 end; min:=x[1]; {Znajdowanie min i max.} if n=1 then max:=x[1] else begin max:=x[2]; i:=4; while i<=n do begin if min>x[i-1] then min:=x[i-1]; if max<x[i] then max:=x[i]; i:=i+2 end end; {n>1} {Uaktualnienie min i max, gdy n jest nieparzyste i n>1.} if (n>1) and (n=i-1) then begin if min>x[n] then min:=x[n]; if max<x[n] then max:=x[n] end end; {MaxMin} begin {Początek programu głównego} writeln('podaj z ilu elementów składa się tablica:'); readln(n); Czytaj(n,x); {Wczytywanie elementów do tablicy.} MaxMin(n,x,max,min); write('maksimum = '); writeln(max); write('minimum = '); writeln(min) end. {Koniec programu głównego.} Testowanie rozwiązania Program daje poprawne wyniki dla dowolnego ciągu liczb całkowitych (n>0). Testowanie nie wykazało błędu.

7/12 Złożoność Obliczmy teraz, ile porównań wykonujemy w algorytmie Max-Min. Dla uproszczenia przyjmijmy, że n jest liczbą parzystą. W kroku 1 (procedura Podział) wykonujemy n/2 porównań, które powodują podzielenie zbioru na dwa podzbiory. W krokach 2 (procedura Max) i 3 (procedura Min) jest wykonywanych n/2-1 takich działań wkażdym. W sumie, liczba porównań algorytmu Max-Min wynosi 3n/2-2, gdyn jest liczbą parzystą. Porównanie złożoności rozwiązania zadania metodą naiwną orazrozwiązania z zastosowaniem zasady dziel i zwyciężaj. dla n parzystego 1. Metoda naiwna : 2*(n-1) porównań (n-1 dla szukania max i n-1 dla szukania min). 2. Metoda z zastosowaniem zasady dziel i zwyciężaj : 3n/2-2. ilość elementów n liczba porównań metoda 1 metoda 2 2 2 1 4 6 4 6 10 7 Zestawienie to wyraźnie pokazuje, że zastosowanie zasady dziel i zwyciężaj do rozwiązania omawianego problemu jest efektywniejsze. Znajdowanie w ciągu największego i najmniejszego elementu jednocześnie za pomocą algorytmu rekurencyjnego W algorytmie Max-Min można wyróżnić trzy etapy: 1. Podziel problem na podproblemy. 2. Znajdź rozwiązania podproblemów. 3. Połącz rozwiązania podproblemów w rozwiązanie głównego problemu. Pierwszy etap polega na podziale zbioru danych na dwa podzbiory: kandydatów na maksimum i kandydatów na minimum, drugi na znajdowaniu maksimum i minimum w zbiorach kandydatów, a etap trzeci jest jedynie wyprowadzeniem rozwiązania składającego się z dwóch liczb, otrzymanych jako rozwiązania dwóch podproblemów. Naturalnym podejściem w rozwiązywaniu problemów powinno być dążenie do wykorzystania znanych rozwiązań problemów (drugi etap w powyższym schemacie). W przypadku problemu Max-Min, korzystamy na tym etapie ze znanych algorytmów znajdowania największego i najmniejszego elementu w zbiorze. Zastosowana zastała takżewrozwiązaniu tego problemu zasada dziel i zwyciężaj. W najczęściej stosowanej wersji tej metody, podproblemy, na które rozkładany jest problem, są tym samym problemem, ale dla mniejszego zbioru danych, można więc rekurencyjnie zastosować do nich tę samą metodę rozwiązywania.

8/12 W rekurencyjnym rozwiązaniu problemu Max-Min dzieli się zbiór danych na dwie części irozwiązuje w nich ten sam problem. Wyniki uzyskane w podproblemach, czyli największe i najmniejsze w nich elementy, są następnie porównywane, by określić największy i najmniejszy element w całym zbiorze. Jest to więc typowy algorytm rekurencyjny. Jako szczególny przypadek, czyli warunek zakończenia rekurencji, wyróżniamy ten sam problem na zbiorach złożonych z jednego lub z dwóch elementów. Algorytm Max-MinR(Z, max, min) Z, max, min - wykaz parametrów, dla których algorytm znajduje rozwiązanie Dane: Zbiór liczb Z. Wyniki: max i min, odpowiednio największy i najmniejszy element w zbiorze Z. Krok 1. Jeśli zbiór Z składa się z jednego elementu, to przypisz jego wartość zarówno max, jak i min. Jeśli zbiór Z składa się z dwóch elementów, to wartość większego z nich przypisz max,awartość mniejszego z nich - min. Krok 2. W przeciwnym razie: 2a. Podziel zbiór Z na dwa podzbiory Z 1 i Z 2 o tej samej lub niemal tej samej liczbie elementów. 2b. Wykonaj ten sam algorytm dla (Z 1,max 1,min 1 ). 2c. Wykonaj ten sam algorytm dla (Z 2,max 2,min 2 ). 2d. Wartość większej z liczb max 1 i max 2 przypisz max, wartość mniejszej z liczb min 1 i min 2 przypisz min. rekurencyjnie 1 autor: Ewa Kozłowska 12 13 11 2 3 4 5 6 7 11 12 14 15 13 16 17 14 8 18 15 9 10 19 1 6 20 1 7 21 22 program główny MaxMinRe procedura MaxMin_R 23 24 25

9/12 Dla skonstruowania schematu blokowego Max-Min wprowadzamy następujące oznaczenia na zmienne: dane n -ilość elementów na taśmie, dodatnia liczba całkowita; autor: Ewa Kozłowska zmienne pomocnicze w programie głównym MaxMinRe: maksimum - zmienna przyjmująca wartość największą w zbiorze minimum - zmienna przyjmująca wartość najmniejszą w zbiorze w procedurze MaxMin_R: i, j - zmienne całkowite - wskaźniki elementów zbioru w tablicy max -wskaźnik największego elementu w danym podzbiorze min -wskaźnik najmniejszego elementu w danym podzbiorze a, b - zmienne przyjmujące wartości dwuelementowego podzbioru k -wskaźnik elementu ostatniego w podzbiorze Z 1 (wskaźnik elementu dzielącego dany zbiór) max1, min1 - zmienne przyjmujące wartości wskaźnika odpowiednio, największego i najmniejszego elementu w danym podzbiorze Z 1 max2, min2 - zmienne przyjmujące wartości wskaźnika odpowiednio, największego i najmniejszego elementu w danym podzbiorze Z 2 xmax1, xmin1 - elementy zbioru Z 1 onajwiększej i najmniejszej wartości xmax2, xmin2 - elementy zbioru Z 2 onajwiększej i najmniejszej wartości zmienne globalne: max, min - przyjmujące wartości wskaźników elementów odpowiednio, największego i najmniejszego w całym zbiorze Omówienie schematu blokowego program główny MaxMinRe 1. Deklaracja zmiennych globalnych: max i min. 2. Odczyt z tablicy ilości elementów w zbiorze: n. 3. Wywołanie procedury MaxMinRe(1,n). 4. Odczyt z tablicy z komórki [0,max] elementu największego w zbiorze i przypisanie jego wartości zmiennej maksimum. 5. Odczyt z tablicy z komórki [0,min] elementu największego w zbiorze i przypisanie jego wartości zmiennej minimum. 6. Wyprowadzenie wartości zmiennej minimum. 7. Wyprowadzenie wartości zmiennej maksimum.

procedura MaxMinRe(i,j) 10/12 autor: Ewa Kozłowska 1. Początek procedury MaxMinRe(i,j). 2. Sprawdzanie, czy i=j, tzn., czy ciąg zawiera jeden element. Jeśli TAK, to 3. Jeśli NIE, to 5. 3. Przypisanie wartości i indeksom elementu największego i największego: max:=i, min:=i. 4. Powrót do miejsca wywołania procedury. 5. Sprawdzanie, czy i+1=j, tzn., czy ciąg zawiera dwa elementy. Jeśli TAK, to 6. Jeśli NIE, to 11. 6. Odczyt z tablicy wartości o wskaźniku [0,i] do zmiennej a. 7. Odczyt z tablicy wartości o wskaźniku [0,j] do zmiennej b. 8. Sprawdzenie, czy a>=b. Jeśli TAK, to 9. Jeśli NIE, to 10. 9. Przypisanie zmiennej max wartości zmiennej i oraz zmiennej min zmiennej wskaźnika j (max:=i, min:=j) i powrót do miejsca wywołania procedury. 10. Przypisanie zmiennej max wartości zmiennej j oraz zmiennej min zmiennej wskaźnika i (max:=j, min:=i) i powrót do miejsca wywołania procedury. 11. Przypisanie zmiennej k wartości (i+j) div 2. 12. Wywołanie procedury MaxMinRe(i,k). 13. Przypisanie zmiennym lokalnym wartości globalnych max1:=max, min1:=min. 14. Wywołanie procedury MaxMinRe(k+1,j). 15. Przypisanie zmiennym lokalnym wartości globalnych max2:=max, min2:=min. 16. Odczyt z tablicy elementu [0,max1] do zmiennej xmax1. 17. Odczyt z tablicy elementu [0,min1] do zmiennej xmin1. 18. Odczyt z tablicy elementu [0,max2] do zmiennej xmax2. 19. Odczyt z tablicy elementu [0,min2] do zmiennej xmin2. 20. Sprawdzanie, czy xmax1>=xmax2. Jeśli TAK, to 21. Jeśli NIE, to 22. 21. Przypisanie zmiennej max:=max1 i skok do 23. 22. Przypisanie zmiennej max:=max2. 23. Sprawdzanie, czy xmin1>=xmin2. Jeśli TAK, to 24.Jeśli NIE, to 25. 24. Przypisanie zmiennej max:=max1 iwyjście z procedury do miejsca wywołania. 25. Przypisanie zmiennej max:=max2 iwyjście z procedury do miejsca wywołania.

11/12 Program w języku Turbo Pascal dla algorytmu Max-MinR program MaxMin_Rekurencja; type Tablica=array[1..100] of integer; autor: Ewa Kozłowska var x:tablica; n,max,min:integer; procedure Czytaj(n:integer; var x:tablica); var i:integer; begin for i:=1 to n do begin write('podaj element tablicy nr ',i,': '); read(x[i]) end end; {Czytaj} procedure MaxMinRek(i,j:integer; var max,min:integer); {Procedura znajduje indeksy max, min; najwi kszego i najmniejszego elementu tablicy x[i..j]} var k,max1,max2,min1,min2:integer; begin if i=j then begin {Ciąg zawiera jeden element.} max:=i; min:=i end else {Krok 2} if i+1=j then {Ciąg zawiera dwa elementy.} if x[i]>=x[j] then begin max:=i; min:=j end else begin max:=j; min:=i end else begin {Ciąg ma więcej niż dwa elementy.} k:=(i+j) div 2; MaxMinRek(i,k,max1,min1); MaxMinRek(k+1,j,max2,min2); if x[max1]>=x[max2] then max:=max1 else max:=max2; if x[min1]<=x[min2] then min:=min1 else min:=min2 end {Koniec wywołań rekurencyjnych} end; {MaxMinRek} begin {Początek programu głównego} writeln('podaj z ilu elementów składa się tablica:'); readln(n); Czytaj(n,x); autor: Ewa Kozłowska MaxMinRek(1,n,max,min); write('maksimum = '); writeln(x[max]); write('minimum = '); writeln(x[min]); readln; readln end. {Koniec programu głównego} Testowanie rozwiązania Program daje poprawne wyniki dla dowolnego ciągu liczb całkowitych (n>0). Testowanie nie wykazało błędu.

12/12 LITERATURA 1. Sysło M. Maciej: ALGORYTMY, Wydawnictwa Szkolne i Pedagogiczne, Warszawa 1997 2. Suraj Zbigniew, Rumak Tadeusz: ALGORYTMICZNE ROZWIĄZYWANIE ZADAŃ I PROBLEMÓW, Wstępdoprogramowaniawjęzyku Pascal, Wydawnictwo Oświatowe FOSZE, Rzeszów 1995 3. Marciniak Andrzej: Turbo Pascal 5.5, Wyd. II popr. i uzup., Wydawnictwo NAKOM, Poznań 1991