INSTYTUT BADAŃ SYSTEMOWYCH PAN WYDZIA L MATEMATYKI I NAUK INFORMACYJNYCH POLITECHNIKI WARSZAWSKIEJ. Algorytmy. i podstawy programowania

Podobne dokumenty
Algorytmy. i podstawy programowania. eci. Proste algorytmy sortowania tablic. 4. Wskaźniki i dynamiczna alokacja pami

Zapis informacji, systemy pozycyjne 1. Literatura Jerzy Grębosz, Symfonia C++ standard. Harvey M. Deitl, Paul J. Deitl, Arkana C++. Programowanie.

Twierdzenie Bezouta i liczby zespolone Javier de Lucas. Rozwi azanie 2. Z twierdzenia dzielenia wielomianów, mamy, że

Laboratorium ochrony danych

STATYSTYKA MATEMATYCZNA WYKŁAD 5 WERYFIKACJA HIPOTEZ NIEPARAMETRYCZNYCH

Analiza danych OGÓLNY SCHEMAT. Dane treningowe (znana decyzja) Klasyfikator. Dane testowe (znana decyzja)

Zaawansowane metody numeryczne

I. Elementy analizy matematycznej

Urządzenia wejścia-wyjścia

Zestaw zadań 4: Przestrzenie wektorowe i podprzestrzenie. Liniowa niezależność. Sumy i sumy proste podprzestrzeni.

Paradygmaty programowania. Paradygmaty programowania

Zaawansowane metody numeryczne Komputerowa analiza zagadnień różniczkowych 1. Układy równań liniowych

Weryfikacja hipotez dla wielu populacji

Programowanie Równoległe i Rozproszone

D Archiwum Prac Dyplomowych - Instrukcja dla studentów

Problem plecakowy (KNAPSACK PROBLEM).

MATEMATYKA POZIOM ROZSZERZONY Kryteria oceniania odpowiedzi. Arkusz A II. Strona 1 z 5

BADANIA OPERACYJNE. Podejmowanie decyzji w warunkach niepewności. dr Adam Sojda

WikiWS For Business Sharks

Analiza rodzajów skutków i krytyczności uszkodzeń FMECA/FMEA według MIL STD A

) będą niezależnymi zmiennymi losowymi o tym samym rozkładzie normalnym z następującymi parametrami: nieznaną wartością 1 4

KURS STATYSTYKA. Lekcja 6 Regresja i linie regresji ZADANIE DOMOWE. Strona 1

5. OPTYMALIZACJA GRAFOWO-SIECIOWA

Projekt 6 6. ROZWIĄZYWANIE RÓWNAŃ NIELINIOWYCH CAŁKOWANIE NUMERYCZNE


Wyk lad 7 Baza i wymiar przestrzeni liniowej

SZTUCZNA INTELIGENCJA

Ćwiczenie 10. Metody eksploracji danych

W praktyce często zdarza się, że wyniki obu prób możemy traktować jako. wyniki pomiarów na tym samym elemencie populacji np.

Sortowanie szybkie Quick Sort

Problemy jednoczesnego testowania wielu hipotez statystycznych i ich zastosowania w analizie mikromacierzy DNA

ANALIZA KORELACJI WYDATKÓW NA KULTURĘ Z BUDŻETU GMIN ORAZ WYKSZTAŁCENIA RADNYCH

ALGEBRY HALLA DLA POSETÓW SKOŃCZONEGO TYPU PRINJEKTYWNEGO

ORGANIZACJA ZAJĘĆ OPTYMALIZACJA GLOBALNA WSTĘP PLAN WYKŁADU. Wykładowca dr inż. Agnieszka Bołtuć, pokój 304,

( ) ( ) 2. Zadanie 1. są niezależnymi zmiennymi losowymi o. oraz. rozkładach normalnych, przy czym EX. i σ są nieznane. 1 Niech X

Analiza danych. Analiza danych wielowymiarowych. Regresja liniowa. Dyskryminacja liniowa. PARA ZMIENNYCH LOSOWYCH

Natalia Nehrebecka. Zajęcia 3

Procedura normalizacji

Proste modele ze złożonym zachowaniem czyli o chaosie

D Archiwum Prac Dyplomowych - Instrukcja dla opiekunów/promotorów/recenzentów

PORADNIK KANDYDATA. Wkrótce w nauka w szkole w jaki sposób je. zasadniczych szkole

Diagnostyka układów kombinacyjnych

SYSTEM ZALICZEŃ ĆWICZEŃ

STARE A NOWE KRAJE UE KONKURENCYJNOŚĆ POLSKIEGO EKSPORTU

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

METODA UNITARYZACJI ZEROWANEJ Porównanie obiektów przy ocenie wielokryterialnej. Ranking obiektów.

ZESTAW ZADAŃ Z INFORMATYKI

Natalia Nehrebecka. Wykład 2

f(x, y) = arctg x y. f(u) = arctg(u), u(x, y) = x y. x = 1 1 y = y y = 1 1 +

KURS STATYSTYKA. Lekcja 1 Statystyka opisowa ZADANIE DOMOWE. Strona 1

Kodowanie informacji. Instytut Informatyki UWr Studia wieczorowe. Wykład nr 2: rozszerzone i dynamiczne Huffmana

Rozkład dwupunktowy. Rozkład dwupunktowy. Rozkład dwupunktowy x i p i 0 1-p 1 p suma 1

Rozdzia l 3. Laboratorium 3. danych zawierajac

Rozwiązywanie zadań optymalizacji w środowisku programu MATLAB

Statystyka. Zmienne losowe


5. Pochodna funkcji. lim. x c x c. (x c) = lim. g(c + h) g(c) = lim

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Regulamin promocji 14 wiosna

Stanisław Cichocki. Natalia Nehrebecka Katarzyna Rosiak-Lada. Zajęcia 3

Badanie współzależności dwóch cech ilościowych X i Y. Analiza korelacji prostej

Statystyka Inżynierska

ZASADY PROGRAMOWANIA KOMPUTERÓW

Komputer kwantowy Zasady funkcjonowania. Dr hab. inż. Krzysztof Giaro Politechnika Gdańska Wydział ETI

Badania sondażowe. Braki danych Konstrukcja wag. Agnieszka Zięba. Zakład Badań Marketingowych Instytut Statystyki i Demografii Szkoła Główna Handlowa

Grzegorz Mazur. Zak lad Metod Obliczeniowych Chemii UJ. 14 marca 2007

PODSTAWA WYMIARU ORAZ WYSOKOŚĆ EMERYTURY USTALANEJ NA DOTYCHCZASOWYCH ZASADACH

Drzewa AVL definicje

Zadanie na wykonanie Projektu Zespołowego

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Zmodyfikowana technika programowania dynamicznego

Wyk lad 4 Dzia lania na macierzach. Określenie wyznacznika

Wprowadzenie do Sieci Neuronowych Sieci rekurencyjne

Modelowanie i obliczenia techniczne. Metody numeryczne w modelowaniu: Optymalizacja

Proces narodzin i śmierci

WPROWADZENIE DO TEORII DECYZJI STATYSTYCZNYCH

Parametry zmiennej losowej

Paradygmaty programowania

Stanisław Cichocki. Natalia Nehrebecka. Wykład 6

architektura komputerów w. 3 Arytmetyka komputerów

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

± Δ. Podstawowe pojęcia procesu pomiarowego. x rzeczywiste. Określenie jakości poznania rzeczywistości

Prawdopodobieństwo i statystyka r.

Minimalizacja globalna. Algorytmy genetyczne i ewolucyjne.

Statystyka Opisowa 2014 część 1. Katarzyna Lubnauer

Trzecie laboratoria komputerowe ze Staty Testy

Architektura systemów komputerowych

Modele wieloczynnikowe. Modele wieloczynnikowe. Modele wieloczynnikowe ogólne. α β β β ε. Analiza i Zarządzanie Portfelem cz. 4.

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

APROKSYMACJA QUASIJEDNOSTAJNA

Wyk lad 9 Podpierścienie, elementy odwracalne, dzielniki zera

Statystyka Opisowa 2014 część 2. Katarzyna Lubnauer

Funkcje i charakterystyki zmiennych losowych

SZACOWANIE NIEPEWNOŚCI POMIARU METODĄ PROPAGACJI ROZKŁADÓW

Wstęp do programowania

Dyskretne modele populacji

Rozdzia l 11. Przestrzenie Euklidesowe Definicja, iloczyn skalarny i norma. iloczynem skalarnym.

Rozliczanie kosztów Proces rozliczania kosztów

p Z(G). (G : Z({x i })),

Transkrypt:

MAREK GAGOLEWSKI INSTYTUT BADAŃ SYSTEMOWYCH PAN WYDZIA L MATEMATYKI I NAUK INFORMACYJNYCH POLITECHNIKI WARSZAWSKIEJ Algorytmy podstawy programowana 4. Wskaźnk dynamczna alokacja pam ec. Proste algorytmy sortowana tablc Matera ly dydaktyczne dla studentów matematyk na Wydzale Matematyk Nauk Informacyjnych Poltechnk Warszawskej Copyrght 2010 2016 Marek G agolewsk Ths work s lcensed under a Creatve Commons Attrbuton 3.0 Unported Lcense.

SPIS TREŚCI 0 Sps treśc 4.1. Dynamczna alokacja pamec.......................... 1 4.1.1. Organzacja pamec komputera..................... 1 4.1.2. Wskaźnk................................. 1 4.1.3. Przydza l zwalnane pamec ze sterty................ 5 4.1.4. Tablce................................... 6 4.1.5. Przekazywane tablc funkcjom..................... 9 4.2. Proste algorytmy sortowana tablc....................... 10 4.2.1. Sortowane przez wybór......................... 12 4.2.2. Sortowane przez wstawane...................... 15 4.2.3. Sortowane babelkowe.......................... 18 4.2.4. Efektywność oblczenowa........................ 23 4.3. Ćwczena..................................... 26 4.4. Wskazówk odpowedz do ćwczeń...................... 28

4.1. DYNAMICZNA ALOKACJA PAMIECI 1 4.1. Dynamczna alokacja pam ec 4.1.1. Organzacja pam ec komputera W drugm rozdzale skryptu dowedzelśmy se, że w pamec operacyjnej komputera przechowywane sa ne tylko dane, ale kod maszynowy programów. Podstawowa jednostka pamec jest komórka o rozmarze jednego bajta. Każda komórka pamec posada swój adres, który jest reprezentowany we wspó lczesnych komputerach za pomoca 32- lub 64-btowej lczby ca lkowtej. Z punktu wdzena każdego programu można wyróżnć nastepuj acy podza l pul adresowej pamec (w tzw. archtekturze von Neumanna): kod programu nformacje nterpretowane sa tutaj jako nstrukcje procesora, stos (ang. stack) gdze przechowywane sa wartośc zmennych lokalnych funkcj, sterta (ang. heap) gdze znajduja se dane dynamczne przydzelane (alokowane) na prośbe programu (zob. dalej), cześć nedostepna zarzadzana przez system operacyjny (m.n. dane nnych programów). Zatem każdy program przechowuje dane potrzebne do wykonywana swych czynnośc na stose sterce. Stos jest cześc a pamec operacyjnej, na której dane umeszczane kasowane sa w porzadku ostatn na wejścu, perwszy na wyjścu (LIFO, ang. last-n-frst-out). Umeszczane kasowane danych na stose odbywa se automatyczne. Każda wywo lywana funkcja tworzy na stose mejsce dla swoch zmennych lokalnych. Gdy funkcja kończy dza lane, usuwa z nego te nformacje (to dlatego zmenne lokalne przestaja wtedy stneć). Przyjrzyjmy se rozszerzonej wersj lustracj z poprzednego rozdza lu (rys. 4.1). Po lewej strone wdzmy fragment funkcj man(), w której zosta ly zadeklarowane zmenne x, y, z. Umeszczone sa one na dole stosu (jako perwsze w programe). Gdy funkcja ta wywo luje f(), na stose tworzone jest mejsce dla zmennych n, m x. Gdy f() kończy swe dza lane, sa one ze stosu automatyczne usuwane. n,m,x... nt x = 8; nt y = 4; nt z = f(x, y);... 32 8 4 nt f(nt n, nt m) { nt x = n m; return x; } x,y,z f() Poczatek stosu Rys. 4.1. Zas eg zmennych 4.1.2. Wskaźnk Każda zmenna ma przyporzadkowan a komórke (badź komórk) pamec, w której przechowuje swoje dane, np. zmenna typu nt zajmuje najcześcej 4 take komórk (4 bajty). Fzyczny adres zmennej (czyl numer komórk) można odczytać za pomoca operatora &.

4.1. DYNAMICZNA ALOKACJA PAMIECI 2 nt x; cout << " x znajduje sę pod adresem " << & x << endl ; // np. 0 x e 3 d 3 0 d b c Przypomnjmy, że 0xe3d30dbc oznacza lczbe ca lkowta zapsana w systeme szesnastkowym. W systeme dzesetnym jest ona równa 3822259644. Co ważne, przy kolejnym uruchomenu programu może to być nna wartość. Nas jednak nteresuje tutaj fakt, że jest to zwyczajna lczba. Każda zmenna ma zatem swoje mejsce na mape (tzn. w pamec komputera), znajdujace se pod pewnym adresem (np. na ul. Koszykowej 75 w Warszawe). Operator & pozwala wec uzyskać nformacje o pozycj danej zmennej. Jeszcze naczej: zmenna to budynek magazynu w którym można przechowywać towar określonego rodzaju, np. cukerk. Adres zmennej to wspó lrzedne GPS tegoż magazynu. Specjalny typ danych do przechowywana nformacj o adresach nnych zmennych ( wspó lrz ednych GPS ) określonego typu zwany jest typem wskaźnkowym. Oznacza se go przez dodane symbolu * (gwazdka) bezpośredno po nazwe typu. Na przyk lad, zadeklarowane zmennej typu nt oznacza stworzene zmennej przechowujacej fzyczny adres w pamec komputera pewnej lczby ca lkowtej (wspó lrz edne GPS pewnego magazynu do przechowywana cukerków), czyl wskaźnka na zmenna typu nt. Zapam etaj Istneje specjalne mejsce w pamec o adrese 0 (NULL, czarna dzura ), do którego odwo lane se podczas dza lana programu powoduje wystapene b l edu. Czesto używa se tego adresu np. do zancjowana wskaźnków celem oznaczena, że poczatkowo ne wskazuja one na żadne konkretne mejsce. Na zmennych wskaźnkowych zosta l określony tzw. operator wy luskana, (ne mylć z gwazdka modyfkujac a znaczene typu!), dzek któremu możemy odczytać, co se znajduje pod danym adresem pamec (co znajduje se w jakmś magazyne, którego znamy tylko wspó lrz edne GPS). Przyjrzyjmy se ponższemu przyk ladow. Tworzone sa dwe zmenne: jedna typu ca lkowtego, a druga wskaźnkowa. Ich rozmeszczene w pamec (a dok ladnej na stose, sa to bowem zmenne lokalne jakejś funkcj) przedstawa rys. 4.2. Każda z tych zmennych umeszczona jest pod jakmś adresem w pamec RAM można go odczytać za pomoca operatora &. 1 nt x = 100; 2 nt wskx = &x; 3 Lstng 4.1. Wy luskane danych spod danego adresu 4 cout << wskx << endl ; // np. 0 x d f 5 9 0 5 4 4 5 cout << wskx << endl ; // 100 6 cout << x << endl ; // 100 Wypsane wartośc wskaźnka oznacza wypsane adresu, na który wskazuje. Wypsane zaś wy luskanego wskaźnka powoduje wydrukowane wartośc komórk pamec, na która pokazuje wskaźnk. Jako że zmenna typu nt u nas ma rozmar 4 bajtów, adres nastepnej zmennej (wskx) jest o 4 jednostk wekszy od adresu x.

4.1. DYNAMICZNA ALOKACJA PAMIECI 3 wskx 0xdf590548 x 0xdf590544 (nt*) 0xdf590544 (nt) 100 Rys. 4.2. Zawartość pam ec komputera w programe z lstngu 4.1 Aby jeszcze lepej zrozumeć omawane zagadnene, rozważmy fragment kolejnego programu. Lstng 4.2. Proste operacje z użycem wskaźnków 1 nt x, y; 2 nt w; 3 w = &x; // w = a d r e s x ( n e c h w w s k a z u j e na zmenna x ) 4 w = 1; // wstaw 1 tam, g d z e w s k a z u j e t e r a z w 5 w = &y; // w = a d r e s y ( n e c h w w s k a z u j e na zmenna y ) 6 w = 2; // wstaw 2 tam, g d z e w s k a z u j e t e r a z w Zawartość pamec po wykonanu kolejnych ln kodu przedstawa rys. 4.3. Tym razem za pomoca operatora wy luskana zapsujemy dane do komórek pamec, na które pokazuje wskaźnk w. Zadane Prześledź pokazane rysunk bardzo uważne. Wskaźnk sa nezmerne stotnym elementem jezyka C++.

4.1. DYNAMICZNA ALOKACJA PAMIECI 4 1: nt x, y; 2: nt w; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*)? (nt)? (nt)? 3: w = &x; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*) 0xdf590500 (nt)? (nt)? 4: w = 1; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*) 0xdf590500 (nt)? (nt) 1 5: w = &y; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*) 0xdf590504 (nt)? (nt) 1 6: w = 2; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*) 0xdf590504 (nt) 2 (nt) 1 Rys. 4.3. Zawartość pam ec po wykonanu kolejnych nstrukcj z lstngu 4.2

4.1. DYNAMICZNA ALOKACJA PAMIECI 5 Przyk lad z rozdz. 3 (cd.). W poprzednm rozdzale rozważalśmy funkcje, która s luży la do zamany wartośc dwóch zmennych ca lkowtych. Przypomnjmy, że prawd lowe rozwazane tego problemu wymaga lo użyca ne argumentów przekazanych przez wartość, ale przez referencje. Równe skutecznym, acz w tym wypadku może neco mnej eleganckm, jest użyce w tym przypadku wskaźnków. 1 vod zamen ( nt x, nt y) { 2 nt t = x; 3 x = y; 4 y = t; 5 } 6 7 nt man () { 8 nt n = 1, m = 2; 9 zamen (&n, &m); // p r z e k a z a n e argumentów p r z e z w s k a ź n k 10 cout << n << ", " << m << endl ; 11 return 0; 12 } Dzek temu, że przekazalśmy funkcj zamen() adresy zmennych zadeklarowanych w funkcj man(), możemy ne tylko odczytywać, ale nadpsywać tutaj ch wartośc. Omnelśmy tym samym ogranczena przekazywana argumentów przez wartość (kopowane) dostep do orygnalnych zmennych mamy tutaj w sposób pośredn, tj. za pomoca operatora wy luskana. Cekawostka Pam etamy, że aby dostać s e do konkretnego pola struktury, należy użyć operatora. (kropk). Jeśl mamy dost ep do wskaźnka na struktur e, możemy użyć do tego celu operatora >. struct Punkt { double x; double y; }; //... ( np. man ( ) )... Punkt p; Punkt wp = &p; // w s k a ź n k na p wp >x = 1.0; // t o samo, co ( wp ). x = 1. 0 d r u g e m n e j wygodne wp >y = 2.0; // t o samo, co ( wp ). y = 2. 0 //... 4.1.3. Przydza l zwalnane pamec ze sterty Oprócz ścśle określonej na etape psana programu lośc danych na stose, można równeż dysponować pamec a na sterce, por. s. 1. Mejsce na nasze dane może być przydzelane (alokowane) dynamczne podczas dza lana programu za pomoca operatora new. Po użycu należy je zwolnć za pomoca operatora delete.

4.1. DYNAMICZNA ALOKACJA PAMIECI 6 Zapam etaj Zaalokowany obekt bedze stna l w pamec nawet po wyjścu z funkcj, w której go stworzylśmy! Dlatego należy pametać, aby go usunać w pewnym mejscu kodu. Oto, w jak sposób możemy dokonać alokacj dealokacj pam ec dla jednego obektu. typ obekt = new typ ; // a l o k a c j a ( new z w r a c a w s k a ź n k na p r z y d z e l o n e m e j s c e w p a m e c ) //... delete obekt ; // z w o l n e n e p a m e c Co bardzo ważne, możemy w ten sposób równeż przydzelć pameć na wele obektów nastepuj acych kolejno po sobe. nt n = 4; typ obekt = new typ [n]; // a l o k a c j a ( z w r a c a w s k a ź n k na p e r w s z y z o b e k t ó w ) //... delete [] obekt ; // uwaga na,, [ ] w e l e o b e k t ó w! Za pomoca powyższego kodu utworzylśmy cag obektów określonego typu, czyl naczej tablce. 4.1.4. Tablce Do tej pory przechowywalśmy dane używajac pojedynczych zmennych. By ly to tzw. zmenne skalarne (atomowe). Pojedyncza zmenna odpowada la jednej jednostce nformacj (lczbe, wartośc logcznej, z lożonej strukturze, wskaźnkow). Czesto jednak w naszych programach bedze zachodzć potrzeba rozważena cagu n zmennych tego samego typu, gdze n nekoneczne mus być znane z góry. Dla przyk ladu, rozważmy fragment programu dokonujacy podsumowana rocznych zarobków pewnego dość obrotnego studenta. 1 double zarobk1, zarobk2, /... /, zarobk12 ; 2 // d e k l a r a c j a 12 z m e n n y c h 3 zarobk1 = 1399.0; // s t y c z e ń 4 zarobk2 = 1493.0; // l u t y 5 //... 6 zarobk12 = 999.99; // g r u d z e ń 7 8 double suma = 0. 0; 9 suma += zarobk1 ; 10 suma += zarobk2 ; 11 //... 12 suma += zarobk12 ; 13 14 cout << " Zarobłem w 2012 r. " << suma << " zł."; Dochód z każdego mesaca przechowywany jest w oddzelnej zmennej. Netrudno zauważyć, że operowane na nch ne jest zbyt wygodne. Ma lo tego, dość żmudne by loby rozszerzane funkcjonalnośc takego programu na przypadek obejmujacy podsumowane np. zarobków z 2,3,... lat.

4.1. DYNAMICZNA ALOKACJA PAMIECI 7 Rozwazane tego problemu może być jednak bardzo czytelne zapsane z użycem dynamczne alokowanych tablc, które sa reprezentacja znanych nam obektów matematycznych: cagów skończonych badź wektorów. Wemy, że za pomoca operatora new możemy przydzelć pameć dla n 1 obektów określonego typu. Operator ten zwraca wskaźnk na perwszy element takego cagu. Pozostaje tylko odpowedzeć sobe na pytane, w jak sposób możemy se dostać do kolejnych elementów. double zarobk = new double [ 12]; // z a r o b k w s k a z n k na p e r w s z y e l e m e n t c a g u zarobk = 1399.0; // wprowadź z a r o b k w p e r w s z y m m e s a c u // co d a l e j? delete [] zarobk ; // z w o l n e n e p a m e c Przypomnjmy, wskaźnk jest po prawdze lczba ca lkowta. Okazuje se, że zosta la określona na nm operacja dodawana. I tak zarobk+, gdze jest lczba ca lkowta neujemna, oznacza podaj adres -tego obektu z cagu. Tym samym zarobk+0 jest tym samym, co po prostu zarobk (adresem perwszego elementu), a zarobk+n 1, adresem ostatnego elementu z n-elementowego cagu. Wobec powyższego, fragment perwotnej wersj programu zwazany z wprowadzenem zarobków możemy zapsać w nastepuj acy sposób: double zarobk = new double [ 12]; // z a r o b k w s k a z n k na p e r w s z y e l e m e n t c a g u ( zarobk +0) = 1399.0; // wprowadź z a r o b k w p e r w s z y m m e s a c u ( zarobk +1) = 1493.0; // wprowadź z a r o b k w drugm m e s a c u //... ( zarobk +11) = 999.99; // wprowadź z a r o b k w o s t a t n m m e s a c u //... delete [] zarobk ; // z w o l n e n e p a m e c Zapam etaj Wygodnejszy dostep do poszczególnych elementów tablcy możemy uzyskać za pomoca operatora ndeksowana, [ ]. Jeśl t jest tablca (a ścślej: wskaźnkem na perwszy element cagu obektów przydzelonych dynamczne), to (t+) możemy zapsać równoważne przez t[]. Elementy tablcy sa numerowane od 0 do n 1, gdze n to rozmar tablcy. Operator ndeksowana przyjmuje za argument dowolna wartość ca lkowta (np. sta l a badź wyrażene arytmetyczne). Każdy element tablcy traktujemy tak, jakby by l zwyk l a zmenna taka, z która do tej pory melśmy do czynena. Informacja W jezyku C++ ne ma mechanzmów sprawdzana poprawnośc ndeksów! Nastepu- jacy kod być może (ne wadomo) ne spowoduje b l edu natychmast po uruchomenu. 1 nt t = new nt [5]; 2 t[ 100] = 15123; // : ( 3 t [10000] = 25326; // : ( 4 delete [] t;

4.1. DYNAMICZNA ALOKACJA PAMIECI 8 Powyższe nstrukcje jednak zmenaja wartośc komórek pamec reprezentujacych dane nnych obektów. Skutk tego dza lana moga se objawć w nnym mejscu programu, powodujac neprzewdywalne trudne do wykryca b l edy. Cekawostka Nech t bedze wskaźnkem na pewen typ. Zauważmy, że zaps t+ ne oznacza koneczne, że chodz nam o adres przechowywany w zmennej wskaźnkowej t plus jeden bajt. Operacja dodawana berze pod uwage typ zmennej wskaźnkowej dokonuje przesuneca adresu o welokrotność lczby bajtów, które zajmuje w pamec jedna zmenna typu typ. Możemy to sprawdzć np. w nastepuj acy sposób. 1 nt t = new nt [3]; // u n a s n t t o 4 b a j t y 2 cout << t; // np. 0 x 9 b64e300 t o samo, co c o u t << &t [ 0 ] ; 3 cout << t +1; // np. 0 x 9 b64e304 t o samo, co c o u t << &t [ 1 ] ; 4 cout << t +2; // np. 0 x 9 b64e308 t o samo, co c o u t << &t [ 2 ] ; 5 t [0] = 1; 6 t [1] = 2; 7 t [2] = 3; 8 delete [] t; Kolejne elementy tablcy w pamec zawsze nastepuj a po sobe, co lustruje ponższy rysunek. t t[2] 0x9b64e308 t[1] 0x9b64e304 t[0] 0x9b64e300 (nt) 3 (nt) 2 (nt) 1 Jesteśmy już gotow, by napsać fragment programu do sumowana zarobków naszego koleg. Tym razem ne bedzemy zak ladać, że lczba mesecy jest określona z góry. Tutaj bedzemy ja wprowadzać z klawatury. 1 nt n; 2 cout << " Ile mesęcy? "; 3 cn >> n; 4 assert (n >0) ; // wymaga <c a s s e r t > 5 6 double zarobk = new double [ n]; 7 8 for ( nt =0; <n; ++) { 9 cout << " Podaj zarobk w mesącu nr " << << ": "; 10 cn >> zarobk []; // t o samo, co c n >> ( z a r o b k + ) ; 11 } 12 13 // t u t a j możemy np. wygenerować l a d n e z e s t a w e n e

4.1. DYNAMICZNA ALOKACJA PAMIECI 9 14 // wprowadzonych danych t p. 15 for ( nt =0; <n; ++) 16 cout << << ": " << zarobk [ ] << endl ; 17 18 // p o l c z m y sum e : 19 double suma = 0. 0; 20 for ( nt =0; <n; ++) 21 suma += zarobk []; 22 23 cout << " Zarobłem w 2012 r. " << suma << " zł."; 24 25 delete [] zarobk ; Cekawostka W jezyku C++ można także deklarować tablce o ustalonym z góry, sta lym rozmarze (na stose). Ich zaleta jest możlwość ustalena wartośc ch elementów podczas deklaracj, co może poprawać czytelność programów demonstrujacych mplementacje pewnych szczególnych algorytmów. 1 nt t [3] = {1, 2, 3}; // d e k l a r a c j a t a b l c y n c j o w a n e w a r t o ś c 2 // t w c a ż j e s t w s k a ź n k e m na p e r w s z y e l e m e n t : 3 // używamy go tak, j a k w p r z y p a d k u t a b l c y d y n a m c z n e a l o k o w a n e j 4 //... 5 // n e s t o s u j e m y d e l e t e! ( bo n e b y l o new ) Jednak w przypadku dużej klasy problemów ch mplementacja z użycem tablc o zadanym rozmarze wydaje s e ma lo naturalna s labo skalowalna wzgl edem rozmaru problemu. 4.1.5. Przekazywane tablc funkcjom Podsumujmy: tablca to cag obektów tego samego typu po lożonych w pamec kolejno, jeden po drugm. Dostep do elementów tablcy mamy zapewnony przez wskaźnk na perwszy z tych obektów. Obekty typu wskaźnkowego możemy przekazywać funkcjom tak, jak zwyk le zmenne skalarne. Wobec tego, aby można by lo napsać funkcje, która w jakś sposób przetwarza dane zawarte w tablcy, należy dodatkowo przekazać jej nformacje o tym, le jest elementów w tablcy, czyl jej rozmar. Cekawostka W rozdzale 5 poznamy nny sposób nformowana funkcj, gdze znajduje se ostatn element tablcy. Za lożymy wtedy, że ostatnm elementem cagu jest pewna specjalna wyróżnona wartość, (tzw. wartownk) która ne pojawa se jako zwyk ly element gdze ndzej. Wówczas wystarczy nam tylko nformacja na temat po lożena perwszego elementu tablcy. Jej konec bowem bedzemy mogl sam sobe znaleźć.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 10 Przyk lad. Funkcja wyznaczajaca sume wartośc elementów z podanej tablcy. 1 double suma ( double const t, nt n) 2 { // d o s t e p do elementów t t y l k o do o d c z y t u 3 assert (n > 0); 4 double s = 0. 0; 5 for ( nt =0; <n; ++) 6 s += t[]; 7 return s; 8 } 9 10 nt man ( vod ) 11 { 12 nt le = 10; 13 double punkty = new double [ le ]; 14 for ( nt =0; <le ; ++) 15 cn >> punkty []; 16 cout << suma ( punkty, le ); // p r z e k a z a n e t a b l c y do f u n k c j 17 delete [] punkty ; 18 return 0; 19 } Na margnese, zauważmy, że funkcja suma() ne ma żadnych efektów ubocznych. Ne wypsuje nc na ekran an o nc ne pyta se użytkownka. Wyznacza tylko wartość sumy elementów zawartych w tablcy czyl tylko to, czego użytkownk (funkcja man()) może se po nej spodzewać. Ponadto zaps double const zapewna, że elementów danej tablcy ne można zmenać. Jest to tzw. wskaźnk na wartośc sta le. 4.2. Proste algorytmy sortowana tablc Zadane Wyobraź sobe, le czasu zaje loby C znalezene has la w s lownku (chodz oczywśce o s lownk ksażkowy), gdyby redaktorzy przyjelby losowa kolejność wyrazów. Przeanalzuj z jakego algorytmu korzystasz wyszukuj ac to, co Ce nteresuje. Rozważymy teraz problem sortowana tablc jednowymarowych, który jest stotny w welu zastosowanach, zarówno teoretycznych jak praktycznych. Dzek odpowednemu uporzadkowanu elementów nektóre algorytmy (np. wyszukwana) moga dza lać szybcej, moga być prostsze w napsanu czy też można latwej formalne udowodnć ch poprawność. Co wecej, stneje wcale nema lo zagadneń, które wprost wymagaja pewnego uporzad- kowana danych które bez takej operacj wcale ne maja sensu. Zadane Przyk ladowo, rozważmy w jak sposób wyszukujemy nteresujace nas strony nternetowe. Wekszość wyszukwarek dza la w nastepuj acy sposób.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 11 1. Znajdź wszystke strony w baze danych, które zaweraja podane przez użytkownka s lowa kluczowe (np. kaszel, goraczka objawy ). 2. Oceń każda znalezona strone pod wzgledem pewnej mary adekwatnośc/popularnośc- /jakośc. 3. Posortuj wynk zgodne z ocenam (od najlepszej do najgorszej ) pokaż ch lste użytkownkow. Warto przypomneć, że o rynkowym sukcese wyszukwark Google zadecydowa lo to, że w przecweństwe do ówczesnych konkurencyjnych serwsów zwraca la ona wynk w dość pożytecznej dla w ekszośc osób kolejnośc. Problem sortowana, w swej najprostszej postac, można sformalzować w nastepuj acy sposób. Dana jest tablca t rozmaru n zawerajaca elementy, które można porównywać za pomoca operatora relacyjnego <=. Należy zmenć kolejność (tj. dokonać permutacj, uporzadkowana) elementów t tak, by zachodz ly warunk: t[0] <= t[1], t[1] <= t[2],..., t[n 2] <= t[n 1]. Cekawostka Zauważmy, że rozwazane takego problemu wcale ne mus być jednoznaczne. Dla tablc zawerajacych elementy t[] t[j] take, że dla j zachodz t[] <= t[j] oraz t[j] <= t[], tj. t[] == t[j], może stneje wecej nż jedna permutacja spe lnajaca powyższe warunk. Algorytm sortowana nazwemy stablnym, jeśl wzgledna kolejność elementów o tej samej wartośc zostaje zachowana po posortowanu. W lasność ta jest przydatna w przypadku sortowana obektów z lożonych za pomoca wecej nż jednego kryterum na raz. W nnejszym paragrafe omówmy trzy algorytmy sortowana: 1. sortowane przez wybór, 2. sortowane przez wstawane, 3. sortowane babelkowe. Algorytmy te cechuja se tym, że w pesymstycznym ( najgorszym ) przypadku lczba operacj porównań elementów tablcy jest proporcjonalna do n 2 (zob. dalej, podrozdz. 4.2.4). Bardzej wydajne, co za tym dze, bardzej z lożone algorytmy sortowana bed a omówone w semestrze III (np. sortowane szybke, przez l aczene, przez kopcowane). Nektóre z nch wymagaja co najwyżej kn log n porównań dla pewnego k. Dzek temu dla tablc o dużym rozmarze dza laj a naprawde szybko.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 12 4.2.1. Sortowane przez wybór W algorytme sortowana przez wybór (ang. selecton sort) dokonujemy za każdym razem wyboru elementu najmnejszego spośród do tej pory neposortowanych, pók ca la tablca ne zostane uporzadkowana. Idee te przedstawa nastepuj acy pseudokod: dla =0,1,...,n 2 { // t [ 0 ],..., t [ 1] s a j u ż u p o r za d k o w a n e wzgledem r e l a c j <= // ( nadto, s a j u ż na s w o c h o s t a t e c z n y c h m e j s c a c h ) j = ndeks najmnejszego elementu spośród t[],..., t[n 1]; zameń elementy t[] t[j]; } Jako przyk lad rozważmy, krok po kroku, przebeg sortowana cagu lczb naturalnych (4,1,3,5,2). Kolejne teracje dza lana tego algorytmu lustruja rys. 4.4 4.8. 1. W kroku I (rys. 4.4) mamy ==0. Dokonujac wyboru elementu najmnejszego spośród t[0],..., t[4] otrzymujemy j==1. Zamenamy wec elementy t[0] t[1] mejscam. 2. W kroku II (rys. 4.5) mamy ==1. Wybór najmnejszego elementu wśród t[1],..., t[4] daje j==4 Zamenamy mejscam zatem t[1] t[4]. 3. Dalej (rys. 4.6), ==2. Elementem najmnejszym spośród t[2],..., t[4] jest t[j] dla j==2 Zamenamy mejscam zatem nezbyt sensowne t[2] t[2]. Komputer, na szcześce, zrob to bez grymasu. 4. W ostatnm kroku (rys. 4.7) ==3 j==4, dzek czemu możemy uzyskać ostateczne rozwazane (rys. 4.8).

4 1 3 5 2 4 1 3 5 2 1 4 3 5 2 j Rys. 4.4. Sortowane przez wybór przyk lad teracja I 1 4 3 5 2 1 4 3 5 2 1 2 3 5 4 j Rys. 4.5. Sortowane przez wybór przyk lad teracja II 1 2 3 5 4 1 2 3 5 4 1 2 3 5 4 j Rys. 4.6. Sortowane przez wybór przyk lad teracja III 4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 13

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 14 1 2 3 5 4 1 2 3 5 4 j Rys. 4.7. Sortowane przez wybór przyk lad teracja IV 1 2 3 4 5 Rys. 4.8. Sortowane przez wybór przyk lad rozw azane 1 2 3 4 5

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 15 4.2.2. Sortowane przez wstawane Algorytm sortowana przez wstawane (ang. nserton sort) jest metoda czesto stosowana w praktyce do porzadkowana ma lej lczby elementów (do ok. 20 30) ze wzgledu na swa prostote szybkość dza lana. W nnejszej metodze w -tym kroku elementy t[0],..., t[ 1] sa już wstepne uporzadkowane wzgledem relacj <=. Pomedzy ne wstawamy t[] tak, by ne zaburzyć porzadku. Formalne rzecz ujmujac, dea ta może być wyrażona za pomoca pseudokodu: dla =1,2,...,n 1 { // t [ 0 ],..., t [ 1] s a w s t e p n e u p o r za d k o w a n e wzgledem <= // ( a l e n e k o n e c z n e j e s t t o c h o s t a t e c z n e m e j s c e ) j = ndeks takego elementu spośród t [0],..., t[], że t[u] <= t[] dla każdego u < j oraz t[] < t[v] dla każdego v j; jeśl (j < ) wstaw t[] przed t[j]; } gdze przez operacje wstaw t[] przed t[j], dla 0 j < rozumemy cag dza lań, majacy na celu przestawene kolejnośc elementów tablcy: t[0]... t[j 1] t[j]... t[ 1] t[] t[+1]... t[n 1] tak, by uzyskać: t[0]... t[j 1] t[] t[j]... t[ 1] t[+1]... t[n 1] Powyższy pseudokod może być wyrażony w nastepuj acej równoważnej forme: dla =1,2,...,n 1 { // t [ 0 ],..., t [ 1] s a u p o r za d k o w a n e wzgledem <= // ( a l e n e k o n e c z n e j e s t t o c h o s t a t e c z n e m e j s c e ) znajdź najwększe j ze zboru {0,..., } take, że j == 0 lub t[j 1] <= t[]; jeśl (j < ) wstaw t[] przed t[j]; } Jako przyk lad rozpatrzmy znów cag lczb naturalnych (4,1,3,5,2). Przebeg kolejnych wykonywanych kroków przedstawaja rys. 4.9 4.12. Cekawostka Można pokazać, że tak sformu lowany algorytm jest stablny. Prześledź jego dza lane np. dla cagu (2, 4, 2, 5, 1, 3) (dla czytelnośc te same elementy wyróżnlśmy, by wskazać ch perwotny porzadek). Porównaj uzyskany wynk z tym, który można uzyskać za pomoca algorytmu sortowana przez wybór.

4 1 3 5 2 4 1 3 5 2 1 4 3 5 2 j Rys. 4.9. Sortowane przez wstawane przyk lad teracja I 1 4 3 5 2 1 4 3 5 2 1 3 4 5 2 j Rys. 4.10. Sortowane przez wstawane przyk lad teracja II 1 3 4 5 2 1 3 4 5 2 1 3 4 5 2 j Rys. 4.11. Sortowane przez wstawane przyk lad teracja III 4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 16

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 17 1 3 4 5 2 1 3 4 5 2 1 2 3 4 5 j Rys. 4.12. Sortowane przez wstawane przyk lad teracja IV

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 18 4.2.3. Sortowane babelkowe Sortowane babelkowe (ang. bubble sort) jest nteresujacym przyk ladem algorytmu pojawajacego se w wekszośc podrecznków akademckch dotyczacych podstawowych sposobów sortowana tablc, którego prawe wcale ne stosuje se w praktyce. Jego wydajność jest bowem bardzo s laba w porównanu do dwóch metod opsanych powyżej. Z drugej strony, posada on sympatyczna hydrologczna (nautyczna?) nterpretacje, która urzeka welu wyk ladowców, w tym skromnego autora nnejszej ksażeczk. Tak umotywowan, przystapmy wec do zapoznana se z nm. W tym algorytme porównywane sa tylko elementy ze soba bezpośredno sasaduj ace. Jeśl okaże se, że ne zachowuja one odpowednej kolejnośc wzgledem relacj <=, element ceższy wypychany jest w góre, nczym pecherzyk powetrza (tytu lowy b abelek) pod powerzchna wody. A oto pseudokod: dla =n 1,...,1 { dla j =0,..., 1 { } // p o r ó w n u j e l e m e n t y p a r a m jeśl (t[j] > t[j +1]) zameń t[j] t[j +1]; // t z n. w y p c h n j c e ż s z e g o b a b e l k a w g ó r e } // t u t a j e l e m e n t y t [ ],..., t [ n 1] s a j u ż na s w o c h m e j s c a c h Dla przyk ladu rozpatrzmy ponowne tablce (4,1,3,5,2). Przebeg kolejnych wykonywanych kroków przedstawaja rys. 4.13 4.17. Cekawostka Ten algorytm równeż jest stablny.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 19 4 1 3 5 2? 4 1 3 5 2 j? 1 4 3 5 2 j? 1 3 4 5 2 j? 1 3 4 5 2 j Rys. 4.13. Sortowane babelkowe przyk lad krok I

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 20 1 3 4 2 5? 1 3 4 2 5 j? 1 3 4 2 5 j 1 3 4 2 5? j Rys. 4.14. Sortowane babelkowe przyk lad krok II

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 21 1 3 2 4 5? 1 3 2 4 5 j? 1 3 2 4 5 j Rys. 4.15. Sortowane babelkowe przyk lad krok III

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 22 1 2 3 4 5? 1 2 3 4 5 j Rys. 4.16. Sortowane babelkowe przyk lad krok IV 1 2 3 4 5 Rys. 4.17. Sortowane babelkowe przyk lad rozwazane

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 23 4.2.4. Efektywność oblczenowa Rozważajac algorytmy sortowana w sposób oczywsty obserwujemy wspomnane w perwszym rozdzale zjawsko jeden problem wele algorytmów. Rzecz jasna, trzy podane wyżej algorytmy (co zreszta zosta lo zapowedzane) ne wyczerpuja wszystkch możlwośc rozwazana zagadnena sortowana tablc jednowymarowych. Nasuwa se wec pytane: skoro każda z metod znajduje rozwazane danego problemu w poprawny sposób, jake przes lank pownny nam kerować przy wyborze algorytmu w zastosowanach praktycznych? Lenuszk z pewnośc a wybra lyby algorytm najprostszy w mplementacj. Domyślamy se jednak, że ne jest to zbyt roztropne kryterum. W tzw. analze algorytmów wyróżna s e dwe najważnejsze mary efektywnośc oblczenowej: 1. z lożoność czasowa czyl lczbe tzw. operacj znaczacych (zależna od danego problemu; moga to być przestawena, porównana, operacje arytmetyczne tp.) potrzebnych do rozwazana danego zagadnena, 2. z lożoność pamecowa czyl lość dodatkowej pamec potrzebnej do rozwazana problemu. Zauważmy, że w przypadku przedstawonych wyżej algorytmów, oprócz danej tablcy która należy posortować klku zmennych pomocnczych ne jest potrzebna żadna dodatkowa lczba komórek pamec komputera (w przypadku bardzej z lożonych metod omawanych w sem. III bedze jednak naczej, np. koneczne bedze użyce jeszcze jednej tablcy). Skupmy se wec teraz tylko na omówenu z lożonośc czasowej. Przyjrzyjmy se zatem przyk ladowym mplementacjom dwóch algorytmów dla danej tablcy t rozmaru n. Oto kod stosujacy sortowane przez wybór: 1 // S o r t o w a n e p r z e z wybór : 2 for ( nt =0; <n 1; ++) 3 { 4 // z n a j d ź n d e k s najmn. e l. s p o ś r ó d t [ ],..., t [ n 1 ] ; 5 nt j = ; 6 for ( nt k= +1; k<n; ++k) 7 f (t[k] < t[j]) // p o r ó w n a n e elementów 8 j = k; 9 10 // zamana 11 nt p = t[]; 12 t[] = t[j]; 13 t[j] = p; 14 } A oto kod sortujacy tablce babelkowo : 1 // S o r t o w a n e b a b e l k o w e : 2 for ( nt =n 1; >0; ) 3 { 4 for ( nt j =0; j<; ++j) 5 { 6 f (t[j] > t[j +1]) // p o r o w n a n e p a r a m 7 { 8 nt p = t[j]; // zamana 9 t[j] = t[j +1];

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 24 10 t[j +1] = p; 11 } 12 } 13 } Po perwsze, musmy podkreślć, ż formalne rzecz borac z lożoność czasowa wyznacza se ne dla abstrakcyjnego algorytmu, tylko dla jego konkretnej mplementacj. Implementacja zależna jest, rzecz jasna, od stosowanego jezyka programowana zdolnośc programsty. Ne pownno to nas dzwć, poneważ np. za wysokm pozom abstrakcj stosowanym czesto w pseudokodach może kryć se naprawde wele skomplkowanych nstrukcj jezyka programowana. Po druge, zauważmy, że z lożoność jest najcześcej zależna od danych wejścowych. W naszym przypadku jest to ne tylko rozmar tablcy, n, ale także jej wstepne uporzad- kowane. Z tego też powodu lczbe operacj znaczacych pownno podawać se w postac funkcj rozmaru zboru danych wejścowych (u nas jest to po prostu n) w różnych sytuacjach, najcześcej co najmnej: 1. w przypadku pesymstycznym, czyl dla danych, dla których mplementacja algorytmu mus wykonać najwecej operacj znaczacych, 2. w przypadku optymstycznym, czyl gdy dane wejścowe mnmalzuja lczbe potrzebnych operacj znaczacych. Cekawostka Celowość przeprowadzena badana przypadków pesymstycznych optymstycznych pozostaje przeważne poza dyskusja. Czasem także bada se tzw. z lożoność czasowa oczekwana (średna), zak ladajac, że dane maja np. tzw. rozk lad jednostajny (w naszym przypadku znaczy loby to, że prawdopodobeństwo pojawena se każdej możlwej permutacj cagu wejścowego jest take samo). Oczywśce watplwośc może tutaj budzć, czy tak dobór rozk ladu jest adekwatny, s lowem czy rzeczywśce modeluje to, co zdarza se w praktyce. Ne zmena to jednak faktu, że jest to zagadnene bardzo cekawe warte rozważana. Wymaga ono jednak dość rozbudowanego aparatu matematycznego, którym nestety jeszcze ne dysponujemy. Netrudno zauważyć, że w przypadku przedstawonych wyżej mplementacj algorytmów przypadkem optymstycznym jest tablca już posortowana (np. (1, 2, 3, 4, 5)), a przypadkem pesymstycznym tablca posortowana odwrotne (np. (5, 4, 3, 2, 1)). Pozostaje nam już tylko wyróżnć, co możemy rozumeć w danych przyk ladach za operacje znaczace oraz dokonać stosowne oblczena. Wydaje se, że najrozsadnej bedze rozważyć lczbe potrzebnych przestaweń elementów oraz lczbe ch porównań rzecz jasna, w zależnośc od n. 1. Analza lczby porównań elementów. 1. Sortowane przez wybór. Zauważamy, że lczba porównań ne jest zależna od wstepnego uporzadkowana elementów tablcy. Jest ona zawsze równa (n 1) + (n 2) + + 1 = n(n 1)/2 = n 2 /2 n/2.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 25 2. Sortowane babelkowe. Jak wyżej, lczba porównań ne jest zależna od wstepnego uporzadkowana elementów tablcy. Uzyskujemy wartość (n 1) + (n 2) + + 1 = n 2 /2 n/2. Obydwe mplementacje algorytmów ne różna se lczba potrzebnych porównań. Sa zatem tak samo dobre (badź tak samo z le) pod wzgledem tego kryterum. Zauważmy, że lczba ta jest proporcjonalna do n 2 (naczej jest rzedu n 2 ). 2. Analza lczby przestaweń elementów. 1. Sortowane przez wybór. (a) Przypadek pesymstyczny. Lczba potrzebnych przestaweń wynos n 1. (b) Przypadek optymstyczny. Lczba potrzebnych przestaweń wynos 0. 2. Sortowane babelkowe. (a) Przypadek pesymstyczny. Lczba potrzebnych przestaweń wynos n(n 1)/2. (b) Przypadek optymstyczny. Lczba potrzebnych przestaweń wynos 0. Okazuje se, że w najgorszym przypadku lczba potrzebnych przestaweń elementów dla naszej mplementacj algorytmu sortowana przez wybór jest proporcjonalna do n, a dla sortowana babelkowego jest aż rzedu n 2! Tablca 4.1 zestawa lczbe potrzebnych przestaweń elementów powyższych algorytmów uzyskane na komputerze autora nnejszego opracowana czasy dza lana (w sekundach, tablce o elementach typu nt). Zauważamy, że użyce powyższych algorytmów już dla n > 100000 ne jest dobrym pomys lem (na szcześce, stneja lepsze, naprawde szybke sposoby rozwazana problemu sortowana). Ponadto, sama lczba przestaweń ne t lumaczy czasu wykonana oblczeń (dlatego koneczne by lo także zbadane lczby potrzebnych porównań). Tab. 4.1. Porównane lczby potrzebnych przestaweń elementów czasów dza lana dwóch algorytmów sortowana w przypadku pesymstycznym Lczba przestaweń Czas [s] n Selecton Bubble Selecton Bubble 100 99 4950 0.01 0.01 1000 999 499500 0.01 0.01 10000 9999 49995000 0.05 0.10 100000 99999 4999950000 6.02 10.31 1000000 999999 499999500000 631.38 1003.60

4.3. ĆWICZENIA 26 4.3. Ćwczena Zadane 4.1. Napsz funkcje, która za pomoca tylko jednej petl for znajduje wypsuje na ekran element najmnejszy element najwekszy danej tablcy lczb ca lkowtych. Zadane 4.2. Napsz funkcje, która za pomoca tylko jednej petl for wyznaczy zwróc trzec najwekszy element z danej 3 n-elementowej tablcy lczb ca lkowtych, np. dla cagu (3.0, 5.0, 2.0, 4.0, 1.0, 6.0) bedze to 4.0. Zadane 4.3. Nech dany bedze n-elementowy cag lczb rzeczywstych x = (x 1, x 2,..., x n ). Średna ważona (ang. weghted mean) wzgledem neujemnego wektora wag w = (w 1, w 2,..., w n ) takego, że n =1 w = 1, nazywamy wartość WM w (x) = n =1 x w. Napsz funkcje, który wyznaczy wartość WM danego cagu wzgledem danego neujemnego wektora, który przed oblczenam należy unormować tak, by jego elementy sumowa ly se do 1. Zadane 4.4. Dana jest tablca t sk ladajaca se z lczb ca lkowtych od 0 do 19. Napsz funkcje, która wyznaczy jej domnante (mode), czyl najcześcej pojawajac a se wartość. Wskazówka. Skorzystaj z pomocnczej, 20-elementowej tablcy, za pomoca której zlczysz, le razy w tablcy t wystepuje każda możlwa wartość. Tablca pownna być zancjowana zeram. Nastepne należy znaleźć jej maksmum. Zadane 4.5. Uogólnj funkcj e z zad. 4.4 tak, by dza la la ne tylko dla tablc o elementach ze zboru {0, 1,..., 19}, ale dla dowolnego {a, a + 1,..., b}. Zadane 4.6. Sortowane kube lkowe. Dana jest n-elementowa tablca t wype lnona lczbam naturalnym ze zboru {1, 2,..., k} dla pewnego k. Napsz funkcje, która za pomoca tzw. sortowana kube lkowego uporzadkuje w kolejnośc nemalejacej elementy z t. W algorytme sortowana kube lkowego korzystamy z k-elementowej tablcy pomocnczej, która s luży do zlczana lczby wystapeń każdej z k wartośc elementów z t. Na poczatku tablca pomocncza jest wype lnona zeram. Należy rozpatrywać kolejno każdy element tablcy t, za każdym razem zwekszaj ac o 1 wartość odpowednej komórk tablcy pomocnczej. Dla przyk ladu, za lóżmy n = 6, k = 4 oraz że dana jest tablca t o elementach (4, 3, 2, 4, 4, 2). Tablca pomocncza pownna pos lużyć do uzyskana nformacj, że w t jest 0 elementów równych 1, 2 elementy równe 2, 1 element równy 3 oraz 3 elementy równe 4. Na podstawe tej wedzy można zastapć elementy tablcy t kolejno wartoścam (2, 2, 3, 4, 4, 4), tym samym otrzymujac w wynku posortowana tablce. Zadane 4.7. Dane sa dwe lczby ca lkowte w systeme dzesetnym: n-cyfrowa lczba reprezentowana za pomoca tablcy a oraz m-cyfrowa reprezentowana za pomoca tablcy b, gdze n > m. Każda cyfra zajmuje osobna komórke tablcy. Cyfry zapsane sa w kolejnośc od najm lodszej do najstarszej, tzn. element o ndekse 0 oznacza jednośc, 1 dzesatk td., przy czym najstarsza cyfra jest różna od 0. Napsz funkcje, która utworzy nowa, dynamczne alokowana tablce reprezentujac a wynk odejmowana lczb a b. Zadane 4.8. Dane sa dwe lczby ca lkowte w systeme dzesetnym reprezentowane za pomoca dwóch tablc a b o rozmarze n > 1. Każda cyfra zajmuje osobna komórke tablcy. Cyfry zapsane sa w kolejnośc od najm lodszej do najstarszej, tzn. element o ndekse 0 oznacza jednośc, 1 dzesatk td., przy czym najstarsza cyfra jest różna od 0. Napsz funkcje, która zwróc tablce reprezentujac a wynk dodawana lczb a b. Zadane 4.9. Utwórz strukture o nazwe DzenMesac zawerajac a dwa pola typu ca lkowtego: dzen mesac. Nastepne stwórz funkcje poprawnedaty(), która dla danej tablcy o elementach typu DzenMesac zwróc wartość logczna true wtedy tylko wtedy, gdy każdy jej element określa prawd low a date w roku neprzestepnym. Zadane 4.10. Zmodyfkuj funkcje z zad. 4.9 tak, by przyjmowa la jako argument także rok. Sprawdzane daty tym razem ma uwzglednać, czy dany rok jest przestepny.

4.3. ĆWICZENIA 27 Zadane 4.11. Dany jest weloman rzeczywsty stopna n > 0 którego wspó lczynnk przechowywane sa w (n + 1-elementowej tablcy w tak, że zachodz w(x) = w[0]x 0 + w[1]x 1 +... w[n]x n, w[n] 0. Napsz funkcje, która zwróc wartość w(x) dla danego x. Zadane 4.12. Zmodyfkuj funkcj e z zad. 4.11 tak, by korzysta la z bardzej efektywnego oblczenowo wzoru na wartość w(x), zwanego schematem Hornera: w(x) = ( (((w[n]x + w[n 1]) x + w[n 2]) x + w[n 3]) ) x + w[0]. Zadane 4.13. Nech dane bed a welomany w(x) v(x) stopna, odpowedno, n m. Napsz funkcje, która wyznaczy wartośc wspó lczynnków welomanu u(x) stopna n + m, bed acego loczynem welomanów w v. Zadane 4.14. Dane sa dwe uporzadkowane nemalejaco tablce lczb ca lkowtych x y rozmarów, odpowedno, n m. Napsz funkcje, który zwróc uporzadkowan a nemalejaco tablce rozmaru n + m powsta l a ze scalena tablc x y. Algorytm pownen meć lnowa (rzedu n + m) pesymstyczna z lożoność czasowa. Np. dla x = (1, 4, 5) y = (0, 2, 3) pownnśmy otrzymać (0, 1, 2, 3, 4, 5). Zadane 4.15. Dana jest n-elementowa, już posortowana tablca lczb ca lkowtych oraz lczba ca lkowta x. Napsz funkcje, która za pomoca wyszukwana bnarnego (po lówkowego) sprawdz, czy wartość x jest elementem tablcy jeśl tak, to poda pod którym ndeksem tablcy se znajduje badź zwróc -1 w przecwnym przypadku. Zadane 4.16. Zamplementuj w postac funkcj algorytm sortowana babelkowego danej tablcy o n elementach typu nt, w którym wykorzystywany jest tzw. wartownk. Wartownk to dodatkowa zmenna w, która zapametuje ndeks tablcy, pod którym wystap lo ostatne przestawene elementów w petl wewnetrznej. Dzek nemu wystarczy, że w kolejnej teracj petla wewnetrzna zatrzyma se na ndekse w. W przypadku pomyślnego u lożena danych w tablcy wejścowej może to bardzo przyspeszyć oblczena. Porównaj swoja wersje algorytmu z podana w skrypce pod wzgledem lczby potrzebnych operacj porównań oraz przestaweń elementów w zależnośc od n dla tablcy już posortowanej oraz dla tablcy posortowanej w kolejnośc odwrotnej. Zadane 4.17. Dana jest tablca o n > 1 elementach typu double. Napsz funkcje wykorzystujac a tylko jedna petl e for, która oblczy warancje jej elementów. Warancja cagu x = (x 1,..., x n ) dana jest wzorem s 2 (x) = 1 n=1 n 1 (x x) 2, gdze x jest średna arytmetyczna cagu x. Zadane 4.18. [PN PS] Dana jest tablca o elementach typu double. Napsz funkcje, która sprawdza, czy każde 3 lczby z tablcy moga być d lugoścam boków jakchś trójkatów. Zadane 4.19. [MD] Tak zwany cag EKG (a 1, a 2,... ) o elementach naturalnych jest zdefnowany nastepuj aco: a 1 = 1, a 2 = 2 oraz a n+1 jest najmnejsza lczba naturalna ne wystepuj ac a wcześnej w cagu taka, że NWD(a n, a n+1 ) > 1, tzn. majac a netrywalny wspólny dzelnk z a n. Napsz funkcje, która wyznaczy a n dla danego n. Zadane 4.20. [MD] Dana jest n-elementowa tablca t o elementach ca lkowtych, reprezentujaca permutacje zboru {0, 1,..., n 1}. Napsz ( fragment kodu, który wyznaczy ) lczbe 2, 1, 5, 4, 3, 0 cykl w tej permutacj. Dla przyk ladu, tablca reprezentuje t[0] t[1] t[2] t[3] t[4] t[5] permutacj e o 3 cyklach. Zawera bowem cykl o d lugośc 3 (t[0] = 2 t[2] = 5 t[5] = 0), cykl o d lugośc 2 (t[3] = 4 t[4] = 3) oraz cykl o d lugośc 1 (t[1] = 1). Zadane 4.21. [MD] Cag Golomba (g 1, g 2,... ) to jedyny nemalejacy cag lczb naturalnych, w którym każda lczba wystepuje dok ladne g razy, przy za lożenu g 1 = 1. Napsz funkcje, która wyznaczy n-ty wyraz tego cagu dla danego n. 1 2 3 4 5 6 7 8 9 10 11 12... g 1 2 2 3 3 4 4 4 5 5 5 6...

4.4. WSKAZÓWKI I ODPOWIEDZI DO ĆWICZEŃ 28 4.4. Wskazówk odpowedz do ćwczeń Wskazówka do zadana 4.13. Na przyk lad dla w(x) = x 4 + 4x 2 x + 2 oraz v(x) = x 4 + x 3 + 10 zachodz u(x) = x 8 + x 7 + 4x 6 + 3x 5 + 11x 4 + 2x 3 + 40x 2 10x + 20. Wskazówka do zadana 4.17. Należy wyprowadzć wzory (rekurencyjne) na średna arytmetyczna warancje k poczatkowych elementów cagu, zależne od elementu x k oraz średnej arytmetycznej warancj elementów (x 1,..., x k 1 ). Wskazówka do zadana 4.18. Jeśl mamy a b c, to warunkem konecznym dostatecznym tego, by da lo se skonstruować trójkat o bokach d lugośc a, b, c, jest c < a + b. Uwaga. Ne trzeba sprawdzać wszystkch możlwych trójek! Wskazówka do zadana 4.21. Skorzystaj z pomocnczej n-elementowej tablcy lczb ca lkowtych.