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

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

Algorytmy komputerowe. dr inż. Jarosław Forenc

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

Algorytm. a programowanie -

Struktura i funkcjonowanie komputera struktura połączeń, magistrala, DMA systemy pamięci komputerowych hierarchia pamięci, pamięć podręczna

Definicje. Algorytm to:

1 Wprowadzenie do algorytmiki

Technologie informacyjne - wykład 12 -

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

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

Algorytm. Krótka historia algorytmów

METODY OPISU ALGORYTMÓW KOMPUTEROWYCH

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

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

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

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

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

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

Matematyczne Podstawy Informatyki

Efektywność algorytmów

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

Algorytm i złożoność obliczeniowa algorytmu

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

Technologie informacyjne Wykład VII-IX

Wykład z Podstaw Informatyki dla I roku BO. Piotr Mika

Wprowadzenie do algorytmiki

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

Programowanie komputerów

Wykład z Technologii Informacyjnych. Piotr Mika

Informatyka 1. Wykład nr 6 ( ) Plan wykładu nr 6. Politechnika Białostocka. - Wydział Elektryczny. Architektura von Neumanna

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

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

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

2.8. Algorytmy, schematy, programy

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15

Algorytmy od problemu do wyniku

Algorytmy. Programowanie Proceduralne 1

Języki programowania zasady ich tworzenia

INFORMATYKA SORTOWANIE DANYCH.

Algorytmy, reprezentacja algorytmów.

Efektywna metoda sortowania sortowanie przez scalanie

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Zaawansowane algorytmy i struktury danych

Co to jest algorytm? przepis prowadzący do rozwiązania zadania, problemu,

Wstęp do programowania

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

Język ludzki kod maszynowy

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

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

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

INFORMATYKA. Algorytmy.

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

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

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

Podstawy Informatyki. Sprawność algorytmów

Algorytmy. Programowanie Proceduralne 1

Algorytmy i struktury danych. wykład 2

Algorytm. Krótka historia algorytmów

Definicja algorytmu brzmi:

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

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Podstawy i języki programowania

Strategia "dziel i zwyciężaj"

Algorytmika i pseudoprogramowanie

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

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

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

ALGORYTMY I PROGRAMY

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

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

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

Podstawy Programowania Algorytmy i programowanie

Wstęp do informatyki

POLITECHNIKA OPOLSKA

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

Algorytmy w teorii liczb

Wprowadzenie do złożoności obliczeniowej

Algorytmy i schematy blokowe

ALGORYTMY I STRUKTURY DANYCH

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

Wstęp do informatyki- wykład 2

Podstawy Informatyki. Programowanie. Inżynieria Ciepła, I rok. Co to jest algorytm? Istotne cechy algorytmu

Technologie Informatyczne Wykład VII

POLITECHNIKA OPOLSKA

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

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

Algorytm. Słowo algorytm pochodzi od perskiego matematyka Mohammed ibn Musa al-kowarizimi (Algorismus - łacina) z IX w. ne.

PROLOG WSTĘP DO INFORMATYKI. Akademia Górniczo-Hutnicza. Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej.

Algorytm. Algorytmy Marek Pudełko

Analiza algorytmów zadania podstawowe

Algorytmy i struktury danych. Wykład 4

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Paradygmaty programowania

REPREZENTACJA LICZBY, BŁĘDY, ALGORYTMY W OBLICZENIACH

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

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

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Zapis algorytmów: schematy blokowe i pseudokod 1

Wstęp do programowania

TEORETYCZNE PODSTAWY INFORMATYKI

Transkrypt:

Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia niestacjonarne I stopnia Rok akademicki 2008/2009 Wykład nr 7 (24.05.2009)

Rok akademicki 2008/2009, Wykład nr 7 2/50 Plan wykładu nr 7 Definicje algorytmu komputerowego Sposoby opisu algorytmów Klasyfikacje algorytmów Rekurencja ZłoŜoność obliczeniowa Języki programowania Generacje języków programowania

Rok akademicki 2008/2009, Wykład nr 7 3/50 Algorytm - definicje Definicja 1 Algorytm to 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 obliczeniowa, która dla właściwych danych wejściowych zwraca Ŝądane dane wyjściowe zwane wynikiem działania algorytmu

Rok akademicki 2008/2009, Wykład nr 7 4/50 Algorytmy Słowo algorytm pochodzi od nazwiska Muhammada ibn-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 wybrany język programowania nazywane jest teŝ kodowaniem algorytmu Ten sam algorytm moŝe być zaimplementowany (zakodowany) w róŝny sposób przy uŝyciu róŝnych języków programowania Jeśli dany algorytm da się wykonać na maszynie o dostępnej mocy obliczeniowej i pamięci oraz akceptowalnym czasie, to mówi się Ŝe jest to algorytm obliczalny

Rok akademicki 2008/2009, Wykład nr 7 5/50 Podstawowe cechy algorytmu Algorytm powinien: Posiadać dane wejściowe (w ilości większej lub równej zeru) pochodzące z dobrze zdefiniowanego zbioru Zwracać pewien wynik Być precyzyjnie zdefiniowany (kaŝdy krok algorytmu musi być jednoznacznie określony) Być zawsze poprawny (dla kaŝdego z załoŝonego dopuszczalnego zestawu danych wejściowych) Zawsze kończyć się po skończonej liczbie kroków (powinna istnieć poprawnie działająca reguła stopu algorytmu) Być efektywny (jak najkrótszy czas wykonania i jak najmniejsze zapotrzebowanie na pamięć)

Rok akademicki 2008/2009, Wykład nr 7 6/50 Sposoby opisu algorytmów 1. Opis słowny algorytmu (w języku naturalnym) 2. Opis w punktach (lista kroków) 3. Opis w postaci schematu blokowego 4. Z zastosowaniem pseudokodu, czyli niezbyt formalnej odmiany języka programowania 5. W wybranym języku programowania

Rok akademicki 2008/2009, Wykład nr 7 7/50 Opis słowny s algorytmu Polega na podaniu kolejnych czynności, które naleŝy wykonać, aby otrzymać oczekiwany efekt końcowy Opis słowny algorytmu przypomina przepis kulinarny z ksiąŝki kucharskiej lub instrukcję obsługi urządzenia Przykład: Algorytm: Dane wejściowe: Dane wyjściowe: Opis algorytmu: Tortilla (na podstawie PodróŜy kulinarnych R. Makłowicza) 0,5 kg ziemniaków, 100 g kiełbasy Chorizo, 8 jajek gotowa Tortilla Ziemniaki obrać i pokroić w plasterki. Kiełbasę pokroić w plasterki. Ziemniaki wrzucić na gorącą oliwę na patelni i przyrumienić z obu stron. Kiełbasę wrzucić na gorącą oliwę na patelni i przyrumienić z obu stron. Ubić jajka i dodać do połączonych ziemniaków i kiełbasy. Dodać sól i pieprz. UsmaŜyć z obu stron wielki omlet nadziewany chipsami ziemniaczanymi z kiełbaską.

Rok akademicki 2008/2009, Wykład nr 7 8/50 Lista kroków Lista kroków jest to 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 lub bezwarunkowe), 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 blokujący wózek rozkładaj wózek w kierunku kółek naciskając nogą dolny element blokujący aŝ do zatrzaśnięcia, rozłóŝ wózek do pozycji przewozowej

Rok akademicki 2008/2009, Wykład nr 7 9/50 Schematy blokowe Schemat blokowy zawiera plan algorytmu przedstawiony w postaci graficznej struktury elementów zwanych blokami KaŜdy blok zawiera informację o operacji, która ma być w nim wykonana Pomiędzy blokami umieszczone są linie przepływu (strzałki) określające kolejność wykonywania bloków algorytmu ZaleŜnie od typu wykonywanej operacji stosowane są róŝne kształty bloków Podstawowe symbole stosowane na schematach blokowych: linia przepływu (połączenie) występuje w postaci linii zakończonej strzałką określa kierunek przemieszczania się po schemacie

Rok akademicki 2008/2009, Wykład nr 7 10/50 Schematy blokowe Podstawowe symbole stosowane na schematach blokowych: blok startowy, początek algorytmu wskazuje miejsce rozpoczęcia algorytmu moŝe występować tylko jeden raz na schemacie blokowym STOP blok końcowy, koniec algorytmu wskazuje miejsce zakończenia algorytmu musi występować przynajmniej jeden raz Opis operacji blok wykonawczy, blok funkcyjny zawiera polecenie (elementarną instrukcję), którą naleŝy wykonać instrukcją moŝe być podstawienie, operacja arytmetyczna, wprowadzenie danych lub wyprowadzenie wyników

Rok akademicki 2008/2009, Wykład nr 7 11/50 Schematy blokowe Podstawowe symbole stosowane na schematach blokowych: blok warunkowy (decyzyjny, porównujący, komparator) sprawdza umieszczony w nim warunek i dokonuje wyboru tylko jednej drogi wyjściowej połączenia wychodzące z bloku oznaczane są symbolami: - T lub TAK - gdy warunek jest prawdziwy - N lub NIE - gdy warunek nie jest prawdziwy czasami wprowadzanie i wyprowadzanie danych oznacza się dodatkowym blokiem wejścia/wyjścia blok wejścia/wyjścia poprzez ten blok wprowadzane są dane i wyprowadzane wyniki

Rok akademicki 2008/2009, Wykład nr 7 12/50 Pseudokod Pseudokod (pseudojęzyk) - jest to uproszczona wersja języka programowania Symbole geometryczne występujące na schematach blokowych zastępowane są zdaniami w języku ojczystym Często pojawiają się zwroty pochodzące z języków programowania Zapis w pseudokodzie moŝe być łatwo przetłumaczony na wybrany język programowania

Rok akademicki 2008/2009, Wykład nr 7 13/50 Opis w języku j programowania Zapis programu w konkretnym języku programowania Najczęściej stosowane języki to Pascal i C

Rok akademicki 2008/2009, Wykład nr 7 14/50 Przykłady opisu algorytmów Przykład: algorytm Euklidesa znajdowania największego wspólnego dzielnika dwóch liczb - NWD(a,b) Lista kroków: Dane wejściowe: Dane wyjściowe: Kolejne kroki: niezerowe liczby naturalne a i b NWD(a,b) 1. Czytaj liczby a i b 2. Dopóki a i b są większe od zera, powtarzaj krok 3, a następnie przejdź do kroku 4 3. Jeśli a jest większe od b, to weź za a resztę z dzielenia a przez b, w przeciwnym razie weź za b resztę z dzielenia b przez a 4. Przyjmij jako największy wspólny dzielnik tę z liczb a i b, która pozostała większa od zera 5. Drukuj NWD(a,b)

Rok akademicki 2008/2009, Wykład nr 7 15/50 Przykłady opisu algorytmów Przykład: algorytm Euklidesa znajdowania największego wspólnego dzielnika dwóch liczb - NWD(a,b) Przykład: NWD(1675,3752) =? a b Dzielenie większej liczby przez mniejszą Zamiana 1675 3752 b/a = 3752/1675 = 2 reszta 402 b = 402 1675 402 a/b = 1675/402 = 4 reszta 67 a = 67 67 402 b/a = 402/67 = 6 reszta 0 b = 0 67 0 KONIEC NWD(1675,3752) = 67

Rok akademicki 2008/2009, Wykład nr 7 16/50 Przykłady opisu algorytmów Przykład: algorytm Euklidesa znajdowania największego wspólnego dzielnika dwóch liczb - NWD(a,b) Schemat blokowy:

Rok akademicki 2008/2009, Wykład nr 7 17/50 Przykłady opisu algorytmów Przykład: algorytm Euklidesa znajdowania największego wspólnego dzielnika dwóch liczb - NWD(a,b) Pseudokod: NWD(a,b) while a>0 i b>0 do if a>b then a a mod b else b b mod a if a>0 then return a else return b

Rok akademicki 2008/2009, Wykład nr 7 18/50 Przykłady opisu algorytmów Przykład: algorytm Euklidesa znajdowania największego wspólnego dzielnika dwóch liczb - NWD(a,b) Język C: int NWD(int a, int b) { while (a>0 && b>0) if (a>b) a = a % b; else b = b % a; if (a>0) return a; else return b; }

Rok akademicki 2008/2009, Wykład nr 7 19/50 Przykłady opisu algorytmów Przykład: zamiana zapisu liczby naturalnej l danej w systemie dziesiętnym, na zapis w systemie pozycyjnym o podstawie p Lista kroków: Dane wejściowe: Dane wyjściowe: Kolejne kroki: liczba l w systemie dziesiętnym, podstawa systemu p zapis liczby l w systemie o podstawie p 1. Czytaj liczby l i p 2. Dopóki l > 0 powtarzaj krok 3 3. Wykonaj dzielenie całkowite liczby l przez p, resztę z dzielenia zapamiętaj jako kolejną cyfrę przedstawienia liczby l w nowym systemie pozycyjnym 4. Drukuj cyfry przedstawienia liczby l w nowym systemie pozycyjnym w odwrotnej kolejności niŝ były zapamiętywane

Rok akademicki 2008/2009, Wykład nr 7 20/50 Przykłady opisu algorytmów Przykład: zamiana zapisu liczby naturalnej l danej w systemie dziesiętnym, na zapis w systemie pozycyjnym o podstawie p Przykład: 1751 (10) =?(6) 1751(10) = 12035(6) 1751/ 6 291/ 6 48 / 6 8 / 6 1/ 6 = = = = = 291 48 8 1 0 reszta reszta reszta reszta reszta 5 3 0 2 1 kolejność odczytywania cyfr liczby w systemie szóstkowym

Rok akademicki 2008/2009, Wykład nr 7 21/50 Klasyfikacje algorytmów Podstawowe paradygmaty tworzenia programów komputerowych: strategia dziel i zwycięŝaj programowanie dynamiczne algorytmy zachłanne programowanie liniowe algorytmy siłowe (brute force) algorytmy probabilistyczne heurystyka NajwaŜniejsze techniki implementacji algorytmów komputerowych: proceduralność obiektowość praca sekwencyjna praca wielowątkowa praca równoległa rekurencja

Rok akademicki 2008/2009, Wykład nr 7 22/50 Strategia dziel i zwycięŝ ęŝaj Strategia dziel i zwycięŝaj (ang. divide and conquer) jest strategią konstruowania algorytmów, jedną z najefektywniejszych metod w informatyce W strategii tej zazwyczaj rekurencyjnie dzielimy problem na dwa lub więcej mniejszych problemów tego samego (lub podobnego) typu tak długo, aŝ stanie się on wystarczająco prosty do bezpośredniego rozwiązania Rozwiązania otrzymane dla mniejszych podproblemów są scalane w celu uzyskania rozwiązania całego zadania Przykłady zastosowań: sortowanie szybkie (quicksort) wyszukiwanie binarne - polega na sprawdzeniu czy szukany element znajduje się w uporządkowanej tablicy, jeśli tak, to zwraca jego indeks

Rok akademicki 2008/2009, Wykład nr 7 23/50 Programowanie dynamiczne Konstrukcja programu wykorzystującego zasadę programowania dynamicznego moŝe być sformułowana w trzech etapach: Koncepcja: dla danego problemu stwórz rekurencyjny model jego rozwiązania (wraz z jednoznacznym określeniem przypadków elementarnych) stwórz tablicę, w której będzie moŝna zapamiętywać rozwiązania przypadków elementarnych i podproblemów, które zostaną obliczone na ich podstawie Inicjacja: wpisz do tablicy wartości numeryczne odpowiadające przypadkom elementarnym Progresja: na podstawie wartości wpisanych do tablicy, uŝywając formuły rekurencyjnej, oblicz rozwiązanie problemu wyŝszego rzędu i wpisz je do tablicy postępuj w ten sposób do osiągnięcia poŝądanej wartości

Rok akademicki 2008/2009, Wykład nr 7 24/50 Programowanie dynamiczne - przykład Koncepcja: (F 10 w ciągu Fibonaciego) model rekurencyjny rozwiązania + przypadki elementarne F tablica z rozwiązaniem = 0 0, F = 1 1, F = + n Fn 1 Fn 2 n 0 1 2 3 4 5 6 7 8 F n 9 10 Inicjacja: wpisanie do tablicy wartości dla przypadków elementarnych n 0 1 2 3 4 5 6 7 8 F n 0 1 9 10 Progresja: obliczenie rozwiązań problemów wyŝszego rzędu aŝ do osiągnięcia poŝądanej wartości i wpisanie ich do tablicy n 0 1 2 3 4 5 6 7 8 F n 0 1 1 2 3 5 8 13 21 9 34 10 55

Rok akademicki 2008/2009, Wykład nr 7 25/50 Algorytmy zachłanne anne Algorytm zachłanny (ang. greedy algorithm) jest to algorytm, w którym w celu rozwiązania pewnego zadania w kaŝdym kroku dokonuje się zachłannego, tj. najlepiej rokującego w danym momencie wyboru rozwiązania częściowego Algorytm podejmuje decyzję lokalnie optymalną, dokonuje wyboru wydającego się w danej chwili najlepszym, kontynuując rozwiązanie podproblemu wynikające z podjętej decyzji Algorytmy zachłanne stosowane są przede wszystkim w optymalizacji Musi zawsze istnieć kryterium pozwalające ocenić jakość rozwiązania Dokonywany lokalnie najkorzystniejszy wybór ma w załoŝeniu prowadzić do znalezienia globalnego optymalnego rozwiązania

Rok akademicki 2008/2009, Wykład nr 7 26/50 Programowanie liniowe Programowanie liniowe Programowanie liniowe to klasa programowania matematycznego, w której wszystkie warunki ograniczające oraz funkcja celu mają postać liniową, np. warunki ograniczające: Zadanie polega na zmaksymalizowaniu (zminimalizowaniu) funkcji celu: wiele problemów moŝna sprowadzić do maksymalizacji lub minimalizacji pewnej funkcji celu, przy ograniczonych zasobach i antagonistycznych warunkach programowanie liniowe znalazło szerokie zastosowanie w teorii decyzji, np. do optymalizacji planu produkcyjnego = + + + + + + + + + α α α n n 2 2 1 1 n n 2 2 1 1 n n 2 2 1 1 x a x a x a x a x a x a x a x a x a K K K c n x n x c x c f + + + + = K 2 2 1 1 α

Rok akademicki 2008/2009, Wykład nr 7 27/50 Programowanie liniowe Przykład: Fabryka produkuje urządzenia A i B. W ciągu jednego dnia moŝna wytworzyć łącznie 200 urządzeń. Wyprodukowanie urządzenia A zajmuje 3 roboczogodziny, a urządzenia B - 4 roboczogodziny. Dzienna liczba dostępnych roboczogodzin wynosi 600. W ciągu jednego dnia naleŝy wyprodukować min. 50 urządzeń A i min. 50 urządzeń B. Zysk ze sprzedaŝy urządzenia A to 1000 PLN, a B - 1200 PLN. Ile urządzeń A i B naleŝy dziennie wyprodukować, aby zysk był jak największy? Warunki ograniczające: x 3 x x A A + x A, x 200 + 4 x B B 50 B 600 Funkcja celu: f = 1000 x + 1200 A x B

Rok akademicki 2008/2009, Wykład nr 7 28/50 Algorytmy siłowe Algorytm siłowy (ang. brute force) jest to określenie algorytmu opierającego się na sukcesywnym sprawdzaniu wszystkich moŝliwych kombinacji w poszukiwaniu rozwiązania problemu Algorytm siłowy jest zazwyczaj nieoptymalny, ale najprostszy w implementacji W programowaniu termin ten odnosi się do dowolnego algorytmu, który rozwiązuje problem przez weryfikację i ocenę wszystkich wariantów postępowania Stosowane jest takŝe pojęcie ataku brute force, odnoszące się do przeprowadzanych przez człowieka lub program komputerowy prób złamania zabezpieczeń, np. odgadnięcia hasła, poprzez wypróbowanie wszystkich moŝliwych kombinacji cyfr, liter i innych znaków

Rok akademicki 2008/2009, Wykład nr 7 29/50 Algorytmy probabilistyczne Algorytmy moŝna podzielić na deterministyczne i probabilistyczne Dane wejściowe Dane wejściowe Algorytm deterministyczny Algorytm probabilistyczny Generator liczb losowych Dane wyjściowe Dane wyjściowe Działanie algorytmu deterministycznego jest całkowicie zdeterminowane przez warunki początkowe (wejście), tzn. dla takich samych danych wejściowych algorytm zawsze zwraca taki sam wynik Algorytm probabilistyczny albo randomizowany (ang. randomized algorithm) to algorytm, który do swojego działania uŝywa losowości (generatora liczb pseudolosowych)

Rok akademicki 2008/2009, Wykład nr 7 30/50 Algorytmy probabilistyczne Główną zaletą algorytmów probabilistycznych jest działanie w średnim przypadku, dzięki czemu złośliwe dane wejściowe nie wydłuŝają jego działania Wśród algorytmów probabilistycznych wyróŝnia się algorytmy Las Vegas i algorytmy Monte Carlo Algorytm Las Vegas: Algorytm Las Vegas zawsze zwraca prawidłową odpowiedź, ale jego czas działania nie jest z góry ustalony (np. szukanie litery a w tablicy zawierającej połowę liter a i połowę liter b ) Algorytm Mone Carlo: Algorytm Monte Carlo kończy się w ustalonym czasie, ale moŝe z pewnym prawdopodobieństwem zwrócić zły wynik lub zwrócić wynik tylko z pewną dokładnością (np. obliczanie całek oznaczonych)

Rok akademicki 2008/2009, Wykład nr 7 31/50 Algorytmy probabilistyczne - algorytm Monte Carlo obliczamy przybliŝoną wartość całki oznaczonej metodą Monte Carlo: dla funkcji f(x), której całkę chcemy obliczyć w przedziale [x p,x k ] wyznaczamy prostokąt obejmujący pole pod wykresem tej funkcji o wysokości h i długości podstawy (x k -x p ) losujemy n punktów i zliczamy te punkty n w, które wpadają w pole pod wykresem funkcji wartość całki obliczana jest na podstawie wzoru przybliŝonego: I x k = x p x k I = f ( x) dx x p nw f ( x) dx h( xk x p ) n

Rok akademicki 2008/2009, Wykład nr 7 32/50 Rekurencja Rekurencja lub rekursja (ang. recursion, z łac. recurrere, przybiec z powrotem) jest to odwoływanie się np. funkcji do samej siebie Rekurencja polega na tym, Ŝe rozwiązanie danego problemu wyraŝa się za pomocą rozwiązań tego samego problemu, ale dla danych o mniejszych rozmiarach W matematyce mechanizm rekurencji stosowany jest dość często do definiowania lub opisywania algorytmów UŜycie opisu rekurencyjnego w przypadku algorytmu pozwala na przejrzysty, zwarty opis funkcji lub procedury Nie zawsze rozwiązanie rekurencyjne prowadzi do rozwiązania efektywnego, czasem prowadzi do obniŝenia efektywności programu Rekurencja zawsze zwiększa zapotrzebowanie programu na pamięć

Rok akademicki 2008/2009, Wykład nr 7 33/50 Rekurencja - przykłady Przykład: silnia liczby n n! = 1 n(n 1)! dla dla n n = 0 1 int silnia(int n) { if (n==0) return 1; else return n*silnia(n-1); }

Rok akademicki 2008/2009, Wykład nr 7 34/50 Rekurencja - przykłady Przykład: definicja ciągu Fibonacciego F n = 0 1 F n dla n = 0 dla n = 1 1 + Fn 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 2008/2009, Wykład nr 7 35/50 Rekurencja - przykłady Przykład: największy wspólny dzielnik - algorytm Euklidesa NWD(a, b) = a NWD(b,a mod b) dla dla b b = 0 1 int NWD(int a, int b) { if (b==0) return a; else return NWD(b,a % b); }

Rok akademicki 2008/2009, Wykład nr 7 36/50 ZłoŜoność obliczeniowa W celu rozwiązania danego problemu obliczeniowego staramy się znaleźć algorytm najbardziej efektywny, tzn. najszybszy i o moŝliwie małym zapotrzebowaniu na pamięć Do oceny efektywności programu słuŝy tzw. złoŝoność obliczeniowa ZłoŜoność obliczeniowa nazywana jest takŝe kosztem algorytmu ZłoŜoność obliczeniowa algorytmu jest to ilość zasobów (czas, pamięć, liczba procesorów) potrzebnych do jego działania ZłoŜoność obliczeniowa algorytmu jest funkcją rozmiaru danych wejściowych (np. sortowanie tablicy - im większa tablica tym więcej zasobów jest potrzebnych do jej posortowania) W zaleŝności od rozwaŝanego zasobu mówimy o: złoŝoności czasowej złoŝoności pamięciowej

Rok akademicki 2008/2009, Wykład nr 7 37/50 ZłoŜoność obliczeniowa ZłoŜoność czasowa: Miarą złoŝoności czasowej jest liczba operacji podstawowych (dominujących) w zaleŝności od rozmiaru danych wejściowych Operacje podstawowe to np. podstawienie, porównanie, operacja arytmetyczna Pomiar czasu zegarowego nie jest stosowany ze względu na silną zaleŝność od implementacji algorytmu, zastosowanego kompilatora, komputera, doświadczenia programisty ZłoŜoność pamięciowa: ZłoŜoność pamięciowa jest miarą wykorzystania pamięci (liczba komórek pamięci)

Rok akademicki 2008/2009, Wykład nr 7 38/50 ZłoŜoność obliczeniowa ZłoŜoność obliczeniowa zaleŝy od postaci danych na jakich algorytm operuje Dla pewnych, specyficznych danych algorytm moŝe wykonać się bardzo szybko, dla innych zaś znacznie wolniej Z powyŝszych powodów rozróŝnia się: złoŝoność pesymistyczną złoŝoność średnią ZłoŜoność pesymistyczna: Odpowiada najbardziej niesprzyjającym dla algorytmu danym ZłoŜoność średnia: ZłoŜoność uśredniona po wszystkich moŝliwych zestawach danych ZłoŜoność dla typowych danych wejściowych

Rok akademicki 2008/2009, Wykład nr 7 39/50 ZłoŜoność obliczeniowa Porównując złoŝoność algorytmów bierze się pod uwagę asymptotyczne tempo wzrostu, czyli to jak zachowuje się funkcja określająca złoŝoność wraz ze wzrostem wartości jej argumentów Asymptotyczne tempo wzrostu opisuje jak szybko dana funkcja rośnie lub maleje abstrahując od konkretnej postaci tych zmian Do opisu asymptotycznego tempa wzrostu stosuje się notację duŝego O, zwaną notacją Landaua

Rok akademicki 2008/2009, Wykład nr 7 40/50 Notacja O notacja ta wyraŝa złoŝoność matematyczną algorytmu w notacji tej po literze O występuje wyraŝenie w nawiasach zawierające literę n, która oznacza liczbę elementów, na której działa algorytm za miarę dobroci algorytmu przyjmuje się liczbę wykonywanych w nim elementarnych operacji, np. dodawanie, mnoŝenie, porównywanie Przykład: O(n) O(n 2 ) - złoŝoność algorytmu jest prostą funkcją liczby elementów - (jeśli sortowanie 1000 elementów zajmuje 1 s, to sortowanie - (2000 elementów zajmie 2 s) - czas konieczny do wykonania algorytmu rośnie wraz z kwadratem liczby elementów (przy podwojeniu liczby elementów ich obsługa będzie trwała cztery razy dłuŝej)

Rok akademicki 2008/2009, Wykład nr 7 41/50 Notacja O porównanie najczęściej występujących złoŝoności: Elementy O(log n) O(n) O(n log n) 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 100 000 000 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 O(n 2 ) - złoŝoność kwadratowa O(2 n ) - złoŝoność wykładnicza

Rok akademicki 2008/2009, Wykład nr 7 42/50 Notacja O Uwagi: przy porównywaniu róŝnych wyraŝeń O(n) stałe nie mają znaczenia i mogą być ignorowane, np. O(2n 2 ) i O(9n 2 ) mogą być rozwaŝane jak O(n 2 ) połączenie algorytmów o róŝnych złoŝonościach tworzy algorytm o wyŝszej z połączonych złoŝoności, np. dołączenie algorytmu o złoŝoności O(n 2 ) do algorytmu o złoŝoności O(n) tworzy algorytm o złoŝoności O(n 2 ) zagłębianie algorytmów (tj. mnoŝenie ich wpływu) tworzy algorytm z pomnoŝoną złoŝonością, np. algorytm O(n) zagłębiony w O(log n) daje w wyniku O(n log n)

Rok akademicki 2008/2009, Wykład nr 7 43/50 Język programowania Język programowania jest to usystematyzowany sposób przekazywania komputerowi poleceń do wykonania Język programowania pozwala na dokładny zapis algorytmów oraz innych zadań jakie komputer ma wykonać

Rok akademicki 2008/2009, Wykład nr 7 44/50 Język programowania Składnia języka określa: sposób opisywania struktur sterujących sposób opisywania struktur danych sposób tworzenia poprawnych symboli do nazywania zmiennych i struktur danych sposób stosowania interpunkcji, tj. znaków typu spacje, średniki, kropki, nawiasy sposób budowy poprawnych wyraŝeń Semantyka języka określa znaczenie poprawnych składniowo wyraŝeń

Rok akademicki 2008/2009, Wykład nr 7 45/50 Język programowania Implementacja języka - konkretna realizacja języka dla maszyn określonego typu Program komputerowy - zbiór (ciąg) instrukcji opisujących zadanie, które ma wykonać komputer Program komputerowy - pewna metoda obliczeniowa wyraŝona za pomocą języka programowania Kod źródłowy - postać programu wyraŝona w języku programowania Przetwarzanie kodu źródłowego odbywa się na dwa sposoby kompilacja (kompilowane języki programowania) interpretacja (interpretowane języki programowania)

Rok akademicki 2008/2009, Wykład nr 7 46/50 Język programowania Kompilacja: Kod źródłowy jest tłumaczony do postaci kodu maszynowego (sekwencji elementarnych operacji gotowych do bezpośredniego przetworzenia przez procesor) Kompilacja do kodu maszynowego zapewnia najwyŝszą wydajność Wygenerowany kod jest ściśle powiązany z platformą sprzętową Interpretacja: Kod źródłowy jest na bieŝąco tłumaczony i wykonywany przez dodatkowy program zwany interpreterem Języki interpretowane zapewniają większą przenośność programów, które są często niezaleŝne od platformy i systemu operacyjnego Programy w językach interpretowanych są mniej wydajne niŝ w językach kompilowanych

Rok akademicki 2008/2009, Wykład nr 7 47/50 Generacje językj zyków w programowania Generacje języków opisują zaawansowanie (rozbudowanie) struktury języka, co jest równocześnie związane z łatwością posługiwania się nimi im mniejsza liczba oznaczająca generację języka tym bardziej jest on zbliŝony do sprzętu im większa generacja języka tym jest on bardziej intuicyjny i niezaleŝny od sprzętu

Rok akademicki 2008/2009, Wykład nr 7 48/50 Języki programowania Istnieje około 2500 języków programowania http://www.oreilly.com/pub/a/oreilly/news/languageposter_0504.html

Rok akademicki 2008/2009, Wykład nr 7 49/50 Języki programowania http://www.oreilly.com/pub/a/oreilly/news/languageposter_0504.html

Rok akademicki 2008/2009, Wykład nr 7 50/50 Koniec wykładu nr 7 Dziękuj kuję za uwagę!