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