czy wszystko mozna policzyc na komputerze


Wszechnica Popołudniowa:
Algorytmika
i programowanie
Czy wszystko można
policzyć na komputerze
Maciej M Sysło
Czy wszystko można
policzyć na komputerze
Rodzaj zajęć: Wszechnica Popołudniowa
Tytuł: Czy wszystko można policzyć na komputerze
Autor: prof. dr hab. Maciej M Sysło
Redaktor merytoryczny: prof. dr hab. Maciej M Sysło
Zeszyt dydaktyczny opracowany w ramach projektu edukacyjnego
Informatyka+  ponadregionalny program rozwijania kompetencji
uczniów szkół ponadgimnazjalnych w zakresie technologii
informacyjno-komunikacyjnych (ICT).
www.informatykaplus.edu.pl
kontakt@informatykaplus.edu.pl
Wydawca: Warszawska Wyższa Szkoła Informatyki
ul. Lewartowskiego 17, 00-169 Warszawa
www.wwsi.edu.pl
rektorat@wwsi.edu.pl
Projekt graficzny: FRYCZ I WICHA
Warszawa 2010
Copyright © Warszawska Wyższa SzkoÅ‚a Informatyki 2010
Publikacja nie jest przeznaczona do sprzedaży.
Czy wszystko można
policzyć na komputerze
Maciej M. Sysło
Uniwersytet Wrocławski, UMK w Toruniu
syslo@ii.uni.wroc.pl, syslo@mat.uni.torun.pl
< 4 > Informatyka +
Streszczenie
Przedmiotem wykładu jest łagodne wprowadzenie do złożoności problemów i algorytmów. Przewodnim pyta-
niem jest, jak dobrze sprawują się algorytmy i komputery i czy komputery już mogą wszystko obliczyć. Z jed-
nej strony, dla niektórych problemów (jak znajdowanie najmniejszego elementu) znane są algorytmy, które
nie mają konkurencji, gdyż są bezwzględnie najlepsze, a z drugiej  istnieją problemy, o których przypuszcza
się, że komputery nigdy nie będą w stanie ich rozwiązywać dostatecznie szybko. Przedstawione zostaną pro-
blemy, dla których są znane algorytmy optymalne (tj. takie, których nie można już przyspieszyć), oraz takie
problemy, których nie potrafimy rozwiązywać szybko, nawet z użyciem najszybszych komputerów. Problemy
z tej drugiej grupy znajdują zastosowanie na przykład w kryptografii. Rozważania będą ilustrowane praktycz-
nymi zastosowaniami omawianych problemów i ich metod obliczeniowych.
Rozważania są prowadzone na elementarnym poziomie i do ich wysłuchania wystarczy znajomość informa-
tyki wyniesiona z gimnazjum. Te zajęcia są adresowane do wszystkich uczniów w szkołach ponadgimnazjal-
nych, zgodnie bowiem z nową podstawą programową, kształceniem umiejętności algorytmicznego rozwiązy-
wania problemów mają być objęci wszyscy uczniowie.
Spis treści
1. Wprowadzenie ............................................................................................................................................. 5
2. Superkomputery i algorytmy ....................................................................................................................... 5
3. Przykłady trudnych problemów.................................................................................................................... 6
3.1. Najkrótsza trasa zamknięta .................................................................................................................. 6
3.2. Rozkład liczby na czynniki pierwsze ...................................................................................................... 8
3.3. Podnoszenie do potęgi .......................................................................................................................... 9
3.4. PorzÄ…dkowanie...................................................................................................................................... 9
4. Proste problemy i najlepsze algorytmy ich rozwiÄ…zywania .......................................................................... 9
4.1. Znajdowanie elementu w zbiorze  znajdowanie minimum .................................................................... 9
4.2. Kompletowanie podium zwycięzców turnieju .......................................................................................11
4.3. Jednoczesne znajdowanie najmniejszego i największego elementu .................................................... 13
4.4. Poszukiwanie elementów w zbiorze .................................................................................................... 13
4.4.1. Poszukiwanie elementu w zbiorze nieuporzÄ…dkowanym ........................................................... 14
4.4.2. Poszukiwanie elementu w zbiorze uporzÄ…dkowanym ................................................................ 14
4.5. Algorytmy porzÄ…dkowania .................................................................................................................. 16
4.5.1. Porządkowanie przez wybór....................................................................................................... 17
4.5.2. PorzÄ…dkowanie przez scalanie ................................................................................................... 18
4.6. Obliczanie wartości wielomianu  schemat Hornera ........................................................................... 19
5. Dwa trudne problemy, ponownie ................................................................................................................ 19
5.1. Badanie złożoności liczb ..................................................................................................................... 20
5.2. Szybkie podnoszenie do potęgi ........................................................................................................... 20
Literatura ............................................................................................................................................... 21
> Czy wszystko można policzyć na komputerze < 5 >
1 WPROWADZENIE
Można odnieść wrażenie, że komputery są obecnie w stanie wykonać wszelkie obliczenia i dostarczyć ocze-
kiwany wynik w krótkim czasie. Budowane są jednak coraz szybsze komputery, co może świadczyć o tym, że
moc istniejących komputerów nie jest jednak wystarczająca do wykonania wszystkich obliczeń, jakie nas in-
teresują, potrzebne są więc jeszcze szybsze maszyny.
Zgodnie z nieformalnym prawem Moore a, szybkość działania procesorów stale rośnie i podwaja się co
24 miesiące. Jednak istnieje wiele trudno rozwiązywalnych problemów, których obecnie nie jesteśmy w stanie
rozwiązać za pomocą żadnego komputera i zwiększanie szybkości komputerów niewiele zmienia tę sytuację.
Kluczowe staje się więc opracowywanie coraz szybszych algorytmów. Jak to ujął Ralf Gomory, szef ośrodka
badawczego IBM:
Najlepszym sposobem przyspieszania komputerów
jest obarczanie ich mniejszą liczbą działań.
To  obarczanie komputerów coraz mniejszą liczbą działań należy odczytać, jako stosowanie w obliczeniach
komputerowych coraz szybszych algorytmów.
2 SUPERKOMPUTERY I ALGORYTMY
Superkomputery
Zamieścimy tutaj podstawowe informacje dotyczące najszybszych komputerów. Komputery, które w danej
chwili lub w jakimś okresie mają największą moc obliczeniową przyjęło się nazywać superkomputerami. Pro-
wadzony jest ranking najszybszych komputerów świata (patrz strona http://www.top500.org/), a faktycznie
odbywa się wyścig wśród producentów superkomputerów i dwa razy w roku są publikowane listy rankingowe.
Szybkość działania komputerów jest oceniana na specjalnych zestawach problemów, pochodzących z alge-
bry liniowej  są to na ogół układy równań liniowych, złożone z setek tysięcy a nawet milionów równań i nie-
wiadomych. Szybkość komputerów podaje się w jednostkach zwanych FLOPS (lub flops lub flop/s)  jest to
akronim od FLoating point Operations Per Second, czyli zmiennopozycyjnych operacji na sekundÄ™. Dla uprosz-
czenia można przyjąć, że FLOPS to są działania arytmetyczne (dodawanie, odejmowanie, mnożenie i dziele-
nie) wykonywane na liczbach dziesiętnych z kropką. W użyciu są jednostki: YFlops (yotta flops)  1024 opera-
cji na sekundeÄ™, ZFlops (zetta flops)  1021, EFlops (exa flops)  1018, PFlops (peta flops)  1015, TFlops (tera
flops)  1012, GFlops (giga flops)  109, MFlops (mega flops)  106, KFlops (kilo flops)  103.
W rankingu z listopada 2009 roku, najszybszym komputerem świata był Cray XT Jaguar firmy Cray, któ-
rego moc jest 1.75 PFlops, czyli wykonuje on ponad 1015 operacji na sekundÄ™. Komputer ten pracuje w Depart-
ment of Energy s Oak Ridge National Laboratory w Stanach Zjednoczonych. Komputer Jaguar jest zbudowa-
ny z 224162 procesorów Opteron firmy AMD. Drugie miejsce zajmuje komputer Roadrunner firmy IBM o mocy
1.04 PFlops. Dwa dalsze miejsca zajmują również komputery Cray i IBM a w pierwszej dziesiątce są jeszcze
dwa inne komputery IBM.
Na początku 2010 roku najszybszym procesorem PC był Intel Core i7 980 XE o mocy 107.6 GFlops.
Większą moc mają procesory graficzne, np. Tesla C1060 GPU (nVidia) ma moc 933 GFlops (w pojedynczej do-
kładności), a HemlockXT 5970 (AMD) osiąga moc 4640 GFlops (w podwójnej dokładności).
Bardzo dużą moc osiągają obliczenia wykonywane na rozproszonych komputerach osobistych połą-
czonych ze sobą za pomocą Internetu. Na przykład, ma początku 2010 roku, Folding@Home osiągnął moc 3.8
PFlops, a komputery osobiste pracujące w projekcie sieciowym GIMPS nad znalezieniem coraz większej licz-
by pierwszej osiągnęły moc 44 TFlops.
Przy obecnym tempie wzrostu możliwości superkomputerów przewiduje się, że moc 1 EFlops (1018 ope-
racji na sekundę) zostanie osiągnięta w 2019 roku, natomiast firma Cray ogłosiła, że będzie w stanie zbudo-
wać komputer o tej mocy w 2010 roku. Naukowcy oceniają, że dla pełnego modelowania zmian pogody na Zie-
mi w ciągu dwóch tygodni jest potrzebny komputer o mocy 1 ZFlops (1021 operacji na sekundę). Przewiduje
się, że taki komputer powstanie przed 2030 rokiem.
W dalszych rozważaniach będziemy przyjmować, że dysponujemy najszybszym komputerem, który ma
moc 1 PFlops, czyli wykonuje 1015 = 1 000 000 000 000 000 operacji na sekundÄ™.
< 6 > Informatyka +
Superkomputery a algorytmy
Ciekawi nas teraz, jak duże problemy możemy rozwiązywać za pomocą komputera o mocy 1 PFlops. W tabe-
li 1 zamieściliśmy czasy obliczeń wykonanych na tym superkomputerze posługując się algorytmami o różnej
złożoności obliczeniowej (pracochłonności) i chcąc rozwiązywać problemy o różnych rozmiarach.
Tabela 1.
Czasy obliczeń za pomocą algorytmów o podanej złożoności, wykonywanych na superkomputerze o mocy
1 PFlps, czyli wykonującym 1015 operacji na sekundę (<< 1 sek. oznacza w tabeli, że czas obliczeń stanowił nie-
wielki ułamek sekundy); parametr n określa rozmiar danych
Złożoność algorytmu n = 100 n = 500 n = 1000 n = 10000
log n << 1 sek. << 1 sek. << 1 sek. << 1 sek.
n << 1 sek. << 1 sek. << 1 sek. << 1 sek.
n log n << 1 sek. << 1 sek. << 1 sek. << 1 sek.
n2 << 1 sek. << 1 sek. 0,000000001 sek. 0,0000001 sek.
n5 0,00001 sek. 0,03125 sek. 1 sek. 1,15 dni
2n 4*107 lat 1,038*10128 lat 3,3977*10278 lat
n! 2,959*10135 lat
Wyraznie widać, że dwa ostatnie w tabeli 1 algorytmy są całkowicie niepraktyczne nawet dla niewielkiej licz-
by danych (n = 100). Istnieją jednak problemy, dla których wszystkich możliwych rozwiązań może być 2n lub
n!, zatem nawet superkomputery nie są w stanie przejrzeć wszystkich możliwych rozwiązań w poszukiwaniu
najlepszego, a zdecydowanie szybszymi metodami dla tych problemów nie dysponujemy.
Można łatwo przeliczyć, że gdyby nasz superkomputer był szybszy, na przykład miał moc 1 ZFlops
(1021 operacji na sekundę), co ma nastąpić dopiero ok. roku 2030, to dwa ostatnie wiersze w tabeli 1 uległy-
by tylko niewielkim zmianom, nie na tyle jednak, by móc stosować dwa ostatnie algorytmy w celach prak-
tycznych.
W następnym rozdziale przedstawimy kilka przykładowych problemów, dla których moc obliczeniowa
superkomputerów może nie być wystarczająca, by rozwiązywać je dla praktycznych rozmiarów danych. Ma to
złe i dobre strony. Złe  bo nie jesteśmy w stanie rozwiązywać wielu ważnych i istotnych dla człowieka pro-
blemów, takich np. jak prognozowanie pogody, przewidywanie trzęsień Ziemi i wybuchów wulkanów, czy też
planowanie optymalnych podróży lub komunikacji. Dobre zaś  bo możemy wykorzystywać trudne oblicze-
niowo problemy w metodach szyfrowania, dzięki czemu nasz przeciwnik nie jest w stanie, nawet posługując
się najszybszymi komputerami, deszyfrować naszych wiadomości, chociaż my jesteśmy w stanie szybko je
kodować i wysyłać.
3 PRZYKAADY TRUDNYCH PROBLEMÓW
Podamy tutaj kilka dość prostych problemów, których rozwiązywanie może nastręczać pewne trudności na-
wet z użyciem najszybszych komputerów.
W tym rozdziale, jak i w dalszych, problemy definiujemy w postaci specyfikacji, która zawiera ścisły opis
Danych i oczekiwanych Wyników. W specyfikacji są też zawarte zależności między danymi i wynikami. Spe-
cyfikacja problemu jest również specyfikacją algorytmu, który ten problem rozwiązuje, co ma na celu do-
kładne określenie przeznaczenia algorytmu, stanowi zatem powiązanie algorytmu z rozwiązywanym pro-
blemem.
3.1 NAJKRÓTSZA TRASA ZAMKNITA
Jednym z najbardziej znanych problemów dotyczących wyznaczania tras przejazdu, jest problem komiwoja-
żera, oznaczany zwykle jako TSP, od oryginalnej nazwy Travelling Salesman Problem. W tym problemie mamy
dany zbiór miejscowości oraz odległości między nimi. Należy znalezć drogę zamkniętą, przechodzącą przez
każdą miejscowość dokładnie jeden raz, która ma najkrótszą długość.
> Czy wszystko można policzyć na komputerze < 7 >
Przykładem zastosowania problemu TSP może być zadanie wyznaczenia najkrótszej trasy objazdu pre-
zydenta kraju po wszystkich stolicach województw (stanów  w Stanach zjednoczonych, landów  w Niem-
czech itp.). Na tej trasie, prezydent wyjeżdża ze stolicy kraju, ma odwiedzić stolicę każdego województwa do-
kładnie jeden raz i wrócić do stolicy kraju. Zapiszmy specyfikację tego problemu.
Problem komiwojażera (TSP)
Dane: n miast (punktów) i odległości między każdą parą miast.
Wyniki: Trasa zamknięta, przechodząca przez każde miasto dokładnie jeden raz, której długość jest możli-
wie najmniejsza.
Rysunek 1.
Przykładowa trasa przejazdu prezydenta po stolicach województw
Na rysunku 1 przedstawiliśmy jedną z możliwych tras, ale nie jesteśmy pewni, czy jest ona najkrótsza. Ob-
sługa biura prezydenta może jednak chcieć znalezć najkrótszą trasę. W tym celu postanowiono generować
wszystkie możliwe trasy  zastanówmy się, ile ich jest. To łatwo policzyć. Z Warszawy można się udać do jed-
nego z 15 miast wojewódzkich. Będąc w pierwszym wybranym mieście, do wyboru mamy jedno z 14 miast.
Po wybraniu drugiego miasta na trasie, kolejne miasto można wybrać spośród 13 miast i tak dalej. Gdy osią-
gamy ostatnie miast, to czeka nas tylko powrót do Warszawy. A zatem wszystkich możliwych wyborów jest:
15*14*13*& *2*1. Oznaczmy tę liczbę następująco:
15! = 15*14*13*& *2*1
a ogólnie n! = n*(n  1)*(n  2)*& *2*1
Oznaczenie n! czytamy  n silnia , a zatem n! jest iloczynem kolejnych liczb całkowitych, od jeden do n. War-
tości tej funkcji dla kolejnych n rosną bardzo szybko, patrz tabela 2.
< 8 > Informatyka +
Tabela 2.
Wartości funkcji n!
nn!
10 3628800
15 1.30767*1012
20 2.4329*1018
25 1.55112*1025
30 2.65253*1032
40 8.15915*1047
48 1.24139*1061
100 9.3326*10157
Z wartości umieszczonych w tabeli 2 wynika, że posługując się superkomputerem w realizacji naszki-
cowanej metody, służącej do znalezienia najkrótszej trasy dla prezydenta Polski, otrzymanie takiej tra-
sy zabrałoby mniej niż sekundę. Jednak w olbrzymim kłopocie znajdzie się prezydent Stanów Zjedno-
czonych chcąc taką samą metodą znalezć najkrótszą trasę objazdu po stolicach wszystkich kontynen-
talnych stanów (jest ich 49, z wyjątkiem Hawajów). Niewiele zmieni jego sytuację przyspieszenie super-
komputerów.
Znane są metody rozwiązywania problemu komiwojażera szybsze niż naszkicowana powyżej, jednak
problem TSP pozostaje bardzo trudny. W takich przypadkach często są stosowane metody, które służą do
szybkiego znajdowania rozwiązań przybliżonych, nie koniecznie najkrótszych. Jedna z takich metod, zwana
metodą najbliższego sąsiada, polega na przykład na przejeżdżaniu w każdym kroku do miasta, które znajdu-
je się najbliżej miasta, w którym się znajdujemy. W rozwiązaniu naszego problemu tą metodą, pierwszym od-
wiedzonym miastem powinna być Aódz, pózniej Kielce, Lublin, Rzeszów, .., a nie jak na rys. 1 mamy Lubli, Rze-
szów, Kraków & , a Aódz gdzieś w trakcie podróży. Trasa otrzymana metodą najbliższego sąsiada jest krótsza
niż trasa naszkicowana na rys. 1. W ogólnym przypadku ta metoda nie gwarantuje, że zawsze znajduje naj-
krótszą trasę.
3.2 ROZKAAD LICZBY NA CZYNNIKI PIERWSZE
Liczby pierwsze stanowią w pewnym sensie  pierwiastki wszystkich liczb, każdą bowiem liczbę całkowi-
tą można jednoznacznie przedstawić, z dokładnością do kolejności, w postaci iloczynu liczb pierwszych.
Na przykład, 4 = 2*2; 10 = 2*5; 20 = 2*2*5; 23 = 23; dla liczb pierwszych te iloczyny składają się z jednej
liczby.
Matematycy interesowali się liczbami pierwszymi od dawna. Pierwsze spisane rozważania i twier-
dzenia dotyczące tych liczb znajdujemy w działach Euklidesa. Obecnie liczby pierwsze znajdują waż-
ne zastosowania w kryptografii, m.in. w algorytmach szyfrujących. Do najważniejszych pytań, proble-
mów i wyzwań, związanych z liczbami pierwszymi, należą następujące zagadnienia, które krótko ko-
mentujemy:
1. Dana jest dodatnia liczba całkowita n  czy n jest liczbą pierwszą (złożoną)?
Ten problem ma bardzo duże znaczenie zarówno praktyczne (w kryptografii), jak i teoretyczne. Dopiero
w 2002 roku został podany algorytm, który jednak jest interesujący głównie z teoretycznego punktu widze-
nia. Jego złożoność, czyli liczba wykonywanych operacji, zależy wielomianowo od rozmiaru liczby n, czyli od
liczby bitów potrzebnych do zapisania liczby n w komputerze (ta liczba jest równa logarytmowi przy podsta-
wie 2 z n).  Słabą stroną większości metod, które udzielają odpowiedzi na pytanie:  czy n jest liczba pierw-
szą czy złożoną jest udzielanie jedynie odpowiedzi  Tak lub  Nie . Na ogół najszybsze metody dające od-
powiedz na pytanie, czy n jest liczbą złożoną, w przypadku odpowiedzi  Tak nie podają dzielników liczby
n  dzielniki jest znacznie trudniej znalezć niż przekonać się, że liczba jest złożona.
2. Dana jest dodatnia liczba całkowita n  rozłóż n na czynniki pierwsze.
Ten problem ma olbrzymie znaczenie w kryptografii. Odpowiedz  Nie udzielona na pytanie nr 1 nie pomaga
w rozwiązaniu tego problemu. Z drugiej strony, możemy próbować znalezć dzielniki liczby n dzieląc ją przez
kolejne liczby, ale ta metoda jest mało praktyczna, gdyż w kryptografii występują liczby n, które mają kilkaset
cyfr. Piszemy o tym dokładniej w punkcie 5.1.
3. Dana jest dodatnia liczba całkowita m  znajdz wszystkie liczby pierwsze mniejsze lub równe m.
> Czy wszystko można policzyć na komputerze < 9 >
To zadanie zyskało swoją popularność dzięki algorytmowi pochodzącemu ze Starożytności, który jest znany
jako sito Eratosthenesa. Generowanie kolejnych liczb pierwszych tÄ… metodÄ… ma jednak niewielkie znaczenie
praktyczne i jest uznawane raczej za ciekawostkÄ™.
4. Znajdz największą liczbę pierwszą, a faktycznie, znajdz liczbę pierwszą większą od największej znanej licz-
by pierwszej. (Zgodnie z twierdzeniem Euklidesa, liczb pierwszych jest nieskończenie wiele, a zatem nie ist-
nieje największa liczba pierwsza.)
To wyzwanie cieszy się olbrzymią popularnością. Uruchomiony jest specjalny serwis internetowy
pod adresem http://www.mersenne.org/, który jest wspólnym przedsięwzięciem sieciowym wielu po-
szukiwaczy. Obecnie największą liczbą pierwszą jest liczba 243112609  1, będąca liczbą Mersennea. Licz-
ba ta ma 12 978 189 cyfr. Zapisanie jej w edytorze teksu (75 cyfr w wierszu, 50 wierszy na stronie) zajÄ™-
Å‚oby 3461 stron.
W punkcie 5.1 wracamy do problemów nr 1 oraz 2 i przytaczamy znany algorytm badania, czy n jest
liczbą pierwszą. Jeśli n jest liczbą złożoną, to możliwe jest w tym algorytmie generowanie kolejnych dzielni-
ków liczby n.
3.3 PODNOSZENIE DO POTGI
Podnoszenie do potęgi jest bardzo prostym, szkolnym zadaniem. Na przykład, aby obliczyć 34, wykonujemy
trzy mnożenia 4*4*4*4. A zatem w ogólności, aby obliczyć szkolną metodą wartość xn, należy wykonać n  1
mnożeń, o jedno mniej niż wynosi wykładnik potęgi. Czy ten algorytm jest na tyle szybki, by obliczyć na przy-
kład wartość:
x12345678912345678912345678912345
która może pojawić przy szyfrowaniu informacji przesyłanych w Internecie? Odpowiemy na to pytanie w punk-
cie 5.2.
3.4 PORZDKOWANIE
Problem porządkowania, często nazywany sortowaniem, jest jednym z najważniejszych problemów w infor-
matyce i w wielu innych dziedzinach. Jego znaczenie jest ściśle związane z zarządzaniem danymi (informacja-
mi), w szczególności z wykonywaniem takich operacji na danych, jak wyszukiwanie konkretnych danych lub
umieszczanie danych w zbiorze.
Zauważmy, że mając n elementów, które chcemy uporządkować, istnieje n! możliwych uporządko-
wań, wśród których chcemy znalezć właściwe uporządkowanie. A zatem, przestrzeń możliwych rozwiązań
w problemie porządkowania n liczb ma moc n!, czyli jest taka sama jak w przypadku problemu komiwojaże-
ra. Jednak dzięki odpowiednim algorytmom, n elementów można uporządkować w czasie proporcjonalnym
do n log n lub n2. Więcej na temat porządkowania piszemy w punkcie 4.5.
DysponujÄ…c uporzÄ…dkowanym zbiorem danych, znalezienie w nim elementu lub umieszczenie nowego
z zachowaniem porządku jest znacznie łatwiejsze i szybsze, niż gdyby zbiór nie był uporządkowany  pisze-
my o tym w punkcie 4.4.2.
4 PROSTE PROBLEMY I NAJLEPSZE ALGORYTMY ICH ROZWIZYWANIA
W tym rozdziale przedstawiamy kilka klasycznych problemów algorytmicznych wraz z możliwie najlepszymi
algorytmami ich rozwiązywania. Problemy są rzeczywiście bardzo proste, ale mają bardzo ważne znaczenie
w informatyce. Po pierwsze, są rozwiązywane bardzo często w wielu bardziej złożonych sytuacjach problemo-
wych, zarówno z użyciem komputera jak i bez jego pomocy. Po drugie, te problemy stanowią elementy skła-
dowe wielu innych metod obliczeniowych i są wywoływane wielokrotnie, dlatego im szybciej potrafimy je roz-
wiązywać, tym szybciej działają metody rozwiązywania wielu innych problemów.
4.1 ZNAJDOWANIE ELEMENTU W ZBIORZE  ZNAJDOWANIE MINIMUM
Zajmiemy się bardzo prostym problemem, który każdy z Was rozwiązuje wielokrotnie w ciągu dnia. Chodzi
o znajdowanie w zbiorze elementu, który ma określoną własność. Oto przykładowe sytuacje problemowe:
% znajdz najwyższego ucznia w swojej klasie; a jak zmieni się Twój algorytm, jeśli chciałbyś znalezć w klasie
najniższego ucznia?
< 10 > Informatyka +
% znajdz w swojej klasie ucznia, któremu droga do szkoły zabiera najwięcej czasu;
% znajdz najstarszego ucznia w swojej szkole;
% znajdz największą kartę w potasowanej talii kart;
% wyłonić najlepszego tenisistę w swojej klasie.
Postawiony problem może wydać się zbyt prosty, by zajmować się nim na informatyce  każdy uczeń zapew-
ne potrafi wskazać metodę rozwiązywania, polegającą na systematycznym przeszukaniu całego zbioru da-
nych. Tak pojawia się metoda przeszukiwania ciągu, którą można nazwać przeszukiwaniem liniowym. Przy
tej okazji w dyskusji pojawi się zapewne również metoda pucharowa, która jest często stosowana w rozgryw-
kach turniejowych.
Poczyńmy pewne założenia, które wynikają zarówno z praktycznych sytuacji, jak i odpowiadają sto-
sowanym metodom rozwiązywania. Po pierwsze zakładamy, że przeszukiwane zbiory elementów nie są
uporządkowane, np. klasa  od najwyższego do najniższego ucznia lub odwrotnie, gdyż, gdyby tak było, to
rozwiązywanie wymienionych wyżej problemów i im podobnych byłoby dziecinnie łatwe  wystarczyłoby
wziąć element z początku albo z końca takiego uporządkowania. Po drugie  przyjmujemy także, że nie in-
teresują nas algorytmy rozwiązywania przedstawionych sytuacji problemowych, które w pierwszym kroku
porządkują zbiór przeszukiwany, a następnie już prosto znajdują poszukiwane elementy  to założenie wy-
nika z faktu, że sortowanie ciągu jest znacznie bardziej pracochłonne niż znajdowanie wyróżnionych ele-
mentów w ciągu.
Z powyższych założeń wynika dość naturalny wniosek, że aby znalezć w zbiorze poszukiwany element
musimy przejrzeć wszystkie elementy zbioru, gdyż jakikolwiek pominięty element mógłby okazać się tym
szukanym elementem.
Przy projektowaniu algorytmów istotne jest również określenie, jakie działania (operacje) mogą być wykony-
wane w algorytmie. W przypadku problemu poszukiwania szczególnego elementu w zbiorze wystarczy, je-
śli będziemy umieli porównać elementy między sobą. Przy porównywaniu kart należy uwzględnić ich kolory
i wartości, natomiast przy wyłanianiu najlepszego gracza w tenisa, porównania między graczami dokonuje się
na podstawie wyniku meczu między nimi.
Specyfikacja problemu, specyfikacja i opis i algorytm
Dla uproszczenia rozważań zakładamy, że danych jest n liczb w postaci ciąg: x1, x2, ..., x . Oto specyfikacja roz-
n
ważanego problemu:
Problem Min  Znajdowanie najmniejszego elementu w zbiorze
Dane: Liczba naturalna n i zbiór n liczb, dany w postaci ciągu x1, x2, ..., x .
n
Wynik: Najmniejsza spośród liczb x1, x2, ..., x  oznaczmy jej wartość przez min.
n
Algorytm Min
Naszkicowany wyżej algorytm, polegający na przejrzeniu ciągu danych od początku do końca, można zapisać
w następujący sposób w postać listy kroków:
Algorytm Min  znajdowanie najmniejszego elementu w zbiorze
Krok 1. Przyjmij za min pierwszy element w ciÄ…gu, czyli przypisz min := x1.
Krok 2. Dla kolejnych elementów xi, gdzie i = 2, 3, ..., n, jeśli min jest większe niż xi, to za min przyjmij xi,
czyli, jeśli min > xi, to przypisz min := xi.
Metoda zastosowana w algorytmie Min, polegająca na badaniu elementów ciągu danych w kolejności, w ja-
kiej sÄ… ustawione, nazywa siÄ™ przeszukiwaniem liniowym.
Algorytm Min może być łatwo zmodyfikowany tak, aby otrzymać algorytm Max, służący do znajdowania naj-
większego elementu w ciągu  wystarczy w tym celu zmienić tylko zwrot nierówności w kroku 2.
Często, poza znalezieniem elementu najmniejszego (lub największego) chcielibyśmy znać jego położ-
nie, czyli miejsce (numer) w ciągu danych. W tym celu wystarczy wprowadz nową zmienną, np. imin, w której
będzie przechowywany numer aktualnie najmniejszego elementu.
> Czy wszystko można policzyć na komputerze < 11 >
W tych materiałach poprzestajemy na opisach algorytmów w postaci listy kroków. Inną reprezentacją algorytmu
jest schemat blokowy. Najbardziej precyzyjną postać ma implementacja algorytmu w postaci programu w języ-
ku programowania. Działanie algorytmu można również zademonstrować posługując się programem edukacyj-
nym. W materiałach do tego wykładu są udostępnione programy Maszyna sortująca i Sortowanie, które mogą
być wykorzystane do eksperymentów z algorytmem Min i z algorytmami sortowania (patrz punkt 4.5).
Pracochłonność (złożoność) algorytmu Min
W algorytmie Min podstawową operacją jest porównanie dwóch elementów ze zbioru danych  policzmy
więc, ile porównań jest wykonywanych w tym algorytmie. W każdej iteracji algorytmu jest wykonywane jed-
no porównanie min > xi, a zatem w całym algorytmie jest wykonywanych n  1 porównań. Pozostałe opera-
cje służą głównie do organizacji obliczeń i ich liczba jest związana z liczbą porównań. Na przykład, operacja
przypisania min := xi może być wykonana tylko o jeden raz więcej  w kroku 1 i n  1 razy w kroku 2. Możemy
więc podsumować nasze rozumowanie bardzo ważnym stwierdzeniem
najmniejszy (lub największy) element w niepustym zbiorze danych można znalezć wyko-
nując o jedno porównanie mniej niż wynosi liczba wszystkich elementów w tym zbiorze.
Zastanówmy się teraz, czy w zbiorze złożonym z n liczb, można znalezć najmniejszy element wykonując mniej
niż n  1 porównań elementów tego zbioru? Udzielimy negatywnej odpowiedzi na to pytanie1, posługując
się interpretacją wziętą z klasowego turnieju tenisa. Ile należy rozegrać meczów (to są właśnie porównania
w przypadku tego problemu), aby wyłonić najlepszego tenisistę w klasie? Lub inaczej  kiedy możemy powie-
dzieć, że Janek jest w naszej klasie najlepszym tenisistą? Musimy mieć pewność, że wszyscy pozostali ucznio-
wie są od niego gorsi, czyli przegrali z nim, bezpośrednio lub pośrednio. A zatem każdy inny uczeń przegrał
przynajmniej jeden mecz, czyli rozegranych zostało przynajmniej tyle meczów, ilu jest uczniów w klasie mniej
jeden. I to kończy nasze uzasadnienie.
Z dotychczasowych rozważań wynika, że algorytm Min jest najlepszym algorytmem służącym do znaj-
dowania najmniejszego elementu, gdyż wykonywanych jest w nim tyle porównań, ile musi wykonać jakikol-
wiek algorytm rozwiązywania tego problemu. O takim algorytmie mówimy, że jest algorytmem optymalnym
pod względem złożoności obliczeniowej.
4.2 KOMPLETOWANIE PODIUM ZWYCIZCÓW TURNIEJU
Przedstawiony w poprzednim punkcie algorytm nie jest jedyną metodą służącą do znajdowania najlepsze-
go elementu w zbiorze. Inną metodą jest tzw. system pucharowy, stosowany często przy wyłanianiu najlep-
szego zawodnika bądz drużyny w turnieju. W metodzie tej  porównanie dwóch zawodników (lub drużyn), by
stwierdzić, który jest lepszy ( większy ), polega na rozegraniu meczu, który kończy się zwycięstwem jedne-
go z zawodników.
Wyłanianie zwycięzcy w turnieju
Nurtować może pytanie, czy znajdowanie najlepszego zawodnika systemem pucharowym nie jest czasem
metodą bardziej efektywną pod względem liczby wykonywanych porównań (czyli rozegranych meczy), niż
przeszukiwanie liniowe, opisane w poprzednim rozdziale. Na rysumku 2(a) jest przedstawiony fragment tur-
nieju, rozegranego między ośmioma zawodnikami. Zwycięzcą okazał się Janek po rozegraniu w całym turnie-
ju siedmiu meczów. A zatem podobnie jak w przypadku metody liniowej, aby wyłonić zwycięzcę, czyli najlep-
szego zawodnika (elementu) wśród ośmiu zawodników, należało rozegrać o jeden mecz mnie niż wystąpiło
w turnieju zawodników. Nie jest to przypadek.
Powyższa prawidłowość wynika z następującego faktu: schemat turnieju jest drzewem binarnym,
a w takim drzewie liczba wierzchołków pośrednich jest o jeden mniejsza od liczby wierzchołków końcowych.
Wierzchołki końcowe to zawodnicy przystępujący do turnieju, a wierzchołki pośrednie odpowiadają rozegra-
nym meczom.
1
Posługujemy się tutaj argumentacją zaczerpniętą z książki Hugona Steinhausa, Kalejdoskop matematyczny (WSiP, War-
szawa 1989, rozdz. III), [5].
< 12 > Informatyka +
a)
Janek
Janek Edek
Kuba Janek Bartek Edek
Kuba Kazik Jurek Janek Bartek Wojtek Edek Bolek
Edek
b)
Kuba Bartek Edek
Kuba Kazik Jurek X Bartek Wojtek Edek Bolek
Rysunek 2.
Drzewo przykładowych rozgrywek w turnieju tenisowym (a) oraz drzewo znajdowania drugiego najlepszego
zawodnika turnieju (b)
Wyłanianie drugiego najlepszego zawodnika turnieju
Bardzo ciekawy problem postawił około 1930 roku Hugo Steinhaus: jaka jest najmniejsza liczba meczów teniso-
wych potrzebnych do wyłonienia najlepszego i drugiego najlepszego zawodnika turnieju. W turniejach drugą na-
grodę otrzymuje zwykle zawodnik pokonany w finale. I tutaj Steinhaus miał słuszne wątpliwości, czy jest to wła-
ściwa decyzja, tzn., czy pokonany w finale jest drugim najlepszym zawodnikiem turnieju, czyli czy jest lepszy od
wszystkich pozostałych zawodników z wyjątkiem zwycięzcy turnieju. Wątpliwości H. Steinhausa były uzasadnio-
ne  spójrzmy na drzewo turnieju przedstawione na rysunek 2(a). Zwycięzcą w tym turnieju jest Janek, który w fina-
le pokonał Edka. Edkowi przyznano więc drugą nagrodę, chociaż wykazał, że jest lepszy jedynie od Bolka, Bartka
i Wojtka (gdyż przegrał z Bartkiem). Nic nie wiemy, jakby Edek grał przeciwko zawodnikom z poddrzewa, z którego
jako zwycięzca został wyłoniony Janek. Jak można naprawić ten błąd organizatorów rozgrywek tenisowych? Istnie-
je prosty sposób znalezienia drugiego najlepszego zawodnika turnieju  rozegrać jeszcze jedną pełną rundę z po-
minięciem zwycięzcy turnieju głównego. Wówczas, najlepszy i drugi najlepszy zawodnik zawodów zostaliby wyło-
nieni w 2n 3 meczach. Steinhaus oczywiście znał to rozwiązanie, ale pytał o najmniejszą potrzebną liczbę meczów.
Jeśli chcemy, aby drugi najlepszy zawodnik nie musiał być wyłaniany w nowym pełnym turnieju, to mu-
simy umieć skorzystać ze wszystkich wyników głównego turnieju. Posłużymy się drzewem turnieju z rysun-
ku 2(a). Zauważmy, że Edek jest oczywiście najlepszy wśród zawodników, którzy w drzewie rozgrywek znaj-
dują się w wierzchołkach leżących poniżej najwyższego wierzchołka, który on zajmuje. Musimy więc jedynie
porównać go z zawodnikami drugiego poddrzewa. Aby i w tym poddrzewie wykorzystać wyniki dotychczaso-
wych meczów, eliminujemy z niego Janka  zwycięzcę turnieju i wstawiamy Edka na jego początkowe miejsce
X. Spowoduje to, że Edek zostanie porównany z najlepszymi zawodnikami w drugim poddrzewie. Na rysun-
ku 2(b) oznaczyliśmy przerywana linią mecze, które zostaną rozegrane w tej części turnieju  Jurek z Edkiem
i zwycięzca tego meczu z Kubą, a więc dwa dodatkowe mecze.
Algorytm ten można, po zmianie słownictwa, zastosować do znajdowania największej i drugiej naj-
większej liczby w zbiorze danych.
Złożoność wyłaniania zwycięzcy i drugiego najlepszego zawodnika turnieju
Ile porównań jest wykonywanych w opisanym algorytmie znajdowania najlepszego i drugiego najlepszego za-
wodnika w turnieju? Najlepszy zawodnik jest wyłaniany w n  1 meczach, gdzie n jest liczbą wszystkich za-
wodników. Z kolei, aby wyłonić drugiego najlepszego zawodnika, trzeba rozegrać tyle meczów, ile jest pozio-
mów w drzewie turnieju głównego (z wyjątkiem pierwszego poziomu). Dla uproszczenia przyjmijmy, że drze-
wo jest pełne, tzn. każdy zawodnik ma parę, czyli w każdej rundzie turnieju gra parzysta liczba zawodników.
Stąd wynika, że na najwyższym poziomie jest jeden zawodnik, na poziomie niższym  dwóch, na kolejnym
 czterech itd. Czyli, liczba zawodników rozpoczynających turniej jest potęgą liczby 2, zatem n = 2k, gdzie k
jest liczbą poziomów drzewa  oznaczmy ją przez log2n. Algorytm wykonuje więc (n  1) + (log2n  1) = n +
log2n  2 porównań. Jeśli n nie jest potęgą liczby 2, to na ogół w turnieju niektórzy zawodnicy otrzymują wol-
ną kartę, a podana liczba jest oszacowaniem z góry liczby rozegranych meczów.
> Czy wszystko można policzyć na komputerze < 13 >
Przedstawiony powyżej algorytm znajdowania najlepszego i drugiego najlepszego zawodnika turnieju
jest również optymalny, tzn. jest najszybszy w sensie liczby rozegranych meczów (porównań).
4.3 JEDNOCZESNE ZNAJDOWANIE NAJMNIEJSZEGO I NAJWIKSZEGO ELEMENTU
Jedną z miar, określającą, jak bardzo są porozrzucane wartości obserwowanej w doświadczeniu wielkości,
jest rozpiętość zbioru, czyli różnica między największą (w skrócie, maksimum) a najmniejszą wartością ele-
mentu (w skrócie, minimum) w zbiorze. Interesujące jest więc jednoczesne znalezienie najmniejszej i najwięk-
szej wartości w zbiorze liczb. Na podstawie dotychczasowych rozważań, dotyczących wyznaczania najmniej-
szej i największej wartości w zbiorze liczb, łatwo można podać algorytm znajdowania jednocześnie obu tych
elementów w zbiorze. W tym celu stosujemy najpierw algorytm Min do całego zbioru, a pózniej algorytm Max
do zbioru z usuniętym minimum. W takim algorytmie  jednoczesnego wyznaczania minimum i maksimum
w ciągu złożonym z n liczb jest wykonywanych (n  1) + (n  2) = 2n  3 porównań. Ale czy rzeczywiście te dwie
wielkości są wyznaczane jednocześnie?
Postaramy się znacznie przyspieszyć to postępowanie, a będzie to polegało na rzeczywiście jedno-
czesnym szukaniu najmniejszego i największego elementu w całym zbiorze. W tym celu zauważmy, że je-
śli dwie liczby x i y spełniają nierówność x d" y, to x jest kandydatem na najmniejszą liczbę w zbiorze, a y jest
kandydatem na największą liczbę w zbiorze. (Jeśli prawdziwa jest nierówność przeciwna, to wnioskujemy
odwrotnie.) A zatem, porównując elementy parami, można podzielić dany zbiór elementów na dwa pod-
zbiory, kandydatów na minimum i kandydatów na maksimum, i w tych zbiorach  które są niemal o poło-
wę mniejsze niż oryginalny zbiór!  szukać odpowiednio minimum i maksimum. Gdy zbiór ma nieparzystą
liczbę elementów, to ostatni element ciągu dodajemy do jednego i do drugiego podzbioru kandydatów. Po-
stępowanie to jest zilustrowane przykładem na rys. 3, a opis algorytmu pozostawiamy do samodzielnego
wykonania.
Kandydaci na maksimum 3 2 5 8 5 6 max = 8
Podział zbioru 3 d" 1 2 d" 2 5 d" 3 4 d" 8 2 d" 5 6
Kandydaci na minimum 1 2 3 4 2 6 min = 1
Rysunek 3.
Przykład postępowania podczas jednoczesnego znajdowania minimum i maksimum w ciągu liczb
Naszkicowany algorytm jest przykładem metody, leżącej u podstaw bardzo wielu efektywnych algorytmów.
Można w nim wyróżnić dwa etapy:
% podziału danych na dwa podzbiory (kandydatów na minimum i kandydatów na maksimum);
% zastosowanie znanych algorytmów Min i Max do utworzonych podzbiorów danych.
Jest to przykład zasady (metody) dziel i zwyciężaj, jednej z najefektywniejszych metod algorytmicznych w in-
formatyce  patrz punkty 4.4.2 i 4.5.2. Dziel  odnosi się do podziału zbioru danych na podzbiory, zwykle
o jednakowej liczbie elementów, do których następnie są stosowane odpowiednie algorytmy. Zwycięstwo 
to efekt końcowy, czyli efektywne rozwiązanie rozważanego problemu.
Obliczmy, ile porównań między elementami danych jest wykonywanych w powyższym algorytmie. Gdy
n jest liczbą parzystą, to w kroku podziału jest wykonywanych n/2 porównań, a znalezienie min oraz znalezie-
nie max wymaga każde n/2  1 porównań. Razem jest to 3n/2  2 porównania. Gdy n jest liczbą nieparzystą,
to otrzymujemy liczbę porównań * 3n/2  2, gdzie * x + oznacza tzw. powałę liczby, czyli najmniejszą liczbę cał-
+
kowitą k spełniającą nierówność x d" k. A zatem, w tym algorytmie jest wykonywanych * 3n/2  2 porównania,
+
czyli ok. n/2 mniej porównań niż w algorytmie naiwnym, naszkicowanym na początku tego punktu. Dodajmy,
że jest to również algorytm optymalny pod względem liczby wykonywanych porównań.
4.4 POSZUKIWANIE ELEMENTÓW W ZBIORZE
Komputery ułatwiają szybkie poszukiwanie informacji umieszczonych na płytach CD i na serwerach sieci In-
ternet. Jest to zasługą szybkości działania procesorów, jak również dobrej organizacji pracy, dzięki czemu po-
zostaje im ... niewiele do roboty.
< 14 > Informatyka +
W punkcie 4.1. zajmowaliśmy się znajdowaniem szczególnych elementów w zbiorze nieuporządkowa-
nym, najmniejszego i największego. Teraz będziemy rozważać problem poszukiwania w ogólniejszej postaci.
Problem poszukiwania elementu w zbiorze
Dane: Zbiór elementów w postaci ciągu n liczb x1, x2, ..., x . Wyróżniony element y.
n
Wynik: Jeśli y należy do tego zbioru, to podaj jego miejsce (indeks) w ciągu, a w przeciwnym razie  sygna-
lizuj brak takiego elementu w zbiorze.
Problem poszukiwania ma bardzo wiele zastosowań i jest rozwiązywany przez komputer na przykład wtedy,
gdy w jakimś ustalonym zbiorze informacji staramy się znalezć konkretną informację. Rozważana przez nas
wersja tego problemu jest bardzo prosta, na ogół bowiem zbiory i ich elementy mają bardzo złożoną postać,
nie są ograniczone tylko do pojedynczych liczb. Przedstawione przez nas metody mogą być jednak uogólnio-
ne na bardziej złożone sytuacje problemowe.
W następnych podpunktach, najpierw rozwiązujemy problem poszukiwania w dowolnym zbiorze ele-
mentów, a pózniej  w zbiorze uporządkowanym.
4.4.1 POSZUKIWANIE ELEMENTU W ZBIORZE NIEUPORZDKOWANYM
Jeśli nic nie wiemy o elementach w ciągu danych x1, x2, ..., x , to aby stwierdzić, czy wśród nich jest element
n
równy danemu y, musimy sprawdzić każdy z elementów tego ciągu, gdyż element y może się znajdować w do-
wolnym miejscu ciągu, a w szczególności może go tam nie być. W takim przypadku stosujemy przeszukiwa-
nie (lub poszukiwanie) liniowe, które stosowaliśmy w punkcie 4.1 do znajdowania w ciągu elementu najmniej-
szego lub największego. Na ogół takie przeszukiwanie odbywa się  od lewej do prawej , czyli od początku do
końca ciągu. Można je opisać następująco.
Algorytm poszukiwania liniowego (dla specyfikacji powyżej)
Krok 1. Dla i = 1, 2, ..., n, jeśli xi = y, to przejdz do kroku 3.
Krok 2. Komunikat: W ciągu danych nie ma elementu równego y. Zakończ algorytm.
Krok 3. Element równy y znajduje się na miejscu i w ciągu danych. Zakończ algorytm.
Jeśli element y znajduje się w przeszukiwanym ciągu, to algorytm kończy działanie po natknięciu się na nie-
go po raz pierwszy, a jeśli nie ma go w tym ciągu to kończy się po dojściu do końca ciągu. W obu przypadkach
liczba działań jest proporcjonalna do liczby elementów w ciągu. W pierwszym przypadku najwięcej operacji
jest wykonywanych wówczas, gdy poszukiwany element jest na końcu ciągu.
Przeszukiwanie liniowe z wartownikiem
Ciekawe własności ma niewielka modyfikacja powyższego algorytmu, wykorzystująca specjalny element,
umieszczony na końcu ciągu, zwany wartownikiem. Rolą wartownika jest  pilnowanie , by proces przeszuki-
wania nie wyszedł poza ciąg. Jak wiemy, gdy ciąg zawiera element o wartości y, to przeszukiwanie kończy się
na tym elemencie. Aby mieć pewność, że przeszukiwanie zawsze zakończy się na elemencie o wartości y, do-
łączamy na końcu ciągu element o wartości y. W efekcie, przeszukiwanie zawsze zakończy się znalezieniem
elementu o wartości y, należy jedynie sprawdzić, czy ten element znajduje się na dołączonej pozycji zbioru,
czy też wystąpił wcześniej. W pierwszym przypadku, badany zbiór nie zawiera elementu równego y, a w dru-
gim  y należy do zbioru. Widać stąd, że dołączony do zbioru element odgrywa rolę jego wartownika  nie mu-
simy bowiem sprawdzać, czy przeglądanie objęło cały zbiór czy nie  zawsze zatrzyma się ono na szukanym
elemencie, którym może być dołączony właśnie element.
4.4.2 POSZUKIWANIE ELEMENTU W ZBIORZE UPORZDKOWANYM
W tym punkcie zakładamy, że poszukiwania elementów (informacji) są prowadzone w uporządkowanych cią-
gach elementów  chcemy albo znalezć element, albo umieścić go w takim ciągu z zachowaniem uporządko-
wania.
PorzÄ…dek w informacjach
Zbiory mogą mieć różną strukturę  mogą to być książki w bibliotece, hasła w encyklopedii, liczba w ustalo-
nym przedziale lub numery w książce telefonicznej. Te przykłady są bliskie codziennym sytuacjom, w których
> Czy wszystko można policzyć na komputerze < 15 >
należy odszukać pewną informację i zapewne stosowane przez Was w tych przypadkach metody są podobne
do opisanych tutaj. Naszymi rozważaniami chcemy utwierdzić Was w przekonaniu, że:
integralną częścią informacji jest jej uporządkowanie,
gdyż w przeciwnym razie ... nie jest to informacja. To stwierdzenie nie jest naukowym określeniem informa-
cji2, ale odnosi siÄ™ do informacji w potocznym znaczeniu.
Wykonaj teraz ćwiczenie, które zapewne wykonywałeś już nieraz w swoim życiu, nie zdając sobie na-
wet z tego sprawy. Wez do ręki jedną z książek: słownik ortograficzny, słownik polsko-angielski lub książkę
telefoniczną, wybierz trzy słowa zaczynające się na litery: c, k oraz w i znajdz je w wybranej książce. Zanotuj,
ile razy ją otwierałaś, zanim znalazłeś stronę z poszukiwanym słowem.
Jeśli książka, którą wybrałeś, ma między 1000 a 2000 stron, to dla znalezienia jednego słowa nie po-
winieneś otwierać jej częściej niż 11 razy; jeśli ma między 500 a 1000 stron  to nie częściej niż 10 razy; jeśli
między 250 a 500 stron  to nie częściej niż 9 razy itp.
Skąd to wiemy? Przypuszczamy, że w poszukiwaniu hasła, po zajrzeniu na wybraną stronę wiesz, że znaj-
duje się ono przed nią, albo po niej, możesz więc jedną z części książki pominąć w dalszych poszukiwaniach. Co
więcej, w nieodrzuconej części kartek wybierasz jako kolejną tę, która jest bliska środka, lub leży w pobliżu lite-
ry, na którą zaczyna się poszukiwany wyraz. Stosujesz więc  może nawet o tym nie wiedząc  metodę poszuki-
wania, która polega na podziale (połowieniu) przeszukiwanego zbioru. Możesz ją zastosować, bo przeszukiwa-
ny zbiór jest uporządkowany. A ile prób musiałbyś wykonać, gdyby hasła w słowniku nie były uporządkowane?
Porównaj teraz:
% W alfabetycznym spisie telefonów na 1000 stronach wystarczy przejrzeć co najwyżej 10 stron, by znalezć
numer telefonu danej osoby.
% A jeśli miałbyś znalezć osobę, która ma telefon o numerze 1234567, to w najgorszym przypadku musiałbyś
przejrzeć wszystkie 1000 stron!
Czy to porównanie nie świadczy o potędze uporządkowania i o sile algorytmu zastosowanego do uporządko-
wanego wykazu?
Przedstawiony sposób poszukiwania przez połowienie w zbiorze uporządkowanym ilustrują, że ta metoda
jest kolejnym zastosowaniem zasady dziel i zwyciężaj.
Algorytm poszukiwania przez połowienie
Algorytm poszukiwania przez połowienie jest zwany również binarnym poszukiwaniem. Przyjmijmy, że prze-
szukiwany ciąg liczb jest umieszczony w tablicy x[k..l] i załóżmy dla uproszczenia, że wartość poszukiwane-
go elementu y mieści się w przedziale wartości elementów w tej tablicy, czyli xk d" y d" xl. Algorytm, który poda-
jemy gwarantuje, że w trakcie jego działania przeszukiwany przedział zawiera poszukiwany element y, czy-
li xlewy d" y d" x . Ta własność oraz to, że długość tego przedziału zmniejsza się w każdej iteracji (zob. krok 3),
prawy
zapewniają, że poniższy algorytm jest poprawny i skończony.
Algorytm poszukiwania przez połowienie (algorytm binarnego przeszukiwania)
Dane: Uporządkowany ciąg liczb w tablicy x[k..l], tzn. xk d" xk+1 d" & d" xl; oraz element y spełniający nie-
równości xk d" y d" xl.
Wyniki: Takie s (k d" s d" l), że x = y, lub przyjąć s =  1, jeśli y `" xi dla każdego i (k d" i d" l).
s
Krok 1. lewy := k; prawy := l; {Początkowe końce przeszukiwanego przedziału.}
Krok 2. Jeśli lewy > prawy, to przypisz s :=  1 i zakończ algorytm.
{Oznacza to, że poszukiwanego elementu y nie ma w przeszukiwanej tablicy.}
Krok 3. s:=(lewy + prawy) div 2; {Operacja div oznacza dzielenie całkowite.}
Jeśli x = y, to zakończ algorytm. {Znaleziono element y w przeszukiwanej tablicy.}
s
Jeśli x < y, to lewy :=s + 1, a w przeciwnym razie prawy := s  1.
s
Wróć do kroku 2.
2
W teorii informacji, informacja jest definiowana jako  miara niepewności zajścia pewnego zdarzenia spośród skończo-
nego zbioru zdarzeń możliwych  na podstawie Nowej encyklopedii powszechnej PWN.
< 16 > Informatyka +
Złożoność algorytmu binarnego przeszukiwania
Pytanie o liczbę porównań w powyższym algorytmie można sformułować następująco: ile razy należy od-
rzucać połowę bieżącego ciągu, by pozostał tylko jeden element (zauważmy tutaj, że jeśli elementu y nie ma
w ciągu, to kontynuujemy algorytm aż do wyczerpania wszystkich elementów, czyli wykonujemy o jeden krok
więcej). Jeśli n = 32, to jeden element pozostaje po pięciu podziałach, a jeśli n = 16  to po czterech. Stąd
można wywnioskować, że jeśli wartość n zawiera się między 16 a 32, to wykonujemy nie więcej niż pięć po-
równań. Ta obserwacja ma związek z potęgą liczby 2, a dokładniej  z najmniejszym wykładnikiem k potęgi 2k,
której wartość nie jest mniejsza od n, czyli n d" 2k. Pojawia się więc tutaj w naturalny sposób funkcja odwrotna
do potęgowania  logarytm. Można nawet przyjąć  informatyczną definicję tej funkcji:
log2n jest równy liczbie kroków prowadzących od n do 1, w których
bieżąca liczba jest zastępowana przez zaokrąglenie w górę jej połowy.
Algorytm binarnego umieszczania
Algorytm binarnego przeszukiwania ma dość istotne uogólnienie, gdy dla elementu y, bez względu na to, czy
należy do ciągu czy nie, chcemy znalezć takie miejsce, by po wstawieniu go tam, ciąg pozostał uporządkowa-
ny. Odpowiedni algorytm można w tym przypadku nazwać binarnym umieszczaniem i jest on prostym roz-
szerzeniem powyższego algorytmu.
Poszukiwanie interpolacyjne, czyli poszukiwania w słownikach
Czy rzeczywiście przeszukiwanie binarne jest najszybszą metodą znajdowania elementu w ciągu uporządko-
wanym? Wyobrazmy sobie, że mamy znalezć w książce telefonicznej numer telefonu Pana Bogusza Alfreda.
Wtedy zapewne skorzystamy z tego, że litera B jest blisko początku alfabetu i, owszem, zastosujemy metodę
podziału, ale w pierwszej próbie nie będziemy jednak dzielić książki na dwie połowy, ale raczej spróbujemy tra-
fić blisko tych stron, na których znajdują się nazwiska zaczynające się na literę B. W dalszych krokach będzie-
my postępować podobnie. Tę obserwację można wykorzystać w algorytmie poszukiwania. Zauważmy najpierw,
że w algorytmach binarnych jest sprawdzana jedynie relacja, czy dana liczba y jest większa (lub mniejsza lub
równa) od wybranej z ciągu, natomiast nie sprawdzamy i nie wykorzystujemy tego, jak bardzo jest większa.
Podczas odnajdywania wyrazów w encyklopediach korzystamy natomiast z informacji, w jakim miejscu alfabe-
tu znajduje się litera, którą rozpoczyna się poszukiwany wyraz, i w zależności od tego wybieramy odpowied-
nią porcję kartek. Strategia ta nazywa się interpolacyjnym poszukiwaniem, gdyż uwzględnia nie tylko położe-
niu szukanej liczby względem środka ciągu, ale uwzględnia jej wartość względem rozpiętości krańcowych war-
tości w ciągu. Szczegółowe informacje na temat interpolacyjnego poszukiwania można znalezć w książce [6].
4.5 ALGORYTMY PORZDKOWANIA
Porządkowanie, nazywane również często sortowaniem, ma olbrzymie znaczenie niemal w każdej działalności czło-
wieka. Jeśli elementy w zbiorze są uporządkowane zgodnie z jakąś regułą (np. książki lub ich karty katalogowe we-
dług liter alfabetu, słowa w encyklopedii, daty, numery telefonów według nazwisk właścicieli), to wykonywanie wielu
operacji na tym zbiorze staje się znacznie łatwiejsze i szybsze. Między innymi dotyczy to operacji (patrz punkt 4.4):
% sprawdzenia czy dany element, czyli element o ustalonej wartości cechy, według której zbiór został
uporzÄ…dkowany, znajduje siÄ™ w zbiorze,
% znalezienia elementu w zbiorze, jeśli w nim jest,
% dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.
Komputery w dużym stopniu zawdzięczają swoją szybkość temu, że działają na uporządkowanych informa-
cjach. To samo odnosi się do nas, gdy posługujemy się informacjami i komputerami. Jeśli chcemy na przykład
sprawdzić, czy w jakimś katalogu dyskowym znajduje się plik o podanej nazwie, rozszerzeniu, czasie utwo-
rzenia lub rozmiarze, to najpierw odpowiednio porządkujemy listę plików i wtedy na ogół znajdujemy odpo-
wiedz natychmiast.
Problem porzÄ…dkowania
Dla uproszczenia, problem porządkowania sformułujemy dla liczb, chociaż wiele praktycznych problemów
może dotyczyć porządkowania innych obiektów przechowywanych w komputerze.
> Czy wszystko można policzyć na komputerze < 17 >
Problem porzÄ…dkowania (sortowania)
Dane: Liczba naturalna n i ciÄ…g n liczb x1, x2, ..., x
n
Wynik: Uporządkowanie tego ciągu liczb od najmniejszej do największej.
Z założenia, że porządkujemy tylko liczby względem ich wartości wynika, że interesują nas algorytmy, w któ-
rych główną operacją jest porównanie, wykonywane między elementami danych. W ogólnym sformułowaniu
problemu porządkowania, porządkowane obiekty mogą być bardziej złożone, np. słowa (przy tworzeniu słow-
nika), adresy (do książki telefonicznej) czy bardzo złożone zestawy danych, jak np. informacje o koncie banko-
wym i jego właścicielu.
Znanych jest bardzo wiele algorytmów porządkowania liczb i innych obiektów przechowywanych
w komputerze. Temu zagadnieniu poświęcono wiele opasłych książek, np. Donald Knuth napisał na ten temat
ponad 1000 stron jeszcze w latach 60. XX wieku, patrz [4]. W dalszej części tego punktu prezentujemy dwa
najbardziej znane algorytmy porządkowania  przez wybór oraz sortowanie przez scalanie. Pierwszy z nich
jest iteracją poznanego wcześniej algorytmu i ma złożoność proporcjonalną do n2, gdzie n jest liczbą porząd-
kowanych elementów, a drugi  to przykład metody dziel i zwyciężaj, będący jedną z najszybszych metod sor-
towania. Złożoność tego drugiego algorytmu wynosi nlog n.
Działanie prezentowanych algorytmów porządkowania, jak i wielu innych algorytmów sortujących moż-
na obejrzeć w programach edukacyjnych Maszyna sortująca i Sortowanie, które znajdują się w folderze z ma-
teriałami do tych zajęć.
4.5.1 PORZDKOWANIE PRZEZ WYBÓR
Jeden z najprostszych algorytmów porządkowania można wyprowadzić korzystając z tego, co już poznaliśmy
w poprzednich punktach. Zauważmy, że jeśli mamy ustawić elementy w kolejności od najmniejszego do naj-
większego, to najmniejszy element w zbiorze powinien się znalezć na początku tworzonego ciągu, za nim po-
winien być umieszczony najmniejszy element w zbiorze pozostałym po usunięciu najmniejszego elementu
itd. Taki algorytm jest więc iteracją znanego algorytmu znajdowania Min w ciągu i nosi nazwę algorytmu po-
rządkowania przez wybór. Oto jego opis:
Algorytm porządkowani przez wybór  SelectionSort
Dane: Liczba naturalna n i ciÄ…g n liczb x1, x2, ..., x .
n
Wynik: Uporządkowanie danego ciągu liczb od najmniejszej do największej. (Uwaga. Elementy ciągu dane-
go i wynikowego oznaczamy tak samo, gdyż porządkowanie odbywa się  w tym samym miejscu .)
Krok 1. Dla i = 1, 2, ..., n  1 wykonaj kroki 2 i 3, a następnie zakończ algorytm.
Krok 2. Znajdz k takie, że xk jest najmniejszym elementem w ciągu xi, ..., x .
n
Krok 3. Zamień miejscami elementy xi oraz xk.
Złożoność algorytmu SelectionSort
Aby obliczyć, ile porównań i zamian elementów, w zależności od liczby elementów w ciągu n, jest wykonywa-
nych w algorytmie SelectionSort wystarczy zauważyć, że ten algorytm jest iteracją algorytmu znajdowania
najmniejszego elementu w ciągu, a ciąg, w którym szukamy najmniejszego elementu, jest w kolejnych itera-
cjach coraz krótszy. Liczba przestawień elementów jest równa liczbie iteracji, gdyż elementy są przestawia-
ne jedynie na końcu każdej iteracji, których jest n  1, a więc wynosi n  1. Jeśli zaś chodzi o liczbę porównań,
to wiemy, że algorytm znajdowania minimum w ciągu wykonuje o jedno porównanie mniej niż jest elementów
w ciągu, a zatem cały algorytm porządkowania przez wybór, dla ciągu danych złożonego na początku z n ele-
mentów wykonuje liczbę porównań równą:
(n  1) + (n  2) + (n  3) + & + 3 + 2 + 1
Wartość tej sumy można obliczyć wieloma sposobami, np. jako sumę postępu arytmetycznego i otrzymujemy
Zauważmy, że otrzymany wzór na liczbę porównań w algorytmie porządkowania przez wybór jest dokładną
liczbą działań wykonywanych w algorytmie, bez względu na to, jak daleko porządkowany ciąg jest już upo-
rzÄ…dkowany.
< 18 > Informatyka +
4.5.2 PORZDKOWANIE PRZEZ SCALANIE
Metoda dziel i zwyciężaj realizowana rekurencyjnie jest jedną z najsilniejszych technik komputerowego roz-
wiązywania problemów. W tej metodzie, część organizacji obliczeń jest  zrzucana na komputer , faktycznie
więc wykorzystywana jest potęga komputerów. W tym punkcie zastosujemy metodę dziel i zwyciężaj w algo-
rytmie porzÄ…dkowania przez scalanie. W tym algorytmie jest wykorzystywana metoda scalania uporzÄ…dko-
wanych ciągów, czyli ich łączenia w jeden ciąg.
Scalanie ciągów uporządkowanych
Przyjmijmy, że scalamy ciągi uporządkowane i wynik scalania ma być również ciągiem uporządkowanym.
Można to wykonać w bardzo prosty sposób: patrzymy na początki danych ciągów i do tworzonego ciągu prze-
nosimy mniejszy z elementów czołowych lub którykolwiek z nich, jeśli są równe, patrz rys. 4.
Scalony ciÄ…g Scalone ciÄ…gi
1 3 5 7 10 12
1 3 5 7 10 12
1 2 6 9 11 15 17 20 Scalanie
1 2 6 9 11 15 17 20
Rysunek 4.
Przykład scalania dwóch ciągów uporządkowanych
Aby określić, ile porównań wykonuje algorytm scalający dwa ciągi zauważmy, że z wyjątkiem elementu prze-
noszonego na końcu, przeniesienie każdego innego elementu może być związane z wykonaniem porówna-
nia między elementami danych ciągów. Tak jest wtedy, gdy w kroku przed przedostatnim, oba scalane ciągi
zawierają jeszcze po jednym elemencie. Przypuśćmy więc, że na początku jeden ciąg zawiera k elementów
a drugi ma l elementów. razem n, czyli n = k + l. Ta dyskusja prowadzi do konkluzji, że bez względu na liczno-
ści danych ciągów, ich scalenie może wymagać wykonania n  1 porównań.
Z tej dyskusji wynika jeszcze jeden wniosek  ponieważ nie potrafimy przewidzieć, który z ciągów i kie-
dy wyczerpie się w trakcie scalania, tworzony ciąg nie może być umieszczany na miejscu ciągów danych do
scalenia, musi więc być tworzony na nowym miejscu. Zatem potrzebna jest dodatkowa pamięć  mówimy
w takim przypadku, że ta metoda nie działa  w miejscu (in situ).
Algorytm scalania dwóch ciągów uporządkowanych  Scal
Dane: Dwa uporzÄ…dkowane ciÄ…gi x i y.
Wynik: Uporządkowany ciąg z, będący scaleniem ciągów x i y.
Krok 1. Dopóki oba ciągi x i y nie są puste wykonuj następującą operację:
przenieś mniejszy z najmniejszych elementów z ciągów x i y do ciągu z.
Krok 2. Do końca ciągu z dopisz elementy pozostałe w jednym z ciągów x lub y.
PorzÄ…dkowanie przez scalanie
Algorytm scalania dwóch uporządkowanych ciągów można stosować do tworzenia uporządkowanych ciągów
z podciągów już uporządkowanych. Mógłby być pożytek z tego algorytmu przy porządkowaniu, gdybyśmy
potrafili najpierw uporządkować te podciągi. Załóżmy więc, że te podciągi porządkujemy... tą samą meto-
dÄ…  w tym celu przydaje siÄ™ rekurencja. W algorytmie porzÄ…dkowania przez scalanie porzÄ…dkowany ciÄ…g jest
dzielony w każdym kroku na dwa, niemal równej długości podciągi, które rekurencyjnie są porządkowane tą
samą metodą. Warunkiem zakończenia rekurencji w tym algorytmie jest sytuacja, gdy ciąg ma jeden element,
wtedy nie można go już podzielić na podciągi, chociaż nie ma nawet po co  jest to bowiem ciąg już uporząd-
kowany. Jak zwykle, w opisie algorytmu rekurencyjnego, po nazwie algorytmu występuje układ parametrów
określających rozwiązywany problem, który jest wykorzystany w treści algorytmu, w odwołaniu do niego sa-
mego przy rozwiązywaniu mniejszych podproblemów.
> Czy wszystko można policzyć na komputerze < 19 >
Algorytm porzÄ…dkowania przez scalanie MergeSort (l,p,x)
Dane: CiÄ…g liczb xl, xl+1, & , x
p
Wynik: Uporządkowanie tego ciągu liczb od najmniejszej do największej.
Krok 1. Jeśli l < p, to przyjmij s:=(l+p) div 2 i wykonaj trzy następne kroki.
Krok 2. Zastosuj ten sam algorytm do ciÄ…gu (l,s,x), czyli wykonaj MergeSort(l,s,x).
Krok 3. Zastosuj ten sam algorytm do ciagu (s+1,p,x), czyli wykonaj MergeSort(s+1,p,x)
Krok 4. Zastosuj algorytm scalania Scal do ciągów (xl, & , x ), (x , & , x ) i wynik umieść z powrotem w ciągu
s s+1 p
(xl, & , x ).
p
Złożoność sortowania ciągu n liczb przez scalanie wynosi około nlogn, jest zatem znacznie mniejsza niż zło-
żoność algorytmu sortowania przez wybór .
4.6 OBLICZANIE WARTOÅšCI WIELOMIANU  SCHEMAT HORNERA
Obliczanie wartości wielomianu o zadanych współczynnikach jest jedną z najczęściej wykonywanych ope-
racji w komputerze. Wynika to z ważnego faktu matematycznego, zgodnie z którym każdą funkcję (np. funk-
cje trygonometryczne) można zastąpić wielomianem, którego postać zależy od funkcji i od tego, jaką chcemy
uzyskać dokładność obliczeń. Najefektywniejszym sposobem obliczania wartości wielomianu jest schemat
Hornera, wynikający z następującego przekształcenia postaci wielomianu:
w (x) = a0xn + a1xn 1 + ... + a x + a = (a0xn 1 + a1xn 2+ ... + a )x + a
n n 1 n n 1 n
= ((a0xn 2 + a1xn 3 + ... + a )x + a )x + a =
n 2 n 1 n
= (...((a0x + a1)x + a2)x + ... + a )x + a )x + a
n 2 n 1 n
Ten ostatni wzór można zapisać w następującej postaci algorytmicznej:
y := a0
y: = yz + ai dla i = 1, 2, ..., n.
StÄ…d otrzymujemy algorytm:
Algorytm: Schemat Hornera
Dane: n  nieujemna liczba całkowita (stopień wielomianu);
a0, a1, ... , a  n+1 współczynników wielomianu;
n
z  wartość argumentu.
Wynik: y = w (z)  wartość wielomianu stopnia n dla wartości argumentu x = z.
n
Krok 1. y := a0  początkową wartością jest współczynnik przy najwyższej potędze.
Krok 2. Dla i = 1, 2, & , n oblicz wartość dwumianu y := yz + ai
Z postaci algorytmu wynika, że obliczenie wartości wielomianu stopnia n wymaga wykonania n mnożeń i n
dodawań. Udowodniono, że jest to najszybszy sposób obliczania wartości wielomianu.
Schemat Hornera ma wiele zastosowań, m.in. do:
% obliczania dziesiętnej wartości liczby, danej w systemie o podstawie p  współczynniki wielomianu są
w tym przypadku cyframi {0, 1, & , p  1} a argumentem p, podstawa systemu.
% szybkiego obliczania wartości potęgi (patrz punkt 5.2).
5 DWA TRUDNE PROBLEMY
Wracamy tutaj do dwóch problemów przedstawionych w rozdziale 3. Jednym z nich jest sprawdzanie, czy dana
liczba jest liczbą pierwszą, a drugim  szybkie podnoszenie do potęgi. Dla pierwszego z tych problemów nie
mamy dobrej wiadomości, nie jest bowiem znana żadna metoda szybkiego testowania pierwszości liczb. Ko-
rzysta się z tego na przykład w szyfrze RSA, częścią kluczy w tej metodzie jest liczba będąca iloczynem dwóch
dużych liczb pierwszych i brak znajomości tego rozkładu jest gwarancją bezpieczeństwa tego szyfru.
Drugim problemem jest podnoszenie do dużych potęg i tutaj mamy bardzo dobrą wiadomość  podno-
szenie do nawet bardzo dużych potęg, zawierających setki cyfr, trwa ułamek sekundy.
< 20 > Informatyka +
5.1 BADANIE ZAOŻONOŚCI LICZB
Dla problemu badania, czy dana liczba n jest liczbą pierwszą, czy złożoną, dysponujemy prostym algorytmem, któ-
ry polega na dzieleniu n przez kolejne liczby naturalne i wystarczy dzielić tylko przez liczby nie wiÄ™ksze niż "n, gdyż
liczby n nie można rozÅ‚ożyć na iloczyn dwóch liczb wiÄ™kszych od "n. Algorytm ten ma bardzo prostÄ… postać:
var i,n:integer;
i:=2;
while i*i <= n do begin
if n mod i = 0 then return 1; {n jest podzielne przez i}
i=i+1
end;
return 0 {n jest liczba pierwszÄ…}
Ten fragment programu zwraca 0, jeśli n jest liczbą pierwszą, i 1, gdy n jest liczbą złożoną. W tym drugim przy-
padku znamy także podzielnik liczby n. Ten fragment programu można rozszerzyć do programu generujące-
go wszystkie dzielniki liczby n.
Liczba operacji wykonywanych przez powyższy program jest w najgorszym przypadku (gdy n jest liczbą pierw-
szą) proporcjonalna do "n, a więc jeśli n = 10m, to wykonywanych jest 10m/2 operacji. Zatem są niewielkie szanse, by
tym algorytmem rozłożyć na czynniki pierwsze liczbę, która ma kilkaset cyfr, lub stwierdzić, że się jej nie da rozłożyć.
Rozkładem liczby złożonej na czynniki pierwsze mogą być zainteresowani ci, którzy starają się złamać szyfr
RSA. Wiadomo, że jedna z liczb tworzących kluch publiczny i prywatny jest iloczynem dwóch liczb pierw-
szych. Znajomość tych dwóch czynników umożliwia utworzenie klucza prywatnego (tajnego). Jednak ich wiel-
kość  są to liczby pierwsze o kilkuset cyfrach (200-300) stoi na przeszkodzie w rozkładzie n.
Istnieje wiele algorytmów, które służą do testowania pierwszości liczb oraz do rozkładania liczb na czynni-
ki pierwsze. Niektóre z tych algorytmów mają charakter probabilistyczny  wynik ich działania jest poprawny
z prawdopodobieństwem bliskim 1. Żaden jednak algorytm, przy obecnej mocy komputerów, nie umożliwia
rozkładania na czynniki pierwsze liczb, które maja kilkaset cyfr. Szyfr RSA pozostaje więc nadal bezpiecznym
sposobem utajniania wiadomości, w tym również przesyłanych w sieciach komputerowych.
5.2 SZYBKIE PODNOSZENIE DO POTGI
Wracamy tutaj do obliczania wartości potęgi xm, dla dużych wartości wykładnika m. W punkcie 3.3 podaliśmy
przykład dla m = 12345678912345678912345678912345. Stosując  szkolny algorytm, czyli kolejne mno-
żenia, i korzystając z naszego superkomputera, obliczenie potęgi dla tego wykładnika zajęłoby 3*108 lat. Ten
wykładnik jest faktycznie niewielką liczbą, w porównaniu z wykładnikami, jakie pojawiają się przy stosowa-
niu szyfru RSA, potrzebny jest więc znacznie efektywniejszy algorytm.
Do wyprowadzenia algorytmu szybkiego potęgowania posłużymy się rekurencyjnym zapisem opera-
cji potęgowania:
1 jeśli m = 0
xm = (xm/2)2, jeśli m jest liczbą parzystą
{
(x(m 1)/2)2x jeśli m jest liczbą nieparzystą
Na przykład, jeśli chcemy obliczyć x22, to powyższa zależność rekurencyjna prowadzi przez następujące od-
wołania rekurencyjne: x22 = (x11)2 = ((x5)2x)2 = (((x2)2x)2x)2.
Warto zauważyć, jaki jest związek kolejności wykonywania mnożeń, wynikającej z powyższej zależno-
ści rekurencyjnej, z postacią binarną wykładnika, zapisaną z użyciem schematu Hornera. Dla naszego przy-
kładu mamy m = (22)10 = (10110)2. Porównując kolejność mnożeń z postacią binarną widać, że podnoszenie
do kwadratu odpowiada kolejnym pozycjom w rozwinięciu binarnym, a mnożenie przez x odpowiada cyfrze 1
w rozwinięciu binarnym. A zatem, liczba mnożeń jest nie większa niż dwa razy długość binarnego rozwinięcia
wykładnika. Wiemy skądinąd, że długość rozwinięcia binarnego liczby m wynosi ok. log2m. Mamy w przybli-
żeniu log212345678912345678912345678912345 = 104, a zatem podniesienie do tej potęgi wymaga wyko-
nania nie więcej niż ok. 200 mnożeń.
W tabeli 3 zamieściliśmy wartości logarytmu przy podstawie 2 z rosnących wartości liczby m.
> Czy wszystko można policzyć na komputerze < 21 >
Tabela 3.
Przybliżona długość rozwinięcia binarnego liczby m
m log2m
104 10
106 20
109 30
1012 40
1020 66,5
1050 166
10100 332,2
Z tabeli 3 wynika, że obliczenie wartości potęgi dla wykładnika o stu cyfrach wymaga wykonania nie więcej
niż 670 mnożeń, a to trwa nawet na komputerze osobistym ułamek sekundy.
Problem potęgowania jest najlepszą ilustracją powiedzenia Ralfa Gomory ego, że prawdziwe przyspieszenie
obliczeń osiągamy dzięki efektywnym algorytmom, a nie szybszym komputerom.
LITERATURA
1. Cormen T.H., Leiserson C.E., Rivest R.L., Wprowadzenie do algorytmów, WNT, Warszawa 1997
2. Gurbiel E., Hard-Olejniczak G., Kołczyk E., Krupicka H., Sysło M.M., Informatyka, Część 1 i 2, Podręcznik dla
LO, WSiP, Warszawa 2002-2003
3. Harel D., Algorytmika. Rzecz o istocie informatyki, WNT, Warszawa 1992
4. Knuth D.E., Sztuka programowania, Tomy 1  3, WNT, Warszawa 2003
5. Steinhaus H., Kalejdoskop matematyczny, WSiP, Warszawa 1989
6. Sysło M.M., Algorytmy, WSiP, Warszawa 1997
7. Sysło M.M., Piramidy, szyszki i inne konstrukcje algorytmiczne, WSiP, Warszawa 1998. Kolejne rozdziały tej
książki są zamieszczone na stronie: http://www.wsipnet.pl/kluby/informatyka_ekstra.php?k=69
8. Wirth N., Algorytmy + struktury danych = programy, WNT, Warszawa 1980.
< 22 > Notatki Informatyka +
Notatki < 23 >
W projekcie Informatyka +, poza wykładami i warsztatami,
przewidziano następujące działania:
% 24-godzinne kursy dla uczniów w ramach modułów tematycznych
% 24-godzinne kursy metodyczne dla nauczycieli, przygotowujÄ…ce
do pracy z uczniem zdolnym
% nagrania 60 wykładów informatycznych, prowadzonych
przez wybitnych specjalistów i nauczycieli akademickich
% konkursy dla uczniów, trzy w ciągu roku
% udział uczniów w pracach kół naukowych
% udział uczniów w konferencjach naukowych
% obozy wypoczynkowo-naukowe.
Szczegółowe informacje znajdują się na stronie projektu
www.informatykaplus.edu.pl


Wyszukiwarka

Podobne podstrony:
Przydatne wpisy do rejestru na komputerach klienta uzupełnie
Zachowanie bezpieczeństwa przy pracy na komputerze
Czy Polska będzie skazana na najemników
Stara wersja warblade sciagnij na komputer
Na początek parę prostych programów które można sprawdzić na
Wszystko można co się zdarzy
10 kroków do komfortowej pracy na komputerze
Emulator psp(PPSSPP) na komputer
Szostak Pisanie na komputerze
Jak oglądnąć Star Wars na komputerze
Czy mamy najwyższe podatki na świecie
Tekto Pytania na egzamin ze starszych lat Nie wiem czy to juz jest na forum ale wrzucam

więcej podobnych podstron