Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH WYKŁAD 06 Podstawowe struktury danych. Grażyna Mirkowska PJWSTK, 2004
2
G. Mirkowska, ASD_06 Podstawowe struktury danych
Plan wykładu Stosy Własności implementacja Przykład: turniej Kolejki Przykład : sito Eratostenesa Listy Przykład zastosowań Obliczanie wartości wyrażeń MOTTO Struktury danych modyfikują świat, w którym realizowany jest algorytm, usprawniają działanie, ułatwiają zrozumienie algorytmu. G. Mirkowska, ASD_06 Podstawowe struktury danych
3
Podstawowe struktury danych
Algorytmy + struktury Danych = Programy e1, e2, e3, ..., en Lista początek koniec STOS Operacje na lewym końcu listy Operacje na listach top push pop Operacje na prawym końcu listy Pobranie elementu z listy. Wstawianie elementu na listę. Usuwanie elementu z listy. rear inject eject G. Mirkowska, ASD_06 Podstawowe struktury danych
4
G. Mirkowska, ASD_06 Podstawowe struktury danych
Stos i jego własności < S E, push, pop, top, empty> element3 next push(s, e) = (e, e1,e2,..., en) pop(s) = (e2,..., en), o ile n>1 top(s) = e1 empty(s) wttw n = 0 s = (e1,e2,..., en) ogniwo Twierdzenie Dowolna struktura danych, w której prawdziwe są własności (*) jest izomorficzna z pewną strukturą standardową. element2 next Własności (*) element1 next top(push(s,e)) = e op(push(s,e)) = s empty(s) => push(pop(s),top(s)) = s while not empty(s) do s:=pop(s)od ma własność stopu G. Mirkowska, ASD_06 Podstawowe struktury danych
5
Abstrakcyjna struktura kolejek
Koniec kolejki Zasada -- FIFO pokaz Początek kolejki Standardowa struktura kolejek 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 G. Mirkowska, ASD_06 Podstawowe struktury danych
6
Specyfikacja kolejek FIFO
Sygnatura in : E Q Q out : Q Q first Q E empty : Q Bo Q = E Q , in, out, first, empty, = Twierdzenie Każda struktura danych ze zbiorem elementów E, w której prawdziwe są wszystkie wymienione aksjomaty kolejek jest izomorficzna z modelem standardowym kolejek Q(E). empty(q) out(in(e,q)) = q empty(q) first(in(e,q)) = e empty(in(e,q)) Aksjomaty P = { b:= true; while (empty(q) empty(q’) b) do b := (first(q)=first(q’)); q := out(q); q’:= out(q’) ; od } empty(q) first(in(e,q)) = first(q) empty(q) in(e,out(q)) = out(in(e,q)) while empty(q) do q := out(q) od ten program nie zapętla się q =q’ wttw P (empty(q) empty(q’) b) G. Mirkowska, ASD_06 Podstawowe struktury danych
7
Koszty operacji ! Impelementacja kolejek e1 e2 e3 en ...
Początek Koniec e2 e3 en ... Public class ogniwo (int e){ ogniwo next; } 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 } Public class kolejka( ){ ogniwo poczatek; ogniwo koniec; } Koszty operacji ! G. Mirkowska, ASD_06 Podstawowe struktury danych
8
G. Mirkowska, ASD_06 Podstawowe struktury danych
Listy Kolejki i Stosy są przykładami struktur listowych. Operacje na listach Dostęp do elementu listy Podlista Złożenie wkładanie elementu Usuwanie elementu Realizacje : - Tablicowa - dowiązaniowa ... Lista : jednokierunkowa, cykliczna dwukierunkowa Dwukierunkowa cykliczna G. Mirkowska, ASD_06 Podstawowe struktury danych
9
G. Mirkowska, ASD_06 Podstawowe struktury danych
Przykład : ‘Turniej’ Zadanie polega na znalezieniu elementu drugiego co do wielkości. Metoda – algorytm turniej (por. wykład 03) 2 3 4 6 1 8 7 5 7 Metoda - Turniej 4 5 8 6 6 5 5 8 8 G. Mirkowska, ASD_06 Podstawowe struktury danych
10
Struktura danych dla algorytmu ‘Turniej’
w next stosp LISTA Następny element głównej listy a next stosp OGNIWO listy Lista elementów, które przegrały z e (kandydaci do drugiego miejsca) e’ next e” STOS G. Mirkowska, ASD_06 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 L:= push(i,L); L.stosp := push(i+1, L.stosp); else L:= push(i+1, L); L.stosp := push(i, L.stosp); fi; od; e[i] e[i+1] e[i+2] e[i+3] ... Wkładam na stos element, który przegrał. ... k l i+3 i+2 i i+1 L G. Mirkowska, ASD_06 Podstawowe struktury danych
12
Budowa drzewa turnieju
while not empty(L.next) do x := L; 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; x y Dołącz y do elementów, które przegrały z x { z := L.stos; drugi := z.w; z :=pop(z); while not empty(z) do if e[drugi ] < e[top(z)] then drugi := top(z) fi; z := pop(z); od } Dołącz x do elementów, które przegrały z y Rozważmy pierwszy element następnej pary G. Mirkowska, ASD_06 Podstawowe struktury danych
13
z tablicą Niezmiennik 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 } Tablica wszystkich liczb naturalnych n Wykreślam z tablicy wszystkie liczby podzielne przez i Niezmiennik Wszystkie elementy tablicy różne od zera na pozycjach < i są liczbami pierwszymi tab[i] , o ile nie jest zerem, jest liczbą pierwszą G. Mirkowska, ASD_06 Podstawowe struktury danych
14
G. Mirkowska, ASD_06 Podstawowe struktury danych
Sito Eratostenesa Sito Eratostenesa z listą { 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 } początek x Wartość=2 next Wartość=3 Wartość=4 Wartość=5 poprzedni y y Jak to działa? G. Mirkowska, ASD_06 Podstawowe struktury danych
15
z kolejką Sito Eratostenesa Sito Eratostenesa
Znaleźć wszystkie liczby pierwsze n. 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 { p:= null; wynik := null; for i := 2 to n do p := in(i,p) od; 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 } Znaleźć wszystkie liczby pierwsze n. Usuwamy z kolejki p wszystkie liczby podzielne przez i G. Mirkowska, ASD_06 Podstawowe struktury danych
16
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. Definicja Obliczyć wartość danego wyrażenia algebraicznego. Zadanie 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. G. Mirkowska, ASD_06 Podstawowe struktury danych
17
G. Mirkowska, ASD_06 Podstawowe struktury danych
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ę. Metoda ((x+(y*z))+(-u)) z y x y*z u x+(y*z) -u x x+(y*z) x+(y*z)+(-u) Przykład Stos argumentów * - + + + + Stos operacji G. Mirkowska, ASD_06 Podstawowe struktury danych
18
Schemat algorytmu i:=i+1 i := 1 i<n+1 s[i] jest operacją nie tak
s[i] jest zmienną Wpisz s[i] na stos operacji nie tak s[i] =‘)’ tak włóż wartość s[i] na stos argumentów nie Weź operację o ze stosu Weź ze stosu odpowiednią liczbę argumentów. Oblicz wynik operacji o na tych argumentach. i:=i+1 Usuń ze stosu wykonaną operacje i użyte argumenty Wpisz wynik na stos argumentów G. Mirkowska, ASD_06 Podstawowe struktury danych
19
A jaki jest koszt ? cd. i:=i+1 i := 1 nie tak s[i] jest operacją nie
s[i] jest zmienną tak nie s[i] =‘)’ OP :=push(s[i],OP) tak nie tak O := top(OP); OP :=pop(OP); a := top(ARG); ARG := pop(ARG); ARG:= push(val(s[i]),ARG) O dwuargumentowa nie tak a := O(a) b:= top(ARG); ARG := pop(ARG); a:= O(a,b) i:=i+1 G. Mirkowska, ASD_06 Podstawowe struktury danych ARG:= push(a,ARG)
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.