Algorytmy i Struktury Danych Typy algorytmów

Slides:



Advertisements
Podobne prezentacje
Data Mining w e-commerce
Advertisements

Sortowanie przez scalanie
Algorytmy sortowania i porządkowania
Algorytmy sortowania i przeszukiwania
Instrukcje - wprowadzenie
Standardowa biblioteka języka C++
1 Dzisiejszy wykład Klasa string wersja prosta wersja ze zliczaniem odwołań Wyjątki Specyfikator volatile.
Uczenie ze wzmocnieniem
Grażyna Mirkowska PJWSTK, 10 stycznia 2001
Portal EURES – jak wyszukiwać oferty pracy? Wojewódzki Urząd Pracy w Katowicach 2008r.
Wyszukiwanie i zapisywanie informacji
Badania operacyjne. Wykład 2
Funkcje wyszukiwania i odwołań
Projektowanie i implementacja programów obsługujących gniazdka Wykład II Zbigniew Brożbar Paweł Baranowski.
Elementarne struktury danych Piotr Prokopowicz
ALGORYTMY GEOMETRYCZNE.
Programowanie imperatywne i język C
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Podstawy informatyki Rekurencja i rekurencja Grupa: 1A
Język ANSI C Operacje we/wy
Jak uczę programowania?
ALGORYTMY I STRUKTURY DANYCH
Podstawy C# Grupa .NET PO.
POJĘCIE ALGORYTMU Pojęcie algorytmu Etapy rozwiązywania zadań
Algorytm Naiwny Ciąg znaków: A B D C E Wzorzec: A B.
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Algorytmy i struktury danych
Algorytmy i Struktury Danych Sortowanie
PORZĄDEK WŚRÓD INFORMACJI KLUCZEM DO SZYBKIEGO WYSZUKIWANIA
Przegląd podstawowych algorytmów
Instrukcja logowania do Platformy E-Learningowej WSFiZ Instrukcja dla nauczycieli.
TABLICE C++.
Algorytmy i struktury danych
Podstawy Programowania
BIBLIOTEKA WYŻSZEJ SZKOŁY ADMINISTRACJI I BIZNESU INSTRUKCJA KORZYSTANIA Z KATALOGU ON-LINE.
Edytor Vi.
Budowanie tabel i relacji
Programowanie obiektowe III rok EiT
Algorytmy rekurencyjne - przykład
Jerzy Kotowski Politechnika Wrocławska
Zasady przywiązywania układów współrzędnych do członów.
Podstawy języka Instrukcje - wprowadzenie
Algorytmy i Struktury Danych
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Metody numeryczne szukanie pierwiastka metodą bisekcji
Algorytmy- Wprowadzenie do programowania
PHP Operacje na ciągach znaków Damian Urbańczyk. Zabezpieczanie tekstów Pewne dane muszą być przechowywane w taki sposób, aby nie mogły się do nich dostać.
Laboratorium nr.3 Algorytm przyrównania globalnego
WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska.
Władcy Móch Wzorzec flyweight. Problem Mamy dużo bardzo podobnych obiektów Obiekty mają w dużej części podobny stan Obiekty stanu mogą być ciężkie.
Algorytmy i Struktury Danych Struktury Danych
Algorytmy Genetyczne Anna Tomkowska Politechnika Koszalińska
 Praktyczne sposoby wpisywania adresu:  pomijanie autouzupełnianie  próba samodzielnego tworzenia poprzez sprawdzanie podstawowych kombinacji.
Temat 3: Podstawy programowania Algorytmy – 2 z 2 _________________________________________________________________________________________________________________.
Wstęp do programowania wykład 3 Typy wyliczeniowe, tablice.
Wstęp do programowania Wykład 1
Łamanie haseł Program realizowany w ramach projektu z przedmiotu: „Aplikacje internetowe i rozproszone”
Wizualizacja algorytmu grupowania k-średnich Maciej Łakomy Promotor: Dr hab. prof. WWSI Michał Grabowski.
Program realizowany w ramach projektu z przedmiotu: „Aplikacje internetowe i rozproszone”
Łamanie haseł Program realizowany w ramach projektu z przedmiotu: „Aplikacje internetowe i rozproszone”
Rozdział 5 REKURENCJA.
KATALOG ON-LINE Biblioteka Uczelniana PPWSZ w Nowym Targu
Algorytmy i Struktury Danych Wprowadzenie
Algorytmy i struktury danych
Operacje na ciągach znaków
Podstawy programowania
ALGORYTMY I STRUKTURY DANYCH
Haskell Składnia funkcji.
PGO Przeciążanie metod i konstruktorów
Zapis prezentacji:

Algorytmy i Struktury Danych Typy algorytmów Wykład 3 Prowadzący: dr Paweł Drozda

Plan wykładu Brute force Rekurencje Metoda zachłanna Programowanie dynamiczne dr Paweł Drozda

Brute force Sukcesywne sprawdzanie wszystkich kombinacji, aż do rozwiązania problemu Zazwyczaj nieoptymalna, prosta do implementacji Ogromna złożoność obliczeniowa Przykłady: Łamanie hasła Znajdowanie pary punktów najmniej odległych Wyszukiwanie wzorca w tekście dr Paweł Drozda

Wyszukiwanie wzorca w tekście – brute force Problem Poszukiwanie wzorca długości M znaków w tekście o długości N znaków Rozwiązanie Indeksy i, j oznaczają miejsce poruszania się po wzorcu i po tekście Jeśli znajdziemy początek taki sam porównujemy kolejne znaki, aż do znalezienia znaku niezgodnego – przesunięcie początku przeszukania w tekście o 1, bądź do momentu przejścia całego wzorca – zwrócony zostanie indeks początku wzorca w tekście Po przejściu całego tekstu bez znalezienia wzorca – zwracany komunikat o niepowodzeniu przeszukania dr Paweł Drozda

Wyszukiwanie wzorca - implementacja Szukaj (string wzorzec, string tekst){ int i=0, j=0; while (i<strlen(wzorzec) && j<strlen(tekst)){ if wzorzec[i] != tekst[j] { j-=i-1; i=0; } else{ j++; i++; if (i==strlen(w)) cout << j-i; else cout << -1; dr Paweł Drozda

Rekurencje Przykład wprowadzający Cechy algorytmu rekurencyjnego Dziecko rozrzuciło klocki – musi je pozbierać do pudełka zadanie polega na włożeniu po jednym klocku do pudełka do momentu aż wszystkie klocki znajdą się w pudełku Cechy algorytmu rekurencyjnego zakończenie algorytmu jasno określone większy problem rozbity na problemy elementarne dr Paweł Drozda

Rekurencje – ilustracja Problem Dla tablicy n liczb określić czy istnieje liczba x Rozwiązanie Weź pierwszy niezbadany element tablicy n-elementowej Jeśli jest to x wypisz sukces i zakończ W przeciwnym przypadku zbadaj pozostałą część tablicy Gdy po przejściu całej tablicy nie został znaleziony x wypisz porażka dr Paweł Drozda

Rekurencje – przykładowa implementacja #include <iostream.h> #include <stdlib.h> const n=10; int tab[n]={1,2,3,2,-7,44,5,1,0,-3}; void szukaj(int tab[n],int left,int right,int x) // left, right = lewa i prawa granica obszaru poszukiwań // tab = tablica // x = wartość do odnalezienia { if (left>right) cout << "Element " << x << " nie został odnaleziony\n"; else if (tab[left]==x) cout << "Znalazłem szukany element "<< x << endl; szukaj(tab,left+1,right,x); } int main() { szukaj(tab,0,n-1,7); szukaj(tab,0,n-1,5); } // wyniki programu: // Element 7 nie został odnaleziony // Znalazłem szukany element dr Paweł Drozda

Analiza algorytmu Zakończenie programu Element odnaleziony Przekroczenie zakresu tablicy Duży problem rozbity na problemy elementarne Z tablicy o wymiarze n schodzimy do tablicy o wymiarze n-1 Instrukcja porównania dr Paweł Drozda

Rekurencje - schemat wykonywania Przykład silnia unsigned long int silnia(int x) { if (x==0) return 1; else return x*silnia(x-1); } 3*2! X=0? nie X=0? 2*1! nie 1*0! X=0? nie X=0? 1 tak dr Paweł Drozda

Rekurencje – pułapki (1) Wykonywanie tych samych obliczeń wiele razy Problem ciągu Fibonacciego f(0)= 1, f(1)=1 f(n) = f(n-1) + f(n-2) f(4) f(3) f(2) f(2) f(1) f(1) f(0) f(1) f(0) dr Paweł Drozda

Rekurencje – pułapki (2) Wywoływanie rekurencji w nieskończoność int StadDoWiecznosci(int n) { if (n==1) return 1; else if ((n %2) == 0) // n parzyste return StadDoWiecznosci(n-2)*n;else return StadDoWiecznosci(n-1)*n; } Dla parzystych n – odwołania w nieskończoność dr Paweł Drozda

Rozwiązywanie rekurencji Merge Sort Rozwiązanie Założenie n jest całkowite T(n) jest stałe dla małych n Omówione zostaną 3 rozwiązywania rekurencji i otrzymywania asymptotycznych oszacowań rekurencji

Metoda podstawiania czyli: założenie: metoda indukcyjna, stosowana gdy łatwo jest przewidzieć rozwiązanie

Metoda podstawiania warunek brzegowy:

Metoda podstawiania Zamiana zmiennych

Metoda iteracyjna i-ty składnik ciągu: iterowanie kończymy gdy: tu nie musimy zgadywać odpowiedzi i-ty składnik ciągu: iterowanie kończymy gdy:

Metoda iteracyjna szereg geometryczny

Drzewo rekurencji

Drzewo rekurencji

Metoda rekurencji uniwersalnej koszt dzielenia/łączenia a podproblemów rowiązywanych w czasie n/b f(n) jest funkcja asymptotycznie dodatnia f(n) wieksza od n^log(...) -> f(n) równa n^log(...) -> f(n) mniejsza od n^log(...) -> f(n) musi byc wielomianowo wieksza/mniejsza (ze wzgledu na epsilon) jezeli jest wieksza/mniejsza ale nie wielomianowo to nie mozna zastosowac tej metody

Metoda rekurencji uniwersalnej

Metoda rekurencji uniwersalnej dla dostatecznie dużych n: więc:

Metoda zachłanna Główne zastosowanie – problemy optymalizacji Wybór w danej chwili najkorzystniejszy „Nadzieja” otrzymania globalnie optymalnego rozwiązania Przykłady zastosowania: Znajdowanie minimum (maksimum) w tablicy N liczb Ciągły problem plecakowy Kody Huffmana – kompresja danych wykorzystując tablicę częstości występowania znaków dr Paweł Drozda

Znajdowanie minimum - implementacja int min(int tab[]){ int i,minimum=tab[0]; for (i=1; i<length(tab);i++) if (tab[i]<minimum) minimum=tab[i]; return minimum; } dr Paweł Drozda

Problem plecakowy Sformułowanie problemu Problem dyskretny Złodziej rabujący sklep znalazł n przedmiotów. Każdy z przedmiotów ma pewną wartość i pewną wagę. Problem polega na zmieszczeniu jak najwartościowszego łupu do plecaka mogącego pomieścić pewną liczbę kilogramów Problem dyskretny Każdy przedmiot jest kradziony w całości – część przedmiotu jest bezwartościowa np. księgarnia, sklep monopolowy, skarbiec ze sztabami złota Problem ciągły przedmiot można podzielić – część przedmiotu też ma wartość np. sklep mięsny, odzież na wagę, skarbiec ze złotym piaskiem dr Paweł Drozda

Problem plecakowy – przykład (1) Dyskretny waga 15kg wartość 120 zł waga 5kg wartość 60 zł waga 15kg wartość 120 zł waga 10kg wartość 100 zł waga 10kg wartość 100 zł waga 10kg wartość 100 zł waga 5kg wartość 60 zł Metoda zachłanna Rozwiązanie optymalne wartość kg: p1 = 12zł p2=10 zł p3=8 zł dr Paweł Drozda

Problem plecakowy – przykład (2) Ciągły waga 10kg wartość 80 zł waga 5kg wartość 60 zł waga 15kg wartość 120 zł waga 10kg wartość 100 zł waga 10kg wartość 100 zł waga 5kg wartość 60 zł wartość kg: p1 = 12zł p2=10 zł p3=8 zł Metoda zachłanna = rozwiązanie optymalne dr Paweł Drozda

Programowanie dynamiczne Główne zastosowanie – problem optymalizacji Podobne do metody „dziel i zwyciężaj” Stosowane gdy podproblemy nie są niezależne Każdy podproblem rozwiązywany tylko raz – wynik rozwiązania zapamiętywany dr Paweł Drozda

Etapy programowania dynamicznego Scharakteryzowanie struktury optymalnego rozwiązania Rekurencyjne zdefiniowanie kosztu optymalnego rozwiązania Obliczenie optymalnego kosztu metodą wstępującą Znalezienie optymalnego rozwiązania dr Paweł Drozda

Przykład – linie montażowe a1,n e1 t1,1 t1,2 x1 e2 t2,1 t2,2 x2 a2,1 a2,2 a2,3 a2,n Dwie linie montażowe – każda z linii ma n stanowisk Na i-tym stanowisku linii 1 jest wykonywana ta sama czynność co na i-tym stanowisku linii 2 Czasy wykonania czynności są różne Czasy e i x są to odpowiednio czas umieszczenia elementu i zdjęcia elementu z linii Czasy t oznaczają czas potrzebny na przeniesienie elementu z jednej linii na drugą dr Paweł Drozda

Linie montażowe Sformułowanie problemu Algorytm brute force Wskazanie stanowisk montażowych na obu liniach tak, aby czas montażu był jak najkrótszy Algorytm brute force Dla każdej możliwej ścieżki obliczany jest czas montażu, a następnie wybór najkrótszego czasu Nie do przyjęcia – złożoność obliczeniowa jest nie mniejsza od 2n co dla dużych n jest nie do policzenia w zadawalającym czasie dr Paweł Drozda

Linie montażowe – przykład 7 9 3 4 8 4 2 2 3 1 3 4 3 4 2 1 2 2 1 2 8 5 6 4 5 7 Rozwiązanie optymalne: linia 1: stanowiska 1,3,6 linia 2: stanowiska 2,4,5 JAK DO TEGO DOJŚĆ??? dr Paweł Drozda

Rozwiązanie – programowanie dynamiczne(1) Etap 1 – struktura optymalnego rozwiązania Najszybszy sposób montażu do stanowiska i-tego pierwszej linii: dla i=1 – istnieje tylko jeden sposób dla i>1 – dwa sposoby: przejście ze stanowiska i-1 pierwszej linii – koszt przejścia pomijany Przejście ze stanowiska i-1 drugiej linii – koszt równy t2,n-1 Dla stanowisk i-1 koszt przejścia jest optymalny – Własność optymalnej podstruktury Analogicznie dla stanowiska i-tego drugiej linii Rozwiązanie problemu dla stanowiska i na każdej z linii znalezienie rozwiązania podproblemów stanowisk i-1 dla każdej z linii dr Paweł Drozda

Rozwiązanie – programowanie dynamiczne(2) Etap 2 – rozwiązanie rekurencyjne f= min(f1[n]+ x1 , f2[n] + x2) – najkrótszy czas montażu Wartości dla stanowisk 1: f1[1]=e1 + a1,1 f2[1]=e2 + a2,1 Sformułowanie równania dla dowolnego i: f1[i]=min(f1[i-1]+ a1,i, f2[i-1]+ t2,i-1 + a1,i) f2[i]=min(f2[i-1]+ a2,i, f1[i-1]+ t1,i-1 + a2,i) dr Paweł Drozda

Rozwiązanie – programowanie dynamiczne(3) Obliczenia funkcja f oznacza optymalne rozwiązanie tabele s1, s2 dla i-tego stanowiska zawierają numer linii z której pochodzi i-1 stanowisko w optymalnym rozwiązaniu f1[1]=e1 + a1,1 f2[1]=e2 + a2,1 for i=1 to n if (f1[i-1]+ a1,i < f2[i-1]+ t2,i-1 + a1,i) f1[i]=f1[i-1]+ a1,i, s1[i]=1 else f1[i]=f2[i-1]+ t2,i-1 + a1,i, s2[i]=2 analogicznie dla drugiej linii if (f1[n]+ x1 < f2[n] + x2) f= f1[n]+ x1, s=1 else f = f2[n] + x2, s=2 dr Paweł Drozda

Rozwiązanie – programowanie dynamiczne(4) Etap 4 – optymalne rozwiązanie Odczytanie odpowiednich numerów linii ze zmiennej s oraz z tablic s1, s2 w kolejności od n-tego do pierwszego stanowiska montażu dr Paweł Drozda

Problem montażu – rozwiązanie liczbowe 7 9 3 4 8 4 2 2 3 1 3 4 3 4 2 1 2 2 1 2 8 5 6 4 5 7 f1[1]=9 f1[2]=min(9+9, 12+2+9)=18, s1[2]=1 f1[3]=20, s1[3]=2 f2[1]=12 f2[2]=min(12+5, 9+2+5)=16, s2[2]=1 f2[3]=22, s2[3]=2 f1[4]=24, s1[4]=1 f1[5]=32, s1[5]=1 f1[6]=35, s1[6]=2 f2[4]=25, s2[4]=1 f2[5]=30, s2[5]=2 f2[6]=37, s2[6]=2 f=38, s=1 numery linii dla poszczególnych wierzchołków od końca: 6-1, 5-2, 4-2, 3-1, 2-2, 1-1 dr Paweł Drozda