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