Metody algorytmiczne WĘDRUJ I SPRAWDZAJ za pomocą
Transkrypt
Metody algorytmiczne WĘDRUJ I SPRAWDZAJ za pomocą
Metody algorytmiczne Przyjmijmy upraszczające założenie: WĘDRUJ I SPRAWDZAJ Dokonanie przeglądu struktury danych = zbudowanie ciągu zawierającego wszystkie obiekty składowe z tej struktury „Bądź cierpliwy, szukaj, to w końcu znajdziesz” Algorytmy zbudowane w oparciu o jej schemat wymagają często dokonania przeglądu całej struktury danych: Drzewa także można przeglądać iteracyjnie (za pomocą pętli) Dwa podstawowe schematy przeglądania drzewa ukorzenionego: za pomocą pojedynczej pętli (iteracji), np. dla tablicy jednowymiarowej lub listy wskaźnikowej; przegląd drzewa w głąb, za pomocą pętli (iteracji) zagnieżdżonych, np. dla tablicy wielowymiarowej lub listy list wskaźnikowych; przegląd drzewa wszerz. za pomocą rekurencji, np. dla struktur drzewiastych. Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 1 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 2 Algorytm przeglądu drzewa w głąb 1 (budowanie ciągu zawierającego wszystkie wierzchołki drzewa) 1. wstaw korzeń jako pierwszy element ciągu, 2. powtarzaj co następuje, aż do nadania korzeniowi etykiety „zamknięty”: 2.1. wybierz z aktualnego ciągu ostatni wierzchołek, który nie ma etykiety „zamknięty”, 2.2. jeśli wybrany wierzchołek nie ma potomstwa, które jeszcze nie zostało dopisane do ciągu, to nadaj mu etykietę „zamknięty”, 2.3. w przeciwnym przypadku dopisz do ciągu pierwszego (licząc od lewej) jego potomka, który jeszcze nie występuje w ciągu. Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 2 3 4 6 8 7 9 5 3 10 11 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 4 Algorytm przeglądu drzewa wszerz 1 (budowanie ciągu zawierającego wszystkie wierzchołki drzewa) 1. nadaj wszystkim wierzchołkom drzewa etykietę „nowy”, 2. wstaw korzeń jako pierwszy element ciągu, 3. dopóki w tworzonym ciągu występuje wierzchołek z etykietą „nowy”, powtarzaj co następuje: 3.1. wybierz z aktualnego ciągu pierwszy wierzchołek, który ma etykietę „nowy”, 3.2. dodaj do ciągu wszystkich jego potomków w kolejności od lewej, 3.3. usuń z wierzchołka wybranego w kroku 3.1. etykietę „nowy” . Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 2 5 6 9 5 3 4 7 8 10 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 11 6 1 1 Algorytmy wyznaczania najdłuższej przekątnej w wielokącie wypukłym Y 1 1 6 2 N - liczba wierzchołków 2 3 6 4 8 7 5 2 9 10 5 11 6 3 4 7 8 9 Przegląd drzewa w głąb 10 5 Strukturą danych dla opisu wielokąta może być tablica dwuwymiarowa: Przegląd drzewa wszerz 7 1. 1 0 d12 d13 ... d21 0 d23 ... d2N d31 d32 0 ... d3N N ... xN 2 y1 y2 y3 ... yN 2. 1 ... ... ... ... ... dN1 dN2 dN3 ... 0 1 6 2 d25 d24 4 4. 3 5. 1 3 6. 1 6 2 5 3 4 1 6 2 4 2. Przejrzyj N(N−1)/2 elementów w górnej trójkątnej połowie tablicy i znajdź największy. 5 4 3 5 ... 3. 1 6 5 6 N 8 2 5 d1N 3 ... x3 2 N 2 3 x2 6 1. Wypełnij tablicę dwuwymiarową NxN długościami wszystkich możliwych przekątnych, ... 2 x1 2. Algorytm najlepszy ze znanych: 1. Algorytm „na siłę”: 3 1 1 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. Co trzeba przejrzeć, aby znaleźć najdłuższą przekątną? 2 X 3 11 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 1 4 2 5 4 3 4 3 Dla N = 6: 1. Algorytm – 15 kroków, 2. Algorytm – 6 kroków Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 9 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 10 Algorytm sortowania przez scalanie DZIEL I ZWYCIĘŻAJ Dane wejściowe: nieuporządkowana lista (wskaźnikowa) Jeśli nie możesz uporać się od razu z rozwiązaniem zadania w całości, to spróbuj dzielić je na mniejsze o takiej samej strukturze i stosuj rekurencyjnie procedurę rozwiązywania. Uzyskane rozwiązania małych fragmentów zadań łącz w rozwiązania tych zadań, które były wcześniej dzielone. Przykładem zastosowania metody jest algorytm sortowania przez scalanie Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 11 Procedura sortuj (L) 1. jeśli lista L zawiera tylko jeden element, to jest posortowana, 2. w przeciwnym przypadku wykonaj co następuje: 2.1. podziel listę L na dwie połowy L1 i L2 , 2.2. wywołaj sortuj (L1) , 2.3. wywołaj sortuj (L2) , 2.4. scal posortowane listy L1 i L2 w jedną posortowaną listę , 3. wróć do poziomu wywołania. Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 12 2 Schemat działania algorytmu Schemat scalania w kroku 2.4: 55 12 12 17 17 15 7 45 15 7 77 20 20 21 21 45 8 34 12 11 45 7 15 8 8 12 11 4 34 s. 45 34 p. s. 11 12 scalanie 8 4 p. s. 7 34 12 11 45 s. 7 8 p. 15 12 17 20 21 4 podział p. 7 12 11 4 podział 15 7 5 8 podział 4 34 scalanie 15 45 4 11 12 34 scalanie 4 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 13 7 8 11 12 15 34 45 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 14 Algorytm zachłanny do wyznaczania najkrótszej „sieci kolejowej” METODA ZACHŁANNA Przykład dla N = 9 i M = 15: Bywają zadania, których rozwiązanie może być budowane z fragmentów dobieranych kolejno według zasady: „idź naprzód, bierz najlepsze z tego co pod ręką i już nie oddawaj tego, co masz”. 26 3 12 10 Przykładem zastosowania metody jest algorytm wyznaczania minimalnego drzewa rozpinającego w grafie nieskierowanym 13 15 9 6 16 8 4 Dane wejściowe: skończona liczba punktów (N), odcinki łączące wybrane pary punktów (M) i liczby przypisane podanym odcinkom (ich długość, koszt, waga itp.) 11 1. Wybierz najkrótszy odcinek ze wszystkich podanych, 2. Powtarzaj co następuje, aż do połączenia wszystkich punktów: 2.1. Wyznacz zbiór odcinków, które przyłączają do sieci jakiekolwiek jeszcze nie przyłączone miasto, 2.2. Dołącz do sieci najkrótszy odcinek z tego zbioru Wynik: taki zbiór odcinków, który tworzy najkrótszą sieć połączeń wiążącą wszystkie podane punkty Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 7 14 17 15 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 16 26 3 12 10 7 14 17 13 15 9 6 16 8 4 11 Długość sieci = 63 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 17 3