Algorytmy i struktury danych Wykład VIII Elementarne techniki algorytmiczne Co dziś? Algorytmy zachłanne (greedyalgorithms) 2 Tytułem przypomnienia metoda dziel i zwyciężaj. Problem można podzielić na szereg podproblemów podobnych (identycznych co do meritum, mniejszych co do wielkości danych) 2. Podproblemysą rozwiązywane niezależnie (rekurencyjnie) 3. Rozwiązania wszystkich podproblemów są łączone Przykłady: # sortowanie przez scalanie # wyszukiwanie binarne (?) # quick sort # wyznaczanie przywódcy tablicy Przywódcą ciągu (tablicy) jest element, który występuje w ciągu więcej razy niż połowa długości tego ciągu. 3
Przywódca ciągu if( n == ) to jest to przywódca else podziel tablicę na dwie połowy rekurencyjnie znajdź przywódcę lewej i prawej połowy sprawdź który jest przywódcą całości O(n) int count = ; for( int i = ; i < n ; i++ ) { if ( count == ) { count++; j = i;} else if ( Tab[i] == Tab[j] ) count++; else count--; } return Tab[j]; 4 Algorytmy zachłanne Wykonuje zawsze takie działanie które w danej chwili jest najkorzystniejsze (optymalne: minimalne, maksymalne), w efekcie uzyskujemy rozwiązanie najkorzystniejsze (optymalne: minimalne, maksymalne). Zastosowanie gdy minimalizujemy (maksymalizujemy) jakąś wartość Nie zawsze otrzymujemy rozwiązanie optymalne! # dowód poprawności # kontrprzykład # niejednokrotnie znalezione rozwiązanie jest satysfakcjonujące (rozwiązania dokładniejsze są dużo kosztowniejsze) 5 Wieże na szachownicy #Problem: na szachownicy n * nsą porozstawiane monety; należy tak umieścić n wież, aby nie atakowały się i suma monet z pól na których stoją była największa. #Rozwiązanie: w każdym kroku wybieramy dopuszczalne pole z maksymalną monetą #Optymalność: algorytm nie jest optymalny, ale suma będzie zawsze większa od połowy maksymalnej sumy możliwej do uzyskania # Złożoność: O( N log(n) ) 6 2
Problem wyboru zajęć # Problem: mamy zbiór par opisujących zajęcia (początek, koniec) oraz zasób do którego dobieramy zajęcia (sala wykładowa); należy wybrać największy podzbiór zajęć tak, aby nie kolidowały ze sobą. # Rozwiązanie: ze zbioru zajęć wybieramy wg jakiegoś kryterium zajęcie które nie koliduje z już wybranymi: najdłuższe najkrótsze kolidujące z najmniejszą liczbą zajęć jeszcze nie wybranych wybór pierwszego z posortowanych wg początku wybór pierwszego z posortowanych wg końca # Które optymalne? 7 Wybór zajęć ID start end 5 5 2 3 5 2 3 6 6 4 5 7 2 5 3 8 5 6 5 9 4 7 6 4 8 8 3 9 8 2 4 2 3 2 4 2 ID start end 5 4 5 7 8 8 (?) 2 4 8 Problem wyboru zajęć # Problem: mamy zbiór par opisujących zajęcia (początek, koniec) oraz zasób do którego dobieramy zajęcia (sala wykładowa); należy wybrać największy podzbiór zajęć tak, aby nie kolidowały ze sobą. # Rozwiązanie: z posortowanego po zakończeniu zajęć zbioru zajęć wybieramy pierwszy taki który nie przeszkadza już wybranym # Optymalność: tak, jak dowieść że jest to rozwiązanie optymalne? # Złożoność: O(n log (n)) 9 3
Minimalne sklejenie par #Problem: mamy ciąg n nieujemnych liczb, pobieramy dwie liczby i zastępujemy je sumą; jeśli koszt akcji to suma, to należy tak wyznaczyć kolejność dodawania, aby sumaryczny koszt był najmniejszy #Rozwiązanie: wybierz dwa najmniejsze elementy i zastąp je przez ich sumę #Optymalność: tak # Złożoność: O( n log(n) ) Minimalne sklejenie par 5 9 2 3 6 45 4 2 3 6 45 4 2 3 4 6 45 25 4 6 45 39 4 6 25 45 3 25 45 69 25 3 45 55 45 24 45 55 224 Minimalne sklejenie sąsiadów #Problem: analogicznie do poprzedniego, wybieramy jednak tylko liczby sąsiednie # Rozwiązanie: również analogiczne #Optymalność: nie, kontrprzykład { 5, 4, 4, 5} 2 4
Problem doboru zajęć do sal #Problem: zajęcia i sale, jak najmniej sal, tak aby wszystkie zajęcia mogły się odbyć #Rozwiązanie: kolorowaniegrafu przedziałów, zajęcia to wierzchołki, krawędź jeśli zajęcia kolidują ze sobą; bierzemy najmniejszy kolor przyporządkowujemy wierzchołkowi jeśli można, jeśli nie to zwiększamy numer koloru #Optymalność: nie #Złożoność:O( (V + E) * V) 3 Problem plecakowy dyskretny i ciągły #Problem dyskretny: mamy przedmioty z ich wartością i wagą, chcemy mieć największy koszt, ale ogranicza nas waga # Problem ciągły: możemy ciąć przedmioty #Rozwiązanie: liczymy wartość masy jednostkowej i wybieramy największą możliwą ilość # Optymalność: dyskretny nie, ciągły tak #Złożoność:O( n log( n) ) 4 6 5 4 3 2/3=4 /2=5 6/=6 2 $6 $ $2 $22 $6 $8 $24 5 5
Wydawanie reszty (proste) #Problem: musimy wydać najmniejszą liczbę monet; nominały: PLN, 2PLN, 5PLN, PLN, itd. #Rozwiązanie: zawsze wybieramy największy dostępny nominał # Optymalność: tak, jaki warunek dla nominałów? # Złożoność: O( n ) [gdy nominały są posortowane] #dla takich działa: c, c, c 2,.., c k ; c > i k #dla takich nie:, 4, 9, 2 (9+++) (4+4+4) 6 Kody Huffmana metoda kompresji danych a b c d e f razem Częstość(tys.) 45 3 2 6 9 5 *8 Ustalona dłu. 3 Zmienna dłu. 224 Czy ten kod jest optymalny? Jak dobrać kody? 7 Drzewo dla kodu o stałej długości 86 4 58 28 4 a:45 b:3 c:2 d:6 e:9 f:5 8 6
Drzewo dla kodu o zmiennej długości a:45 55 25 c:2 b:3 e:9 4 3 f:5 d:6 9 Algorytm zachłanny: Kody Huffmana #łączymy w drzewo liście o najmniejszych wagach, powstaje nowa waga, prawy syn to, lewy to # złożoność budowy drzewa O( n log(n) ) Kody prefiksowe Kodowanie: zamiana liter na odpowiednie kody Rozkodowanie: wędrowaniepo drzewie 2 Kody Huffmana David A. Huffman, MIT, 952 Algorytm bezstratny Użycie: MP3, JPG, PNG, PKZIP (przeważnie jako jeden z ostatnich etapów) Warianty: # kodujemy nie pojedyncze litery ale zbitki liter #wersja dynamiczna 2 7
Algorytmy zachłanne Własność wybory zachłannego #za pomocą lokalnych optymalnych (zachłannych) wyborów można uzyskać globalne optymalne rozwiązanie #decyzja o lokalnym wyborze nie zależy od przyszłych wyborów, nie zależy również od rozwiązań podproblemów #w każdym kroku następuje redukcja problemu do problemu mniejszego # konieczność udowodnienia poprawności 22 Algorytmy zachłanne Optymalna podstruktura #problem wykazuje optymalną podstrukturę, jeśli jest funkcją optymalnych rozwiązań podproblemów 23 Pytania? KONIEC 24 8