ALGORYTMY I STRUKTURY DANYCH

advertisement
ALGORYTMY I STRUKTURY DANYCH
WYKŁAD 04 Podstawowe struktury danych.
Grażyna Mirkowska
PJWSTK, II rok semestr letni 2003
Plan wykładu

Stosy
– Własności
– implementacja
– Przykład: turniej
 Kolejki
– Własności
– implementacja
– Przykład : sito Eratostenesa
 Listy
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
2
Podstawowe struktury danych
Algorytmy + struktury Danych = Programy
e1, e2, e3, ..., en
początek
koniec
Operacje na listach
Pobranie elementu z listy.
Wstawianie elementu na listę.
Usuwanie elementu z listy.
marzec 2003
top
push
pop
rear
inject
eject
G. Mirkowska, ASD_04 Podstawowe struktury
danych
Operacje na
lewym
końcu listy
Operacje na
prawym
końcu listy
3
Stos i jego własności
< S  E, push, pop, top, empty>
s = (e1,e2,..., en)
push(s, e) = (e, e1,e2,..., en)
pop(s) = (e2,..., en) o ile n>1
ogniwo
top(s) = e1
empty(s) wttw n=0
top(push(s,e)) = e
pop(push(s,e))= s
not empty(s) => push(pop(s),top(s))=s
Istnieje i takie że empty(popi(s))
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
element3
next
element2
next
element1
next
4
Abstrakcyjna struktura kolejek
Koniec
kolejki
pokaz
Standardowa struktura kolejek
Początek
kolejki
First(e1,...en) = e1 , gdy n>0 i nieokr. w p.p.
In((e1,...,en),e) = (e1,e2,...,en, e)
Out(e1,...en) = (e2,...,en) , gdy n>0 i nieokr. w p.p.
Empty(e) wttw e jest ciągiem pustym
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
5
Specyfikacja kolejek FIFO
Q =  E  Q , in, out, first, empty, = 
in : E  Q  Q
out : Q  Q
first Q  E
empty : Q  Bo
empty(q)  out(in(e,q)) = q
empty(q)  first(in(e,q)) = e
empty(in(e,q))
empty(q)  first(in(e,q)) = first(q)
Sygnatura
marzec 2003
empty(q)  in(e,out(q)) = out(in(e,q))
G. Mirkowska, ASD_04 Podstawowe struktury
danych
6
Specyfikacja kolejek FIFO
Q =  E  Q , in, out, first, empty, = 
in : E  Q  Q
out : Q  Q
first : Q  E
empty : Q  Bo
while empty(q) do q := out(q) od
ten program nie zapętla się
P = {b:=true;
while (empty(q) empty(q’)  b)
q =q’ wttw
do
Po wykonaniu programu P
b := (first(q)=first(q’));
spełniony jest warunek
q := out(q);
(empty(q)  empty(q’)  b)
q’:= out(q’) ;
od
}
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
7
Impelementacja kolejek
e1
e2
Public class kolejka( ){
ogniwo poczatek;
ogniwo koniec;
.....................
marzec 2003
...
en
Public class ogniwo (int e){
ogniwo next; ........
}
Początek
Koniec
}
e3
Public kolejka in (int e; kolejka q){
o = New ogniwo(e);
o. next = null;
if (q=null) {q = New kolejka();
q.początek = o;}
else q.koniec.next = o;
q.koniec = o;
return q
}
G. Mirkowska, ASD_04 Podstawowe struktury
danych
8
Listy
Kolejki i Stosy są szczególnymi
przykładami struktur listowych.
Operacje na listach
• Dostęp do elementu listy
• Podlista
Realizacje :
- Tablicowa
- dowiązaniowa
• Złożenie
• wkładanie elementu
...
• Usuwanie elementu
Lista : jednokierunkowa,
cykliczna
dwukierunkowa
Dwukierunkowa cykliczna
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
9
Przykład : Algorytm ‘Turniej’
Metoda polega na porównywaniu sąsiednich elementów
ciągu. Elementy większe (wygrywające) przechodzą do
następnej ‘rundy’.Elementu drugiego co do wielkości
szukamy wśród elementów, które przegrały z największym.
4
2
3
4
5
7
5
8
1
8
5
6
6
8
8
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
10
Struktura danych dla algorytmu ‘Turniej’
Następny element głównej listy
next
OGNIWO
w
listy
stosp
marzec 2003
e’
next
e”
next
a
next
stosp
Lista elementów, które
przegrały z e (kandydaci do
drugiego miejsca)
G. Mirkowska, ASD_04 Podstawowe struktury
danych
11
Algorytm ‘Turniej’ - implementacja
Tworzenie wyników pierwszej rundy
for i := 1 to n div 2 do
if e[i] > e[i+1] then
... e[i] e[i+1]e[i+2]e[i+3]
L:= push(i,L);
L.stosp := push(i+1, L.stosp);
Wkładam na stos element, który
else
przegrał.
L:= push(i+1, L);
L.stosp := push(i, L.stosp);
fi;
...
k
od;
L
marzec 2003
i+3
l
i
i+2
G. Mirkowska, ASD_04 Podstawowe struktury
danych
i+1
12
Budowa drzewa turnieju
while not empty(L.next) do
x := L;
x
while not empty(x) do
y := x.next;
if e[x.w] > e[y.w] then
x.stosp := push (x.stosp, y.w)
else
y.stosp := push(y.stosp, x.w);
x.w := y.w;
x.stosp := y.stosp
fi;
x.next := y.next;
x := x.next
od
od;
marzec 2003
y
Dołącz y do elementów,
które przegrały z x
Dołącz x do elementów,
które przegrały z y
Rozważmy pierwszy
element następnej pary
G. Mirkowska, ASD_04 Podstawowe struktury
danych
13
III etap - przeszukiwanie stosu
{
Pom := L.stos;
drugi := pom.w; pom :=pop(pom);
while not empty(pom) do
if e[drugi ] < e[top(pom)] then
drugi := top(pom)
fi;
pom := pop(pom);
od
}
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
14
Przykład: Sito Eratostenesa
{
for i := 2 to n do tab[i] := i od;
for i := 2 to n do
if tab[i] <>0 then
for j := i+1 to n do
if ( tab[j] mod i = 0) then
tab[j] := 0;
fi;
od;
fi
od }
tab[i] , o ile nie jest zerem, jest
liczbą pierwszą
marzec 2003
Tablica wszystkich liczb
naturalnych  n
Wykreślam z tablicy
wszystkie liczby
podzielne przez i
Wszystkie elementy
tablicy różne od zera
na pozycjach < i są
liczbami pierwszymi
G. Mirkowska, ASD_04 Podstawowe struktury
danych
15
Sito Eratostenesa
{ poczatek := new ogniwo(2);
x := początek;
for i := 3 to n do
x.next:= new ogniwo(i); x:= x.next; od;
x := początek;
while x<>null do
w:= x.wartość;
poprzedni := x; y :=x.next;
while y<>null do
if ( y.wartość mod w = 0) then
poprzedni.next := y.next;
else poprzedni := y;
fi;
y := y.next;
od;
x:= x.next;
od }
marzec 2003
poczatek
poprzedni
G. Mirkowska, ASD_04 Podstawowe struktury
danych
Wartość=2
x
next
y
Wartość=3
next
Wartość=4
next
Wartość=5
next
16
Sito Eratostenesa
Znaleźć wszystkie liczby pierwsze  n.
{ p:= null; wynik := null;
Znaleźć
wszystkie
pierwsze
for i :=
2 to n doliczby
p := in(i,p)
od;  n.
while not empty(p) do
i := first(p);
wynik := in(i,wynik);
p := out(p);
q:= null;
while not empty(p) do
if (first(p) mod i <>0) then
q := in(first(p), q)
fi;
p := out(p)
od;
p := q
od }
marzec 2003
Kolejka wynik zawiera
wszystkie liczby pierwsze <
first(p).
Kolejka p zawiera liczby n,
które nie dzielą się przez
żadną z liczb x należących
do kolejki wynik
Usuwamy z kolejki p
wszystkie liczby
podzielne przez i
G. Mirkowska, ASD_04 Podstawowe struktury
danych
17
Obliczanie wartości wyrażeń
Zbiorem wyrażeń algebraicznych WA nazywać
będziemy najmniejszy zbiór napisów nad alfabetem
{x,y,z,u}  {+,* -}  {(,)} taki, że
(1) x,y, z, u WA
(2) jeśli w1, w2  WA , to (w1+w2) oraz (w1*w2)
należą do WA,
(3) Jeśli w  WA, to (-w)  WA.
Obliczyć wartość danego wyrażenia
algebraicznego.
Uwagi -założenia : 1. Wyrażenie jest zapisane w tablicy znakowej o
elementach s[1],...,s[n].
2. Wartości zmiennych są zapisane w obiekcie v, którego atrybutami
są x,y,z,u.
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
18
Opis metody
Czytamy kolejno znaki wyrażenia i kolejne argumenty operacji
wpisujemy na stos argumentów, a kolejno spotkane operacje
wpisujemy na stos operacji. Pojawienie się ‘)’ sygnalizuje, że
można wykonać ostatnio zapamiętaną operację.
((x+(y*z))+(-u))
z
y
x
y*z
u
-u
x x+(y*z) x+(y*z) x+(y*z)+(-u)
Stos argumentów
*
+ +
+
+
Stos operacji
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
19
i := 1
Schemat blokowy algorytmu
i<n+1
s[i] jest operacją
tak
nie
Wpisz s[i] na
stos operacji
s[i] jest zmienną
nie
tak
nie
włóż wartość s[i] na
stos argumentów
i:=i+1
Wpisz wynik na
stos argumentów
marzec 2003
G. Mirkowska, ASD_04 Podstawowe struktury
danych
s[i] =‘)’
tak
Weź operację o ze stosu
Weź ze stosu odpowiednią
liczbę argumentów.
Oblicz wynik operacji o
na tych argumentach.
Usuń ze stosu
wykonaną operacje
i użyte argumenty
20
i := 1
i < n+1
s[i] jest operacją
tak
nie
s[i] jest zmienną
OP :=push(s[i],OP)
nie
tak
nie
ARG:= push(val(s[i]),ARG)
tak
O := top(OP);
OP :=pop(OP);
a := top(ARG);
ARG := pop(ARG);
i:=i+1
nie
a := O(a)
marzec 2003
s[i] =‘)’
G. Mirkowska, ASD_04ARG:=
Podstawowe
struktury
push(a,ARG)
danych
O dwuargumentowa
tak
b:= top(ARG);
ARG := pop(ARG);
a:= O(a,b)
21
Download