• Nie Znaleziono Wyników

ALGORYTMY I STRUKTURY DANYCH

N/A
N/A
Protected

Academic year: 2021

Share "ALGORYTMY I STRUKTURY DANYCH"

Copied!
15
0
0

Pełen tekst

(1)

ALGORYTMY I STRUKTURY DANYCH

WYKŁAD 07 Kolejki, listy, stosy Grażyna Mirkowska

PJWSTK, semestr zimowy 2002/2003

(2)

Plan wykładu

Kolejki

Specyfikacja implementacja

Listy

Przykłady zastosowań

Sito

Obliczanie wartości wyrażeń

MOTTO Struktury danych modyfikują świat, w którym realizowany jest algorytm, usprawniają działanie,

ułatwiają zrozumienie algorytmu.

(3)

Abstrakcyjna struktura kolejek

Początek kolejki

Koniec kolejki

pokaz

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

(4)

Specyfikacja kolejek FIFO

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

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

empty : Q  Bo

Sygnatura

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

(5)

while empty(q) do q := out(q) od ten program nie zapętla się

q =q’ wttw

Po wykonaniu programu P spełniony jest warunek

(empty(q)  empty(q’)  b)

Specyfikacja kolejek FIFO

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

in : E  Q  Q out : Q  Q first : Q  E empty : Q  Bo

P = {b:=true;

while (empty(q) empty(q’)  b) do

b := (first(q)=first(q’));

q := out(q);

q’:= out(q’) ; od

}

(6)

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

}

(7)

Listy

Kolejki i Stosy są szczególnymi 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

(8)

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

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

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

(9)

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

poczatek

x

y

poprzedni

(10)

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 x wynik

Usuwamy z kolejki p wszystkie liczby podzielne przez i

(11)

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.

(12)

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

Stos argumentów

Stos operacji

x

+ y

* z

+ y*zx

x+(y*z)

+-

u x+(y*z)-u

+

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

(13)

Schemat blokowy algorytmu

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 wykonaną operacje

i użyte argumenty

tak

Wpisz wynik na stos argumentów

i:=i+1

nie i<n+1

(14)

Wpisz s[i] na stos operacji OP

s[i] jest operacją

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

s[i] jest zmienną i := 1

tak

tak

nie

nie

s[i] =‘)’

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 i<n+1

O dwuargumentowa nie tak

(15)

Zadanie do domu

Napisać implementację

omówionego algorytmu obliczania

wartości wyrażeń arytmetycznych.

Cytaty

Powiązane dokumenty

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

Problem Dany jest ciąg rosnący e[1],..,e[n] oraz element x pewnej przestrzeni liniowo uporządkowanej &lt;E, &gt;. Następnie porównujemy x z kolejnymi elementami ciągu