Algorytmy i struktur - Uniwersytet Ekonomiczny w Krakowie
Transkrypt
Algorytmy i struktur - Uniwersytet Ekonomiczny w Krakowie
2009-10-20 Wybrane algorytmy tablicowe Algorytmy i struktury danych Wykład 2. Rok akademicki: 2009/2010 Sortowanie przez wybieranie for (int i = 0; i < liczby.length - 1; i++) { k = i; for (int j = i; j < liczby.length; j++) if (liczby[k] > liczby[j]) k = j; pomoc = liczby[i]; liczby[i] = liczby[k]; liczby[k] = pomoc; } Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 2 1 2009-10-20 Sortowanie przez wstawianie for (int i = 1; i < liczby.length; i++) { pomoc = liczby[i]; j = i - 1; while ((j >= 0) && (pomoc < liczby[j])) { liczby[j+1] = liczby[j]; j--; } liczby[j+1] = pomoc; } Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 3 Sortowanie bąbelkowe for (int i = 1; i < liczby.length; i++) { for (j = liczby.length - 1; j >= i; j--) if (liczby[j-1] > liczby[j]) { pomoc = liczby[j]; liczby[j] = liczby[j-1]; liczby[j-1] = pomoc; } } Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 4 2 2009-10-20 Sito Eratostenesa (1/2) Sito Eratostenesa - algorytm pozwala na wyznaczenie liczb pierwszych mniejszych lub równych wartości N. Tworzymy listę wszystkich liczb naturalnych od 2 do N. 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 Pierwsza liczba na liście jest liczbą pierwszą. Usuwamy z listy wszystkie wielokrotności wyznaczonej liczby pierwszej. 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 Powtarzamy kroki 2 oraz 3 aż do momentu usunięcia wszystkich liczb z listy. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 5 Sito Eratostenesa (2/2) Kolejna liczba pierwsza: 3 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 Kolejna liczba pierwsza: 5 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 Kolejna liczba pierwsza: 7 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 Kolejna liczba pierwsza: 11 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 Kolejna liczba pierwsza: 13 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 Kolejna liczba pierwsza: 17 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 Kolejna liczba pierwsza: 19 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 6 3 2009-10-20 Inwersja elementów w wektorze – wersja iteracyjna import java.io.*; public class ParametryTablicowe { static void drukuj(String s) { System.out.print(s); } static int czytajLiczbe() throws IOException { BufferedReader klaw = new BufferedReader (new InputStreamReader (System.in)); return Integer.parseInt(klaw.readLine()); } Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 7 Inwersja elementów w wektorze – wersja iteracyjna static int [] tworzWektor(int ileElementow) // metoda zwraca referencje do tablicy { int [] tab = new int[ileElementow]; for(int i = 0; i < tab.length; i++) tab[i] = i; return tab; } static void drukujWektor(int [] tab) { for (int i = 0; i < tab.length; i++) drukuj(tab[i] + " "); drukuj("\n"); } Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 8 4 2009-10-20 Inwersja elementów w wektorze – wersja iteracyjna static void inwersja(int [] tab) // metoda modyfikuje tablice przekazana jako parametr { int i = 0; int j = tab.length - 1; int pomoc; while (i < j) { pomoc = tab[i]; tab[i] = tab[j]; tab[j] = pomoc; i++; j--; } } Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 9 Inwersja elementów w wektorze – wersja iteracyjna public static void main(String[] args) throws IOException { drukuj("Podaj liczbe elementow w wektorze: "); int ileElementow = czytajLiczbe(); int [] wektor = tworzWektor(ileElementow); drukujWektor(wektor); inwersja(wektor); drukujWektor(wektor); } } Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 10 5 2009-10-20 Tworzenie k-elementowych kombinacji bez powtórzeo nelementowego zbioru Niech A oznacza zbiór składający się z n elementów. k-elementową kombinacją bez powtórzeń (k ≤ n) elementów zbioru A nazywamy każdy k-elementowy podzbiór zbioru A. Ilość k-elementowych kombinacji bez powtórzeń n elementów równa się: n n! k k !n k ! Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 11 Tworzenie k-elementowych kombinacji bez powtórzeo nelementowego zbioru Przykład Napisać program wyświetlający wszystkie k-elementowe kombinacje bez powtórzeń elementów zbioru obejmującego liczby naturalne od 1 do n (przyjmij, że wartości n oraz k podawane będą przez użytkownika w trakcie działania programu. Użytkownik określił wartości parametrów w następujący sposób: n=4 k=3 Liczba kombinacji: 4 Program wyświetlił wyniki: 1, 2, 3 1, 2, 4 1, 3, 4 2, 3, 4 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 12 6 2009-10-20 Tworzenie k-elementowych kombinacji bez powtórzeo nelementowego zbioru • Elementy wchodzące w skład każdej kombinacji wyświetlane będą w kolejności rosnącej - dzięki czemu możemy określid wartości maksymalne, które mogą się pojawid na kolejnych pozycjach: na pozycji k będzie to wartośd n, na pozycji k-1 będzie to n-1, itd. • Kolejne kombinacje prezentowane są w porządku leksykograficznym (uporządkowanie słownikowe) - jeżeli byśmy przyjęli, że liczby wchodzące w skład danej kombinacji są kodami znaków, to utworzone w ten sposób słowa uporządkowane byłyby alfabetycznie. Czyli pierwsza kombinacja (dla n = 4 i k = 3) ma postad: 1, 2, 3. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 13 Tworzenie k-elementowych kombinacji bez powtórzeo nelementowego zbioru • Przy generowaniu każdej następnej kombinacji realizuję kroki: – indeks = k (numer rozpatrywanego elementu w kombinacji) – max = n (wartośd maksymalna na pozycji indeks) – wyszukuję pierwszą (od prawej strony pozycję), na której mogę umieścid wartośd większą od dotychczasowej (kolejno zmniejszam indeks oraz max) – zwiększam wartośd znajdującą się na pozycji indeks o jeden – na kolejne pozycje (czyli od pozycji indeks+1 do k) wpisuję kolejne liczby (na pozycji indeks+1 umieszczona zostanie wartośd o jeden większa od wartości znajdującej się na pozycji indeks, na pozycji indeks+2 znajdzie się wartośd o jeden większa od wartości znajdującej się na pozycji indeks+1, itd.) – wyświetlam utworzoną w ten sposób kombinację. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 14 7 2009-10-20 Permutacje bez powtórzeo • Niech A oznacza zbiór składający się z n elementów. • Permutacją bez powtórzeo elementów zbioru A nazywamy każdy ciąg n-elementowy (a1, a2, ..., an), składający się z różnych elementów zbioru A. • Ilośd permutacji bez powtórzeo elementów zbioru A wynosi n!. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 15 Permutacje bez powtórzeo Przykład Napisz program wyświetlający wszystkie permutacje elementów zbioru liczb całkowitych obejmującego kolejne wartości od 1 do n (wartość n ma być podawana w trakcie działania programu). Przykład n=3 Liczba permutacji: 3! = 6 Wyniki działania programu: 1, 1, 2, 2, 3, 3, 2, 3, 1, 3, 1, 2, 3 2 3 1 2 1 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 16 8 2009-10-20 Permutacje bez powtórzeo – algorytm Dijkstry • kolejne permutacje wyświetlane będą w porządku leksykograficznym • pierwsza permutacja ma postad: • 1, 2, ... n • zakładam, że elementy tworzące permutację przechowywane są w wektorze a indeksowanym wartościami od 1 do n Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 17 Permutacje bez powtórzeo – algorytm Dijkstry • przy generowaniu każdej następnej permutacji realizowane są następujące kroki: – na podstawie bieżącej permutacji wyznaczana jest wartośd i, która jest maksymalną wartością indeksu, dla której spełniony jest warunek: a[i] < a[i+1] Przykład: dla a = *1 4 6 2 9 5 8 7 3+ poszukiwana wartośd i wynosi 6 fragment wektora a od pozycji i+1 do kooca nazywany jest ogonem. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 18 9 2009-10-20 Permutacje bez powtórzeo – algorytm Dijkstry – poszukujemy wartości j (przy czym j spełniad musi warunek: i+1 ≤ j ≤ n, czyli jest indeksem elementu znajdującego się w ogonie wektora a), dla której a[j] jest najmniejszą wartością spełniającą warunek a*j+ > a*i+ Przykład: dla wektora zdefiniowanego powyżej j jest równe 8 – dokonujemy zamiany elementów znajdujących się na pozycji i oraz j Przykład: w powyższym przypadku uzyskujemy: a = *1 4 6 2 9 7 8 5 3+ – odwracamy kolejnośd elementów znajdujących się w ogonie wektora a Przykład: w powyższym przypadku uzyskujemy: a = *1 4 6 2 9 7 3 5 8+ Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 19 10