• Nie Znaleziono Wyników

ALGORYTMY I STRUKTURY DANYCH

N/A
N/A
Protected

Academic year: 2021

Share "ALGORYTMY I STRUKTURY DANYCH"

Copied!
19
0
0

Pełen tekst

(1)

ALGORYTMY I STRUKTURY DANYCH

WYKŁAD 06 Podstawowe struktury danych.

Grażyna Mirkowska PJWSTK, 2003/2004

(2)

Plan wykładu

Stosy

Własności implementacja Przykład: turniej

Kolejki

Własności implementacja

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.

(3)

Podstawowe struktury danych

Algorytmy + struktury Danych = Programy

e1, e2, e3, ..., en

początek koniec

Operacje na listach Operacje na listach

Pobranie elementu z listy.

Wstawianie elementu na listę.

Usuwanie elementu z listy.

top push pop

rear inject eject

Operacje na lewym

końcu listy

Operacje na prawym końcu listy

(4)

Stos i jego własności

< S  E, push, pop, top, empty>

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)

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

element1 next element2

next element3

next

Twierdzenie

Dowolna struktura danych, w której prawdziwe są własności (*) jest izomorficzna z pewną strukturą standardową.

ogniwo

(5)

Abstrakcyjna struktura kolejek

Początek kolejki

Koniec 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

pokaz

(6)

Specyfikacja kolejek FIFO

Q =  E  Q , in, out, first, empty, =  Sygnatura

in : E  Q  Q out : Q  Q

first Q  E empty : Q  Bo

empty(in(e,q))

empty(q)  out(in(e,q)) = q empty(q)  first(in(e,q)) = e

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)

P = { b:= true;

while

(empty(q) empty(q’)  b) do b := (first(q)=first(q’));

q := out(q);

q’:= out(q’) ; od

}

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).

(7)

Impelementacja kolejek

e1

Początek Koniec

e2 e3 ... en

Public class kolejka( ){

ogniwo poczatek;

ogniwo koniec;

...

}

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 ogniwo (int e){

ogniwo next; ...

}

(8)

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

(9)

Przykład : ‘Turniej’

Zadanie polega na znalezieniu elementu drugiego co do wielkości. Metoda – algorytm turniej (por. wykład 03)

2 3

4 5 7 8 1 6

4 5 8 6

5 8

8 5

6 7

(10)

Struktura danych dla algorytmu ‘Turniej’

Następny element głównej listy

Lista elementów, które

przegrały z e (kandydaci do drugiego miejsca)

e’ next e” next

w next

stosp OGNIWO listy

a stospnext

(11)

Algorytm ‘Turniej’ - implementacja

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;

Tworzenie wyników pierwszej rundy

i+3

i+2

i L i+1

e[i] e[i+1]e[i+2]e[i+3]

...

k

l

...

Wkładam na stos element, który przegrał.

(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;

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

x y

{

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 }

(13)

{

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

tab[i] , o ile nie jest zerem, jest liczbą pierwszą

Wszystkie elementy tablicy różne od zera na pozycjach < i są liczbami pierwszymi

Sito Eratostenesa

(14)

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 }

Wartość=2 next Wartość=3

next Wartość=4

next Wartość=5

next

początek

x

y

poprzedni

y

Sito Eratostenesa

(15)

Sito Eratostenesa

Znaleźć wszystkie liczby pierwsze  n.{ 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

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 Znaleźć wszystkie liczby pierwsze  n.

Sito Eratostenesa

(16)

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

Obliczanie wartości wyrażeń

(17)

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))

Stos argumentów

Stos operacji

x

+ y

* z

+ y*zx

x+(y*z)

+-

u x+(y*z)-u

+

x+(y*z)+(-u)

Opis metody

(18)

Wpisz s[i] na stos operacji

s[i] jest operacją

włóż wartość s[i] na stos argumentów

s[i] jest zmienną i := 1

tak

tak

nie

nie s[i] =‘)’

Weź operację o ze stosu Weź ze stosu odpowiednią liczbę argumentów.

Oblicz wynik operacji o na tych argumentach.

Usuń ze stosu

tak

i:=i+1

nie i<n+1

Schemat algorytmu

(19)

OP :=push(s[i],OP)

ARG:= push(val(s[i]),ARG)

i := 1

tak

tak

nie

nie

O := top(OP);

OP :=pop(OP);

a := top(ARG);

ARG := pop(ARG);

b:= top(ARG);

ARG := pop(ARG);

a:= O(a,b)

tak

a := O(a)

i:=i+1

nie

O dwuargumentowa nie tak

i < n+1

cd.

s[i] =‘)’

s[i] jest zmienną s[i] jest operacją

tak

nie

Cytaty

Powiązane dokumenty

Czytamy kolejno znaki wyrażenia i kolejne argumenty operacji wpisujemy na stos argumentów, a kolejno spotkane operacje wpisujemy na stos operacji.. Schemat blokowy algorytmu.

Zadanie Do zbioru reprezentowanego przez drzewo D dołączyć element e, o ile nie należy on jeszcze do etykiet drzewa D.... Zastosowanie: wyszukiwanie

(3) Jeżeli tak otrzymane drzewo nie jest częściowo uporządkowane, to przechodząc wzdłuż drogi od liścia x do korzenia, poprawić etykiety zamieniając etykietę ojca z

Jeśli element e należy do kolejki q, to po skończonej liczbie usunięć kolejnych elementów minimalnych.. dotrę do tego

takie drzewo &lt;V, T&gt; rozpinające grafu G, że suma kosztów jego krawędzi  eT c (e) jest najmniejsza.. Mirkowska, ASD_12 Algorytmy na

Niech będzie tekst 100000 znakowy, w którym występują tylko litery a,b,c,d,e,f i a-45tys razy, b-13tys., c-12tys.,.. d-16tys., e -

Powiemy, że problem jest rozstrzygalny, jeśli istnieje algorytm, który dla dowolnych danych x po skończonej liczbie kroków daje rozwiązanie problemu. W przeciwnym

Dowód przez indukcję ze względu na liczbę wywołań rekurencyjnych funkcji min_max.. Dla jednego tylko wywołania