dr inż. Jarosław Forenc



Podobne dokumenty
Algorytmy komputerowe. dr inŝ. Jarosław Forenc

Algorytm. a programowanie -

Algorytmy komputerowe. dr inż. Jarosław Forenc

dr inż. Jarosław Forenc

Definicje. Algorytm to:

1 Wprowadzenie do algorytmiki

Technologie informacyjne Wykład VII-IX

MATERIAŁY POMOCNICZE NR 1 DO PRACOWNI Z PRZEMIOTU INFORMATYKA 1. Informacje podstawowe:

Algorytmy. Programowanie Proceduralne 1

Algorytm selekcji Hoare a. Łukasz Miemus

Technologie informacyjne - wykład 12 -

Programowanie w VB Proste algorytmy sortowania

Model protokołu TCP/IP. Algorytmy komputerowe. Rekurencja, złożoność obliczeniowa. Sortowanie. dr inż. Jarosław Forenc. Model ISO/OSI a model TCP/IP

Strategia "dziel i zwyciężaj"

Podstawy programowania. Podstawy C# Przykłady algorytmów

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

Informatyka wprowadzenie do algorytmów (I) dr hab. inż. Mikołaj Morzy

Algorytmy sortujące i wyszukujące

Informatyka 1. Wykład nr 7 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Algorytmy. Programowanie Proceduralne 1

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

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

Algorytm. Krótka historia algorytmów

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

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

Podstawy Informatyki. Algorytmy i ich poprawność

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

MATERIAŁY POMOCNICZE NR 1 DO PRACOWNI Z PRZEMIOTU INFORMATYKA 1. Informacje podstawowe:

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

Analiza algorytmów zadania podstawowe

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

MATERIAŁY POMOCNICZE NR 1 DO PRACOWNII Z PRZEMIOTU INFORMATYKA 1

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

METODY OPISU ALGORYTMÓW KOMPUTEROWYCH

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Matematyczne Podstawy Informatyki

Podstawy Programowania

Dynamiczny przydział pamięci (język C) Dynamiczne struktury danych. Sortowanie. Klasyfikacja algorytmów sortowania. Algorytmy sortowania

Algorytm. Algorytmy Marek Pudełko

Informatyka wprowadzenie do algorytmów (II) dr hab. inż. Mikołaj Morzy

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

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Wstęp do Informatyki

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 7 Algorytmy

Jeszcze o algorytmach

Przykładowe sprawozdanie. Jan Pustelnik

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

POLITECHNIKA OPOLSKA

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Algorytm. Krótka historia algorytmów

Zadanie 1. Potęgi (14 pkt)

Wprowadzenie do algorytmiki

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Język ludzki kod maszynowy

Wykład z Technologii Informacyjnych. Piotr Mika

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 1. Elektrotechnika, semestr II rok akademicki 2008/2009

2.8. Algorytmy, schematy, programy

11. Blok ten jest blokiem: a. decyzyjnym b. końcowym c. operacyjnym

Metodyki i techniki programowania

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Metodyki i techniki programowania

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

5. Rekurencja. Przykłady

Wstęp do informatyki

Programowanie komputerów

INFORMATYKA SORTOWANIE DANYCH.

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Podstawy Informatyki. Sprawność algorytmów

Algorytmy i struktury danych. Wykład 4

Laboratorium nr 7 Sortowanie

Technologie Informatyczne Wykład VII

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

Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

POLITECHNIKA OPOLSKA

Podstawy i języki programowania

Definicja algorytmu brzmi:

Podstawy Programowania C++

Algorytm i złożoność obliczeniowa algorytmu

Sortowanie przez scalanie

Informatyka 1. Wykład nr 7 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Efektywność algorytmów

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

Wprowadzenie do złożoności obliczeniowej

Podstawy programowania funkcjonalnego

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

Struktury danych i złozoność obliczeniowa. Prof. dr hab. inż. Jan Magott

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Spis treści JĘZYK C - PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI, REKURENCJA. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Rekurencja. Przygotowała: Agnieszka Reiter

Sortowanie. LABORKA Piotr Ciskowski

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

Zadanie projektowe 1: Struktury danych i złożoność obliczeniowa

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Algorytmy i Struktury Danych.

Transkrypt:

Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia stacjonarne I stopnia Rok akademicki 2012/2013 Wykład nr 7 (10.04.2013)

Rok akademicki 2012/2013, Wykład nr 7 2/66 Plan wykładu nr 7 Algorytmy komputerowe definicje algorytmu podstawowe cechy algorytmu sposoy opisu algorytmów Rekurencja Złożoność oliczeniowa Sortowanie proste wstawianie proste wyieranie ąelkowe Quick-Sort Mnożenie macierzy

Rok akademicki 2012/2013, Wykład nr 7 3/66 Algorytm - definicje Definicja 1 Skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego zadania Definicja 2 Metoda rozwiązania zadania Definicja 3 Ściśle określona procedura oliczeniowa, która dla właściwych danych wejściowych zwraca żądane dane wyjściowe zwane wynikiem działania algorytmu

Rok akademicki 2012/2013, Wykład nr 7 4/66 Algorytmy Słowo algorytm pochodzi od nazwiska Muhammada in-musy al-chuwarizmiego (po łacinie pisanego jako Algorismus), matematyka perskiego z IX wieku Badaniem algorytmów zajmuje się algorytmika Algorytm może zostać zaimplementowany w postaci programu komputerowego Przetłumaczenie algorytmu na wyrany język programowania nazywane jest też kodowaniem algorytmu Ten sam algorytm może yć zaimplementowany (zakodowany) w różny sposó przy użyciu różnych języków programowania.

Rok akademicki 2012/2013, Wykład nr 7 5/66 Podstawowe cechy algorytmu Posiadanie danych wejściowych (w ilości większej lu równej zeru) pochodzących z dorze zdefiniowanego zioru Zwracanie wyniku Precyzyjne zdefiniowanie (każdy krok algorytmu musi yć jednoznacznie określony) Poprawność (dla każdego z założonego dopuszczalnego zestawu danych wejściowych) Zakończenie działania po skończonej liczie kroków (powinna istnieć poprawnie działająca reguła stopu algorytmu) Efektywność (jak najkrótszy czas wykonania i jak najmniejsze zapotrzeowanie na pamięć).

Rok akademicki 2012/2013, Wykład nr 7 6/66 Sposoy opisu algorytmów 1. Opis słowny w języku naturalnym lu w postaci listy kroków (opis w punktach) 2. Schemat lokowy 3. Pseudokod (nieformalna odmiana języka programowania) 4. Wyrany język programowania

Rok akademicki 2012/2013, Wykład nr 7 7/66 Opis słowny algorytmu Podanie kolejnych czynności, które należy wykonać, ay otrzymać oczekiwany efekt końcowy Przypomina przepis kulinarny z książki kucharskiej lu instrukcję osługi urządzenia, np. Algorytm: Tortilla ( Podróże kulinarne R. Makłowicza) Dane wejściowe: 0,5 kg ziemniaków, 100 g kiełasy Chorizo, 8 jajek Dane wyjściowe: gotowa Tortilla Opis algorytmu: Ziemniaki orać i pokroić w plasterki. Kiełasę pokroić w plasterki. Ziemniaki wrzucić na gorącą oliwę na patelni i przyrumienić z ou stron. Kiełasę wrzucić na gorącą oliwę na patelni i przyrumienić z ou stron. Uić jajka i dodać do połączonych ziemniaków i kiełasy. Dodać sól i pieprz. Usmażyć z ou stron wielki omlet nadziewany chipsami ziemniaczanymi z kiełaską.

Rok akademicki 2012/2013, Wykład nr 7 8/66 Lista kroków Uporządkowany opis wszystkich czynności, jakie należy wykonać podczas realizacji algorytmu Krok jest to pojedyncza czynność realizowana w algorytmie Kroki w algorytmie są numerowane, operacje wykonywane są zgodnie z rosnącą numeracją kroków Jedynym odstępstwem od powyższej reguły są operacje skoku (warunkowe lu ezwarunkowe), w których jawnie określa się numer kolejnego kroku Przykład (instrukcja otwierania wózka-specerówki): Krok 1: Krok 2: Krok 3: Zwolnij element lokujący wózek Rozkładaj wózek w kierunku kółek Naciskając nogą dolny element lokujący aż do zatrzaśnięcia, rozłóż wózek do pozycji przewozowej

Rok akademicki 2012/2013, Wykład nr 7 9/66 Schemat lokowy Zawiera plan algorytmu przedstawiony w postaci graficznej struktury elementów zwanych lokami Każdy lok zawiera informację o operacji, która ma yć w nim wykonana Pomiędzy lokami umieszczone są linie przepływu (strzałki) określające kolejność wykonywania loków algorytmu Podstawowe symole stosowane na schematach lokowych: linia przepływu (połączenie) występuje w postaci linii zakończonej strzałką określa kierunek przemieszczania się po schemacie

Rok akademicki 2012/2013, Wykład nr 7 10/66 Schemat lokowy Podstawowe symole stosowane na schematach lokowych: lok startowy, początek algorytmu wskazuje miejsce rozpoczęcia algorytmu może występować tylko jeden raz STOP lok końcowy, koniec algorytmu wskazuje miejsce zakończenia algorytmu musi występować przynajmniej jeden raz lok wykonawczy, lok funkcyjny zawiera polecenie (elementarną instrukcję) instrukcją może yć podstawienie, operacja arytmetyczna, wprowadzenie danych lu wyprowadzenie wyników

Rok akademicki 2012/2013, Wykład nr 7 11/66 Schemat lokowy Podstawowe symole stosowane na schematach lokowych: lok warunkowy (decyzyjny, porównujący) sprawdza umieszczony w nim warunek i dokonuje wyoru tylko jednej drogi wyjściowej połączenia wychodzące z loku: - T lu TAK - gdy warunek jest prawdziwy - N lu NIE - gdy warunek nie jest prawdziwy Czasami wprowadzanie i wyprowadzanie danych oznacza się dodatkowym lokiem wejścia-wyjścia lok wejścia-wyjścia poprzez ten lok wprowadzane są dane i wyprowadzane wyniki

Rok akademicki 2012/2013, Wykład nr 7 12/66 Pseudokod i język programowania Pseudokod: Pseudokod (pseudojęzyk) - uproszczona wersja języka programowania Często zawiera zwroty pochodzące z języków programowania Zapis w pseudokodzie może yć łatwo przetłumaczony na wyrany język programowania Opis w języku programowania: Zapis programu w konkretnym języku programowania Stosowane języki: Pascal, C, Matla (kiedyś - Fortran, Basic)

Rok akademicki 2012/2013, Wykład nr 7 13/66 Algorytm Euklidesa - lista kroków Algorytm Euklidesa - największy wspólny dzielnik dwóch licz Dane wejściowe: niezerowe liczy naturalne a i Dane wyjściowe: NWD(a,) Kolejne kroki: 1. Czytaj liczy a i 2. Dopóki a i są większe od zera, powtarzaj krok 3, a następnie przejdź do kroku 4 3. Jeśli a jest większe od, to weź za a resztę z dzielenia a przez, w przeciwnym razie weź za resztę z dzielenia przez a 4. Przyjmij jako największy wspólny dzielnik tę z licz a i, która pozostała większa od zera 5. Drukuj NWD(a,)

Rok akademicki 2012/2013, Wykład nr 7 14/66 Algorytm Euklidesa - przykład NWD(1675,3752) =? a Dzielenie większej liczy przez mniejszą Zamiana 1675 3752 /a = 3752/1675 = 2 reszta 402 = 402 1675 402 a/ = 1675/402 = 4 reszta 67 a = 67 67 402 /a = 402/67 = 6 reszta 0 = 0 67 0 KONIEC NWD(1675,3752) = 67

Rok akademicki 2012/2013, Wykład nr 7 15/66 Algorytm Euklidesa - schemat lokowy

Rok akademicki 2012/2013, Wykład nr 7 16/66 Algorytm Euklidesa - pseudokod NWD(a,) while a>0 i >0 do if a> then a a mod else mod a if a>0 then return a else return

Rok akademicki 2012/2013, Wykład nr 7 17/66 Algorytm Euklidesa - język programowania (C) int NWD(int a, int ) { while (a>0 && >0) if (a>) a = a % ; else = % a; if (a>0) return a; else return ; }

Rok akademicki 2012/2013, Wykład nr 7 18/66 Wartość ezwzględna liczy - schemat lokowy x x dla = x dla x 0 x < 0 START START Wczytaj(x) Wczytaj(x) tak x 0 nie tak x 0 nie Drukuj(x) Drukuj(-x) Drukuj(x) Drukuj(-x) STOP STOP STOP

Rok akademicki 2012/2013, Wykład nr 7 19/66 Parzystość liczy - schemat lokowy START START Wczytaj(x) Wczytaj(x) x < 0 tak nie x mod 2 = 0 tak nie x = -x x > 1 nie Drukuj (x - nieparzyste) Drukuj (x - parzyste) tak x = x -2 nie x = 0 tak STOP Drukuj (x - nieparzyste) Drukuj (x - parzyste) STOP

Rok akademicki 2012/2013, Wykład nr 7 20/66 Równanie kwadratowe - schemat lokowy ax 2 = + x + c 2 4ac = 0 START Wczytaj(a,,c) delta= 2-4ac > 0 : x 1 =, 2a = 0 : x 1 = x 2 = 2 a x 2 = + 2a x tak x1 = 2a 2 + = 2a Drukuj(x 1,x 2 ) STOP delta > 0 nie tak x = x 1 2 = 2a Drukuj(x 1,x 2 ) delta = 0 nie Drukuj(Brak rozwiązania) STOP STOP

Rok akademicki 2012/2013, Wykład nr 7 21/66 Silnia - schemat lokowy n! = 1 2 3... n 0! = 1 1! = 1 2! = 1 2 3! = 1 2 3... START Wczytaj(n) silnia = 1 n > 0 nie tak silnia=n silnia n = n -1 Drukuj(silnia) STOP

Rok akademicki 2012/2013, Wykład nr 7 22/66 Rekurencja Rekurencja lu rekursja - jest to odwoływanie się funkcji lu definicji do samej sieie Rozwiązanie danego prolemu wyraża się za pomocą rozwiązań tego samego prolemu, ale dla danych o mniejszych rozmiarach W matematyce mechanizm rekurencji stosowany jest do definiowania lu opisywania algorytmów Silnia: 1 n! = n( n 1)! dla dla n = 0 n 1 int silnia(int n) { return n==0? 1 : n*silnia(n-1); }

Rok akademicki 2012/2013, Wykład nr 7 23/66 Rekurencja - ciąg Fionacciego F n = 0 dla n = 0 1 dla n = 1 F n 1 + F n 2 dla n > 1 int F(int n) { if (n==0) return 0; else if (n==1) return 1; else return F(n-1) + F(n-2); }

Rok akademicki 2012/2013, Wykład nr 7 24/66 Rekurencja - algorytm Euklidesa NWD( a, ) = a NWD(, a mod ) dla dla = 0 1 int NWD(int a, int ) { if (==0) return a; else return NWD(,a % ); }

Rok akademicki 2012/2013, Wykład nr 7 25/66 Złożoność oliczeniowa W celu rozwiązania danego prolemu oliczeniowego szukamy algorytmu najardziej efektywnego czyli: najszyszego o możliwie małym zapotrzeowaniu na pamięć Do oceny efektywności programu służy złożoność oliczeniowa (koszt algorytmu) Złożoność oliczeniowa algorytmu: jest ilością zasoów potrzenych do jego działania (czas, pamięć) jest funkcją rozmiaru danych, na których pracuje algorytm

Rok akademicki 2012/2013, Wykład nr 7 26/66 Złożoność oliczeniowa Złożoność czasowa Jej miarą jest licza podstawowych operacji (dominujących) Podstawowe operacje - porównanie, podstawienie, operacja arytmetyczna Złożoność pamięciowa Jest miarą wykorzystania pamięci (licza komórek pamięci) Złożoność pesymistyczna Odpowiada danym najardziej niesprzyjającym dla algorytmu Złożoność średnia Złożoność uśredniona po wszystkich możliwych zestawach danych, występująca dla typowych danych wejściowych

Rok akademicki 2012/2013, Wykład nr 7 27/66 Notacja O ( duże O ) Wyraża złożoność matematyczną algorytmu Po literze O występuje wyrażenie w nawiasach zawierające literę n, która oznacza liczę elementów, na której działa algorytm Do wyznaczenia złożoności ierze się pod uwagę liczę wykonywanych w algorytmie podstawowych operacji Przykład: O(n) - złożoność algorytmu jest prostą funkcją liczy elementów (jeśli sortowanie 10.000 elementów zajmuje 5 s, to sortowanie 20.000 elementów zajmie 10 s) O(n 2 )- czas konieczny do wykonania algorytmu rośnie wraz z kwadratem liczy elementów (przy podwojeniu liczy elementów ich osługa ędzie trwała cztery razy dłużej)

Rok akademicki 2012/2013, Wykład nr 7 28/66 Notacja O ( duże O ) Porównanie najczęściej występujących złożoności: Elementy O(log n) O(n) O(n logn) O(n 2 ) O(2 n ) 10 3 10 33 100 1024 100 7 100 664 10 000 1,27 10 30 1 000 10 1 000 9 966 1 000 000 1,07 10 301 10 000 13 10 000 132 877 100000000 1,99 10 3010 O(log n) - złożoność logarytmiczna O(n) - złożoność liniowa O(n log n) - złożoność liniowo-logarytmiczna (quasi-liniowa) O(n 2 ) - złożoność kwadratowa O(2 n ) - złożoność wykładnicza

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 29/66 Sortowanie sortowanie polega na uporządkowaniu zioru danych względem pewnych cech charakterystycznych każdego elementu tego zioru (wartości każdego elementu) w przypadku licz, sortowanie polega na znalezieniu kolejności licz zgodnej z relacją lu Przykład: talica nieposortowana: talica posortowana zgodnie z relacją (od najmniejszej do największej liczy): talica posortowana zgodnie z relacją (od największej do najmniejszej liczy):

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 30/66 Sortowanie w przypadku słów sortowanie polega na ustawieniu ich w porządku alfaetycznym (leksykograficznym) Przykład: talica nieposortowana: talice posortowane:

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 31/66 Sortowanie w praktyce sortowanie sprowadza się do porządkowanie danych na podstawie porównania - porównywany element to klucz Przykład: talica nieposortowana (imię, nazwisko, wiek): talica posortowana (klucz - nazwisko): talica posortowana (klucz - wiek):

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 32/66 Sortowanie Po co stosować sortowanie? posortowane elementy można szyciej zlokalizować posortowane elementy można przedstawić w czytelniejszy sposó Klasyfikacje algorytmów sortowania złożoność oliczeniowa algorytmu - zależność liczy wykonywanych operacji w stosunku do liczeności sortowanego zioru n złożoność pamięciowa - wielkość zasoów zajmowanych przez algorytm (sortowanie w miejscu - wielkość zioru danych podczas sortowania nie zmienia się lu jest tylko nieco większa) sortowanie wewnętrzne (odywa się w pamięci komputera) i zewnętrzne (nie jest możliwe jednoczesne umieszczenie wszystkich elementów zioru sortowanego w pamięci komputera)

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 33/66 Klasyfikacje algorytmów sortowania Stailność algorytmu: algorytm jest stailny, jeśli podczas sortowania zachowuje kolejność występowania elementów o tym samym kluczu, np. talica nieposortowana (imię, nazwisko, wiek): talica posortowana algorytmem stailnym (klucz - wiek): talica posortowana algorytmem niestailnym (klucz - wiek):

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 34/66 Proste wstawianie (insertion sort) Przykład: Funkcja w języku C: void InsertionSort(int ta[]) { int i,j,tmp; } for (i=1; i<n; i++) { j=i; tmp=ta[i]; while (ta[j-1]>tmp && j>0) { ta[j]=ta[j-1]; j--; } ta[j]=tmp; }

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 35/66 Proste wstawianie (insertion sort) Uwagi: złożoność algorytmu: O(n 2 ) + wydajny dla danych wstępnie posortowanych + wydajny dla ziorów o niewielkiej liczeności + małe zasoy zajmowane podczas pracy (sortowanie w miejscu) + stailny + prosty w implementacji mała efektywność dla normalnej i dużej ilości danych.

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 36/66 Proste wyieranie (selection sort) Przykład: Funkcja w języku C: void SelectionSort(int ta[]) { int i,j,k,tmp; } for (i=0;i<n-1;i++) { k=i; for (j=i+1; j<n; j++) if (ta[k]>=ta[j]) k = j; tmp = ta[i]; ta[i] = ta[k]; ta[k] = tmp; }

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 37/66 Proste wyieranie (selection sort) Uwagi: złożoność algorytmu: O(n 2 ) + szyki w sortowaniu niewielkich talic + małe zasoy zajmowane podczas pracy (sortowanie w miejscu) + prosty w implementacji licza porównań elementów jest niezależna od początkowego rozmieszczenia elementów w talicy w algorytmie może zdarzyć się, że wykonywana jest zamiana tego samego elementu ze soą.

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 38/66 Bąelkowe (ule sort) sortowanie ąelkowe (ang. ule sort), nazywane jest także: sortowaniem pęcherzykowym sortowaniem przez prostą zamianę (ang. straight exchange) metoda ta polega na porównywaniu dwóch kolejnych elementów i zamianie ich kolejności jeśli jest to konieczne nazwa metody wzięła się stąd, że kolejne porównania powodują wypychanie kolejnego największego elementu na koniec ( wypłynięcie największego ąelka )

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 39/66 Bąelkowe (ule sort)

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 40/66 Bąelkowe (ule sort) Funkcja w języku C: void BuleSort(int ta[]) { int i,j,tmp,koniec; } do { koniec=0; for (i=0;i<n-1;i++) if (ta[i]>ta[i+1]) { tmp=ta[i]; ta[i]=ta[i+1]; ta[i+1]=tmp; koniec=1; } } while (koniec);

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 41/66 Bąelkowe (ule sort) Uwagi: złożoność algorytmu: O(n 2 ) + prosta realizacja + wysoka efektywność użycia pamięci (sortowanie w miejscu) + stailny mała efektywność.

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 42/66 Sortowanie szykie (Quick-Sort) Faza dzielenia: w fazie dzielenia talica jest dzielona na dwie części wokół pewnego elementu (nazywanego elementem centralnym) wyieramy jeden element (losowo, choć może to yć element środkowy) i nazywamy go x przeglądamy talicę od lewej strony, aż znajdziemy element a i x, a następnie przeglądamy talicę od prawej strony, aż znajdziemy a j x zamieniamy elementy a i i a j miejscami i kontynuujemy proces przeglądania i zamiany, aż nastąpi gdzieś spotkanie w środku talicy w rezultacie otrzymujemy talicę podzieloną na lewą część z wartościami mniejszymi od x i na prawą część z wartościami większymi od x

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 43/66 Sortowanie szykie (Quick-Sort) Faza sortowania: zawiera dwa rekurencyjne wywołania tej samej funkcji sortowania: dla lewej i dla prawej części posortowanej talicy rekurencja zatrzymuje się, gdy wielkość talicy wynosi 1 Przykład: sortujemy 6-elementową talicę ta: wywołanie funkcji QuickSort() ma postać: QuickSort(ta,0,5);

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 44/66 Sortowanie szykie (Quick-Sort) QuickSort(ta,0,5): element środkowy: (0+5)/2 = 2, x = ta[2] = 5 od lewej szukamy ta[i] x, a od prawej ta[j] x, zamieniamy elementy miejscami poszukiwania kończymy, gdy indeksy mijają się wywołujemy rekurencyjnie funkcję QuickSort() dla elementów z zakresów [l,j] i [i,r]: QuickSort(ta,0,3); QuickSort(ta,4,5);

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 45/66 Sortowanie szykie (Quick-Sort) QuickSort(ta,0,3): element środkowy dla zakresu [0,3]: (0+3)/2 = 1, x = ta[1] = 2 od lewej szukamy ta[i] x, a od prawej ta[j] x, zamieniamy elementy miejscami: 0 1 2 3 1 2 4 3 i j zamiana poszukiwania kończymy, gdy indeksy mijają się: wywołanie QuickSort() tylko dla elementów z zakresu [2,3], gdyż po lewej stronie rozmiar talicy do posortowania wynosi 1: QuickSort(ta,2,3);

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 46/66 Sortowanie szykie (Quick-Sort) QuickSort(ta,2,3): element środkowy dla zakresu [2,3]: (2+3)/2 = 2, x = ta[2] = 3 od lewej szukamy ta[i] x, a od prawej ta[j] x, zamieniamy elementy miejscami: poszukiwania kończymy, gdy indeksy mijają się: rozmiar ou talic do posortowania wynosi 1 więc nie ma nowych wywołań

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 47/66 Sortowanie szykie (Quick-Sort) QuickSort(ta,4,5): element środkowy dla zakresu [4,5]: (4+5)/2 = 4, x = ta[4] = 6 od lewej szukamy ta[i] x, a od prawej ta[j] x, zamieniamy elementy miejscami: poszukiwania kończymy, gdy indeksy mijają się: rozmiar ou talic do posortowania wynosi 1 więc nie ma nowych wywołań

Informatyka 2, studia stacjonarne I stopnia Rok akademicki 2012/2013, Wykład nr 7 48/66 Sortowanie szykie (Quick-Sort) Funkcja w języku C: void QuickSort(int ta[], int l, int r) { int i,j,x,y; } i=l; j=r; x=ta[(l+r)/2]; do { while (ta[i]<x) i++; while (x<ta[j]) j--; if (i<=j) { y=ta[i]; ta[i]=ta[j]; ta[j]=y; i++; j--; } } while (i<=j); if (l<j) QuickSort(ta,l,j); if (i<r) QuickSort(ta,i,r);

Rok akademicki 2012/2013, Wykład nr 7 49/66 Funkcja qsort() w języku C algorytm Quick-Sort został zaimplementowany w języku C w funkcji: QSORT stdli.h void qsort(void *aza, size_t n, size_t size, (*funkcja)(const void *element1, const void *element2)); funkcja qsort() sortuje metodą Quick-Sort talicę wskazywaną przez argument aza i zawierającą n elementów o rozmiarze size funkcja qsort() posługuje się funkcją porównującą funkcja(), której argumentami są wskazania do elementów talicy aza funkcja() powinna zwracać wartości: < 0, gdy *element1 < *element2 == 0, gdy *element1 == *element2 > 0, gdy *element1 > *element2

Rok akademicki 2012/2013, Wykład nr 7 50/66 Funkcja qsort() w języku C - przykład (1/2) #include <stdio.h> #include <stdli.h> #include <time.h> #define N 10 void generuj(int ta[]) { int i; srand(time(null)); for (i=0;i<n;i++) ta[i]=rand()%100; } void drukuj(int ta[]) { int i; for (i=0;i<n;i++) printf("%2d ",ta[i]); printf("\n"); }

Rok akademicki 2012/2013, Wykład nr 7 51/66 Funkcja qsort() w języku C - przykład (2/2) int funkcja(const void *element1, const void *element2) { if (*(int*)element1 < *(int*)element2) return -1; if (*(int*)element1 == *(int*)element2) return 0; if (*(int*)element1 > *(int*)element2) return 1; } int main() { int ta[n]; generuj(ta); drukuj(ta); printf("\nqsort:\n"); qsort((void*)ta,(size_t)n,sizeof(int),funkcja); drukuj(ta); } system("pause"); return (0);

Rok akademicki 2012/2013, Wykład nr 7 52/66 Funkcja qsort() w języku C - przykład (2/2) 6 7 31 22 66 89 22 int funkcja(const void *element1, const void *element2) { if (*(int*)element1 < qsort: *(int*)element2) return -1; if (*(int*)element1 == 6 *(int*)element2) 7 22 22 26return 27 0; 31 if (*(int*)element1 > *(int*)element2) return 1; } 27 52 26 66 52 89 int main() { int ta[n]; generuj(ta); drukuj(ta); printf("\nqsort:\n"); qsort((void*)ta,(size_t)n,sizeof(int),funkcja); drukuj(ta); } system("pause"); return (0);

Rok akademicki 2012/2013, Wykład nr 7 53/66 Mnożenie macierzy przez macierz Operacja: C = A B A[N][M] - macierz N M - elementowa B[M][K] - macierz M K - elementowa C[N][K] - macierz N K - elementowa N c c c 11 21 31 c c c 12 22 32 c c c 13 23 33 = N a a a 11 21 31 a a a 12 22 32 a a a 13 23 33 11 21 31 12 22 32 13 23 33 M K M K c c c 11 21 31 = a = a = a 11 21 31 11 11 11 + a + a + a 12 22 32 21 21 21 + a 13 + a + a 23 33 31 31 31 c c c 12 22 32 = a = a = a 11 21 31 12 12 12 + a + a + a 12 22 32 22 22 22 + a 13 + a + a 23 33 32 32 32 c c c 13 23 33 = a = a = a 11 21 31 13 13 13 + a + a + a 12 22 32 23 23 23 + a 13 + a + a 23 33 33 33 33

Rok akademicki 2012/2013, Wykład nr 7 54/66 Mnożenie macierzy przez macierz Operacja: C = A B (A[N][M],B[M][K],C[N][K]) N (i) c c c 11 c c 12 c c 13 = N (i) a a a 11 21 22 23 21 22 23 21 22 23 31 c 32 c 33 31 a 32 a 33 31 32 33 a a 12 a a 13 11 12 13 M (j) K (k) M (j) K (k) Program w języku C: for (i=0; i<n; i++) for (k=0; k<k; k++) { C[i][k] = 0.0; for (j=0; j<m; j++) C[i][k] += A[i][j] * B[j][k]; } c ik M = j= i = 1,2, K, N aij jk, 1 k = 1,2, K, K Koszt algorytmu: O( n 3 )

Rok akademicki 2012/2013, Wykład nr 7 55/66 Mnożenie macierzy przez macierz na szykość wykonywania oliczeń wpływa nie tylko licza operacji zmiennoprzecinkowych, ale także sposó poierania danych z pamięci komputera oecne systemy komputerowe mają hierarchiczną udowę pamięci: rejestry procesora pamięć podręczna (cache) pamięć operacyjna pamięć zewnętrzna oliczenia są efektywnie wykonywane, gdy odywają się na zmiennych znajdujących się w jak najszyszej pamięci

Rok akademicki 2012/2013, Wykład nr 7 56/66 Mnożenie macierzy przez macierz rozpatrzmy dwa algorytmy mnożenia macierzy: Algorytm nr 1 for (i=0; i<n; i++) for (k=0; k<n; k++) for (j=0; j<n; j++) C[i][k] += A[i][j]*B[j][k]; Algorytm nr 2 for (i=0; i<n; i++) for (j=0; j<n; j++) for (k=0; k<n; k++) C[i][k] += A[i][j]*B[j][k]; macierze: 2048 2048 procesor: Intel Core i5-2410m 2,30 GHz kompilator: Microsoft Visual C++ 2008 Standard Edition Algorytm nr 1: ez optymalizacji: 268,021 [s] z optymalizacją: 92,053 [s] Algorytm nr 2: ez optymalizacji: 49,409 [s] z optymalizacją: 6,270 [s]

Rok akademicki 2012/2013, Wykład nr 7 57/66 Mnożenie macierzy przez macierz Metoda przechowywania macierzy w pamięci liniowej M [0][0] [0][1] [0][2] [0][3] N [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] macierz macierz w pamięci liniowej (wektor) Pamięć podręczna (cache memory)

Rok akademicki 2012/2013, Wykład nr 7 58/66 Mnożenie macierzy przez macierz Algorytm nr 1 for (i=0; i<n; i++) for (k=0; k<k; k++) for (j=0; j<m; j++) C[i][k] += A[i][j] * B[j][k]; C A B Algorytm nr 2 for (i=0; i<n; i++) for (j=0; j<m; j++) for (k=0; k<k; k++) C[i][k] += A[i][j] * B[j][k]; C A B [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3]

Rok akademicki 2012/2013, Wykład nr 7 59/66 Bilioteka numeryczna BLAS BLAS - Basic Linear Algera Suprograms Ziór procedur służących do wykonywania operacji na podstawowych oiektach algery liniowej: skalarach wektorach macierzach Strona główna: http://www.netli.org/las Rok pulikacji: 1979 Oryginalnie napisana w języku Fortran 77 Osługuje liczy: rzeczywiste pojedynczej i podwójnej precyzji zespolone pojedynczej i podwójnej precyzji

Rok akademicki 2012/2013, Wykład nr 7 60/66 Bilioteka numeryczna BLAS Wyróżnia się 3 poziomy astrakcji algorytmów BLAS BLAS Level 1 operacje typu wektor-wektor (dodawanie wektorów, normy wektora, iloczyn skalarny wektorów) y α x + y BLAS Level 2 operacje typu macierz-wektor (mnożenie macierzy przez wektor) BLAS Level 3 y αax + y operacje typu macierz-macierz (mnożenie macierzy przez macierz) C αa B + C

Rok akademicki 2012/2013, Wykład nr 7 61/66 BLAS - Nazwy procedur DGEMV - mnożenie macierzy przez wektor, macierz i wektor zawierają liczy rzeczywiste podwójnej precyzji y α A x + β y lu y α A x + β y SGEMM - mnożenie macierzy przez macierz, macierze zawierają liczy rzeczywiste pojedynczej precyzji T y α op( A) op( B) + β C op( X) = X, op( X) = X T, op( X) = conjg( X T ) SSWAP - zamiana wektorów zawierających liczy rzeczywiste pojedynczej precyzji x y

Rok akademicki 2012/2013, Wykład nr 7 62/66 BLAS - Implementacje Strona główna: http://www.netli.org/las Strona główna zawiera niezoptymalizowaną iliotekę BLAS MKL (Intel) Intel Math Kernel Lirary (Intel MKL) v11 http://software.intel.com/en-us/intel-mkl ACML (AMD) AMD Core Math Lirary http://developer.amd.com/tools/cpu-development/amd-core-mathlirary-acml/ ATLAS (open source) Automatically Tuned Linear Algera Software http://math-atlas.sourceforge.net/

Rok akademicki 2012/2013, Wykład nr 7 63/66 GPGPU i CUDA GPGPU - General Purpose computing on Graphics Processing Units CUDA (Compute Unified Device Architecture) hardware - równoległa architektura oliczeniowa GPU software - kompilator nvcc, ilioteki i inne narrzędzia NVIDIA Corporation (USA) Pierwsza wersja: luty 2007 Strona WWW: http://www.nvidia.pl/oject/cuda_home_new_pl.html Licencja: freeware

Rok akademicki 2012/2013, Wykład nr 7 64/66 CUDA - Jak używać? Sprawdzić czy karta graficzna w komputerze osługuje CUDA wszystkie nowe karty graficzne NVIDIA są kompatyilne z CUDA Ściągnąć oprogramowanie CUDA The CUDA Driver - zintegrowany ze sterownikiem karty graficznej The CUDA Toolkit - zawiera narzędzia potrzene do kompilowania aplikacji z wykorzystaniem Microsoft Visual Studio (narzędzia, ilioteki, pliki nagłówkowe, inne zasoy) The GPU Computing SDK - przykładowe programy Zainstalować CUDA driver (jeśli jest to konieczne) Zainstalować oprogramowanie CUDA - Toolkit, SDK Użyć szalonu (template project) do stworzenia własnego programu wykorzystującego CUDA

Rok akademicki 2012/2013, Wykład nr 7 65/66 CUBLAS Bilioteka CUBLAS - implementacja BLAS (Basic Linear Algera Suprograms) dla kart graficznych NVIDIA i środowiska CUDA Zastosowanie CUBLAS w programie wymaga: inicjalizacji ilioteki CUBLAS: culasinit() przydzielenia pamięci GPU na macierze i wektory: culasalloc() przesłania macierzy i wektorów do pamięci GPU: culassetmatrix() wywołania odpowiednich funkcji CUBLAS: culassgemm() przesłania wyników oliczeń z pamięci GPU do pamięci RAM komputera: culasgetmatrix() zwolnienia pamięci GPU: culasfree() zakończenia pracy ilioteki CUBLAS: culasshutdown()

Rok akademicki 2012/2013, Wykład nr 7 66/66 Koniec wykładu nr 7 Dziękuję za uwagę!