Datové struktury a algoritmy Část 5 Ab straktní datové typy

61
Datové struktury a algoritmy Část 5 Abstraktní datové typy Petr Felkel

description

Datové struktury a algoritmy Část 5 Ab straktní datové typy. Petr Felkel. Dat a stru ctures and algorithms Part 5 A bstra ct dat a typ es. Petr Felkel. Abstraktní datové typy. Abstrahují od jak ? Jak jsou data zobrazena v paměti … Jak jsou prováděny operace … Zdůrazňují co ? - PowerPoint PPT Presentation

Transcript of Datové struktury a algoritmy Část 5 Ab straktní datové typy

Page 1: Datové struktury a algoritmy Část 5 Ab straktní datové typy

Datové struktury a algoritmy

Část 5

Abstraktní datové typy

Petr Felkel

Page 2: Datové struktury a algoritmy Část 5 Ab straktní datové typy

Data structures and algorithms

Part 5

Abstract data types

Petr Felkel

Page 3: Datové struktury a algoritmy Část 5 Ab straktní datové typy

3 / 61 DSA

Abstraktní datové typy• Abstrahují od jak?

• Jak jsou data zobrazena v paměti…

• Jak jsou prováděny operace…

• Zdůrazňují co? • Co s nimi operace s daty provádějí

nezávisle na konkrétní implementaci

Page 4: Datové struktury a algoritmy Část 5 Ab straktní datové typy

4 / 61 DSA

Abstract data types• Abstract from: How?

• How is the data stored in memory?

• How are the operations executed?

• Emphasize: What? • What do the operations do with the data

(independent of any particular implementation)?

Page 5: Datové struktury a algoritmy Část 5 Ab straktní datové typy

5 / 61 DSA

Abstraktní datové typy Fronta (Queue)

Zásobník (Stack)

Pole (Array)

Tabulka (Table)

• Seznam (List)

• Strom (Tree)

• Množina (Set)

Page 6: Datové struktury a algoritmy Část 5 Ab straktní datové typy

6 / 61 DSA

Seznam (List)• Posloupnost údajů

• Ukazovátko

• Pouze v místě ukazovátka lze přidat / zrušit / aktualizovat prvek

• Homogenní, lineární, dynamická

Page 7: Datové struktury a algoritmy Část 5 Ab straktní datové typy

7 / 61 DSA

List (Seznam)• Sequence of items

• Marker

• Insert, delete, update only where points the marker

• Homogeneous, linear, dynamic

Page 8: Datové struktury a algoritmy Část 5 Ab straktní datové typy

8 / 61 DSA

List (Seznam)

ListElem

readinit

Bool

Nat

insertempty,full delete,

first,lastnext,prev

length

Page 9: Datové struktury a algoritmy Část 5 Ab straktní datové typy

9 / 61 DSA

List (Seznam)init: -> Listinsert(_,_): Elem, List -> Listread(_): List -> Elemdelete(_), first(_), last(_)next(_), prev(_): List -> Listlength(_): List -> Natempty(_), full(_)atbeg(_), atend(_): List -> Bool

Page 10: Datové struktury a algoritmy Část 5 Ab straktní datové typy

10 / 61 DSA

List (Seznam)

Pomocný druh Seq = posloupnost bez ukazovátka

Pomocné operace:new: -> Seq ... prázdná posloupnostcons(_,_): Elem, Seq -> Seqcons2(_,_): Elem, List -> List

... vlož do čelamark(_): Seq -> List ... ukaz. do čela

Page 11: Datové struktury a algoritmy Část 5 Ab straktní datové typy

11 / 61 DSA

List (Seznam)

cons2( a, cons2( b, mark( cons( c, cons( d, new )))))

a b c d

Example:

Page 12: Datové struktury a algoritmy Část 5 Ab straktní datové typy

12 / 61 DSA

List – insert

Where to insert?

Where to leave the marker?

a b c d

x

a b c d

a b c d

x

a b c d

x

a b c d

x

Page 13: Datové struktury a algoritmy Část 5 Ab straktní datové typy

13 / 61 DSA

List – delete

Where to leave the marker?

a b d

a b c d

a b d

On the next

On the previous

Page 14: Datové struktury a algoritmy Část 5 Ab straktní datové typy

14 / 61 DSA

var: x,y:Elem, s:Seq, l:Listinit = mark( new )

insert( x, mark(s) ) = cons2( x, mark(s))

... Insert BEFORE the pointer

insert( x, cons2( y, l ))= cons2( y, insert( x, l ))

List (Seznam)

x

x

x

x

y

y

Page 15: Datové struktury a algoritmy Část 5 Ab straktní datové typy

15 / 61 DSA

delete( init ) = init

delete( mark( cons( x, s))) = mark( s )

... delete by the pointer

delete( cons2( x, l )) = cons2( x, delete( l ))

... delete by the pointer

List (Seznam)

x

x

x

Page 16: Datové struktury a algoritmy Část 5 Ab straktní datové typy

16 / 61 DSA

List (Seznam)next( init ) = init

next( mark( cons( x, s ) ) ) = cons2( x, mark( s ) )

next( cons2( x, l ) ) = cons2( x, next( l ) )

x x

x x

... pointer move

..no change before

Page 17: Datové struktury a algoritmy Část 5 Ab straktní datové typy

17 / 61 DSA

List (Seznam)prev( mark(s) ) = mark(s)

prev( cons2( x, mark( s ) ) ) = mark( cons( x, s ))

prev( cons2( x, cons2( y, l ))) = cons2( x, prev( cons2( y, l )))

x x ... move inside y

x x ... move by head

y

Page 18: Datové struktury a algoritmy Část 5 Ab straktní datové typy

18 / 61 DSA

List (Seznam)first( mark(s) ) = mark(s)

first( cons2( x, l ) ) = first( prev( cons2( x, l ) ) )

x x ... move step by step to front

... no move by head

Page 19: Datové struktury a algoritmy Část 5 Ab straktní datové typy

19 / 61 DSA

List (Seznam)last( init ) = init

last( mark( cons( x, s ) ) ) = cons2( x, last( mark( s ) ) )

last( cons2( x, l ) ) = cons2( x, last( l ) )

x x

x x

... move back

…no change before

Page 20: Datové struktury a algoritmy Část 5 Ab straktní datové typy

20 / 61 DSA

List (Seznam)read( init ) = error_elem

read( cons2( x, l ) = read( l )

read( mark( cons( x, s ))) = x

Page 21: Datové struktury a algoritmy Část 5 Ab straktní datové typy

21 / 61 DSA

List (Seznam)length( init ) = 0

length( cons2( x, l )) = succ( length( l ) )

length( mark( cons( x, s ))) = succ( length( mark( s )))

... elements before the pointer

... elements after the pointer

Page 22: Datové struktury a algoritmy Část 5 Ab straktní datové typy

22 / 61 DSA

List (Seznam)empty( l ) = ( length( l ) == 0 )

full( l ) = ( length( l ) == max )

atbeg( mark( s )) = trueatbeg( cons2( x, l )) = false

atend( mark( new)) = trueatend( mark( cons( x, s )))= falseatend( cons2( x, l )) = atend( l )

Page 23: Datové struktury a algoritmy Část 5 Ab straktní datové typy

23 / 61 DSA

List implementation In Array O(n) insert, delete

O(1) first, last, prev, next In Array

(head)

1 2 30 4 5

BA C D

tailpoint

1 2 30 4 5

BA C D

(tail)point(head)

Stacks in Array O(1) insert, delete, prev, next

O(n) first, last, …

BA C D

point

Page 24: Datové struktury a algoritmy Část 5 Ab straktní datové typy

24 / 61 DSA

List implementation O(1) insert, O(1)..O(n) delete

O(1) first, last, prev, next

- memory for pointers

In Dynamic memory

tailhead

B CA point len 3

tailhead

B CA point len 3

tailhead

point len B CA3

Linked list

Double linked list

Circular double linked list

Page 25: Datové struktury a algoritmy Část 5 Ab straktní datové typy

25 / 61 DSA

List implementation

tailhead

B CA point len 3

Linked listlist::insert( elem x ) { item *help = new item; if( point == NULL ){ //point behind help->next = NULL; help->val = x; if( tail == NULL ) //empty list head = help; else //add at end tail->next = help; tail = help; } //point still points behind list! else { //point in the list - trick help->val = point->val; help->next = point->next; point->next = help; point->val = x; point = help; } len++;}

tailhead

x CA point len 3

B

help

Page 26: Datové struktury a algoritmy Část 5 Ab straktní datové typy

26 / 61 DSA

List implementationLinked list

list::delete( ) { item *help; if( point != NULL ){ //behind ignore if( point->next == NULL ) { //last help = head; //find predecessor while( help->next != point ) help = help->next;

} help->next = NULL; point = NULL; delete( tail ); tail = help; } else {// trick: skip predec.search help = point->next; *point = *help; if( help == tail ) tail = point; delete( help ); } len--; }}

tailhead

B CA point len 3

help

tailhead

B DA point len

C

help

4

B DA D

help

3

tailhead

point len

Page 27: Datové struktury a algoritmy Část 5 Ab straktní datové typy

27 / 61 DSA

List implementation

tailhead

B CA point len 3

Linked listlist::prev( ) { item *help; if( point != head){//point can move help = head; while( help->next != point ) help = help->next; point = help; }}

tailhead

x CA point len 4

B

help

Page 28: Datové struktury a algoritmy Část 5 Ab straktní datové typy

28 / 61 DSA

List implementation

tailhead

B CA point len 3

Double linked listlist::prev( ) { item *help; if( point != head){//point can move point = point->prev; }}

Prev is the only place to save!

Page 29: Datové struktury a algoritmy Část 5 Ab straktní datové typy

29 / 61 DSA

List implementation

tailhead

B CA point len 3

Double linked listlist::delete( ) { item *help; if( point != NULL ){ //behind ignore help = point->next ; if( head == point ) //first elem head = help; if( tail == point ) //last elem tail = tail->prev; if( help != NULL ) //update prev help->prev = point->prev; //update next if( point->prev != NULL ); point->prev->next = help;

delete( point ); point = help;

len--; }}

Page 30: Datové struktury a algoritmy Část 5 Ab straktní datové typy

30 / 61 DSA

List implementation

point len

B CA

3

Circular double linked list

tailhead

list::delete( ) { item *help; if( point != list ){ //not at end point->prev->next = point->next; point->next->prev = point->prev;

help = point; point = point->next;

delete( help );

len--; }}

list::prev( ) { if( !atBegin() ) //point!=list->head point = point->prev;}

list

help

Page 31: Datové struktury a algoritmy Část 5 Ab straktní datové typy

31 / 61 DSA

Abstraktní datové typy Fronta (Queue)

Zásobník (Stack)

Pole (Array)

Tabulka (Table)

Seznam (List)

• Strom (Tree)

• Množina (Set)

Page 32: Datové struktury a algoritmy Část 5 Ab straktní datové typy

32 / 61 DSA

Strom (Tree)• Kdy?

• řazení, vyhledávání, vyhodnocování výrazů, ...

• acyklický souvislý graf

• kořenový strom • orientovaný strom, zvláštní uzel - kořen• kořen spojen se všemi uzly orient. cestou• binární strom - má 0, (1), 2 následníky

• uspořádaný binární strom - dvojice <u, u1> a <u, u2> jsou uspořádány

Page 33: Datové struktury a algoritmy Část 5 Ab straktní datové typy

33 / 61 DSA

Tree (Strom)• When?

• sorting, searching, evaluation of expressions, ...

• acyclic connected graph

• root tree• oriented tree, special node - root• root connected to all nodes by oriented path• binary tree - has 0, (1), 2 successors

• ordered binary tree - pairs <u, u1> and <u, u2> are ordered

Page 34: Datové struktury a algoritmy Část 5 Ab straktní datové typy

34 / 61 DSA

Strom (Tree)• uzel - více následníků

• binární strom - 2 následníci

• následník - opět strom

• homogenní, nelineární, dynamická

Page 35: Datové struktury a algoritmy Část 5 Ab straktní datové typy

35 / 61 DSA

Tree (Strom)• node - more successors

• binary tree - 2 successors

• successor - also a tree

• homogeneous, nonlinear, dynamic

Page 36: Datové struktury a algoritmy Část 5 Ab straktní datové typy

36 / 61 DSA

Binární strom (Tree)

TreeElem

infoempty

Bool

cons

null

left,right

leaf

setleft,setright

Page 37: Datové struktury a algoritmy Část 5 Ab straktní datové typy

37 / 61 DSA

Binární strom (Tree)empty: -> Treeleaf(_): Elem -> Treecons(_,_,_): Elem, Tree, Tree

->Treeleft(_), right(_): Tree -> Treenull(_): Tree -> Bool setleft, setright(_,_): Tree, Tree -> Treesetinfo( Tree, Elem ): -> Treeinfo(_): Tree -> Elem

Page 38: Datové struktury a algoritmy Část 5 Ab straktní datové typy

38 / 61 DSA

Binární strom (Tree)var x: Elem; a,b,t: tree

leaf( x ) = cons( x, empty, empty)

left( empty ) = error_treeleft( cons( x, a, b)) = a

right( empty ) = error_treeright( cons( x, a, b)) = b

Page 39: Datové struktury a algoritmy Část 5 Ab straktní datové typy

39 / 61 DSA

Binární strom (Tree)null( empty ) = truenull( cons( x, a, b)) = false

setleft( empty, t ) = error_treesetleft( cons( x, a, b ), t ) = cons( x, t, b )

setright( empty, t ) = error_treesetright( cons( x, a, b ), t ) = cons( x, a, t )

Page 40: Datové struktury a algoritmy Část 5 Ab straktní datové typy

40 / 61 DSA

Binární strom (Tree)setinfo( empty, x ) = error_treesetinfo( cons( x, a, b ), y ) = cons( y, a, b )

info( empty ) = error_eleminfo( cons( x, a, b ) ) = x

Page 41: Datové struktury a algoritmy Část 5 Ab straktní datové typy

41 / 61 DSA

Abstraktní datové typy Fronta (Queue)

Zásobník (Stack)

Pole (Array)

Tabulka (Table)

Seznam (List)

Strom (Tree)

• Množina (Set)

Page 42: Datové struktury a algoritmy Část 5 Ab straktní datové typy

42 / 61 DSA

Parametrické datové typy• Nové typy

• obohacováním původních o druhy a operace

• často stejné, jen nad jinými základy

• liší se jen některými prvky

=> parametrický datový typodlišné prvky - parametry

Page 43: Datové struktury a algoritmy Část 5 Ab straktní datové typy

43 / 61 DSA

Množinatyp: MNOŽINA( ELEMENT )

parametr: typ prvků ELEMENT

požadavky na parametr:

druhy: Elem

operace: eq(_,_): Elem, Elem -> Bool

použité typy: ELEMENT, přirozená čísla, logické hodnoty

druhy: Elem, Bool, Set, Nat

Page 44: Datové struktury a algoritmy Část 5 Ab straktní datové typy

44 / 61 DSA

Množinaoperace:

[]: Set (prázdná množina)

ins(_,_): Elem,Set ->Set (vložení prvku)

del(_,_): Elem,Set ->Set (zrušení -“- )

in(_,_) : Elem,Set ->Bool(test přísluš.)

card(_) : Set->Nat (počet prvků)

Page 45: Datové struktury a algoritmy Část 5 Ab straktní datové typy

45 / 61 DSA

Množina bez opakováníproměnné:

s: Set, x,y: Elemaxiomy:

ins(x,s) = if in(x,s) then s del(x,[])=[]

del(x,ins(y,s))= if eq(x,y) then del(x,s)else

ins(y,del(x,s))

bez opakování prvků

nezáleží na pořadí vkládání

Page 46: Datové struktury a algoritmy Část 5 Ab straktní datové typy

46 / 61 DSA

Množina bez opakováníaxiomy: (pokračování)

in(x,[]) = false

in(x,ins(y,s))= if eq(x,y)then true

else in(x,s)

card([]) = 0

card(ins(x,s)) = if(in(x,s)) card(s) else succ(card(s))

Page 47: Datové struktury a algoritmy Část 5 Ab straktní datové typy

47 / 61 DSA

Množina bez opakováníaxiomy: (pokračování)

eq([],[]) = true eq([], ins(x, t)) = false

eq(s,t) = eq(t,s)

eq(ins(x,s),t) = if in(x,s) then eq(s,t) else if in(x,t)

then eq(s,del(x,t))

else false

bez opakování prvků

Page 48: Datové struktury a algoritmy Část 5 Ab straktní datové typy

48 / 61 DSA

Abstraktní datové typy Fronta (Queue)

Zásobník (Stack)

Pole (Array)

Tabulka (Table)

Seznam (List)

Strom (Tree)

Množina (Set)

Page 49: Datové struktury a algoritmy Část 5 Ab straktní datové typy

49 / 61 DSA

Appendix A

Bool example

Page 50: Datové struktury a algoritmy Část 5 Ab straktní datové typy

50 / 61 DSA

Bool data type - signature• Logical value - Bool

• Diagram:

Symbolic: see next slide

true,false

Bool and,eq

not

Page 51: Datové struktury a algoritmy Část 5 Ab straktní datové typy

51 / 61 DSA

Bool data type - signatureLogical value - BoolSymbolic:

druhy: Bool

operace: true,false: Bool (constants, nulary) not: Bool -> Bool (unary operation)

and: Bool,Bool -> Bool

(binary)

eq: Bool,Bool -> Bool

Page 52: Datové struktury a algoritmy Část 5 Ab straktní datové typy

52 / 61 DSA

Bool data type - signaturePrefix notation

and(_,_): Bool,Bool -> Bool

Infixový notation

_&_: Bool,Bool -> Bool

priority: not,and ... Must be stated explicitly

Page 53: Datové struktury a algoritmy Část 5 Ab straktní datové typy

53 / 61 DSA

Bool data type - axiomsvar x,y: Bool

not(true) = false negation

not(false) = true

and(x, true) = x

and(x,false) = false logical AND

and(x,y) = and(y,x)

or(x, true) = true

or(x,false) = x logical OR

or(x,y) = or(y,x)

Page 54: Datové struktury a algoritmy Část 5 Ab straktní datové typy

54 / 61 DSA

Bool data type - axiomsEquality - ver. 1eq(true, true) = true

eq(true,false) = false

eq(false, true) = false

eq(false,false) = true

Page 55: Datové struktury a algoritmy Část 5 Ab straktní datové typy

55 / 61 DSA

Bool data type - axiomsEquality - ver. 2eq(x, true) = x

eq(x, false) = not(x)

eq(x, y) = eq(y, x)

Page 56: Datové struktury a algoritmy Část 5 Ab straktní datové typy

56 / 61 DSA

Appendix B - Expressionsa) constant: f

(where f is nulary operation declared: f:d)b) variable: x

(where f is a variable declared var x:d)c) operation – prefix notation: f(t1,t2, ... tn) (where f is n-ary operation declared:

f: d1, d2, ..., dn -> d and t1, t2, ..., tn are expressions of sorts d1, d2, ..., dn)d) operace – infix notation : t1 f1 t2 f2 ...fn tn+1 (where f (n+1)-ary operation declared _f1_f2_..._fn : d1, d2, ..., dn+1 -> d and t1, t2, ..., tn+1 expressions of sorts d1, d2, ..., dn+1)e) brackets: (t)

(where t is an expression of sort d)f) other notations are not expressions.

Page 57: Datové struktury a algoritmy Část 5 Ab straktní datové typy

57 / 61 DSA

Expressions (cont.):Herbrand’s universum for a given signature

= set of all expressions on given signature

Example: {true, false, not(true), not(false), not(not(true)),...}

Two classes of equivalence (describe the same value)• {true, not(false), not(not(true)),...}

... [true]

• {false, not(true), not(not(false)),...} ...

[false]

Page 58: Datové struktury a algoritmy Část 5 Ab straktní datové typy

58 / 61 DSA

Bool - třídy ekvivalence• Množina všech výrazů nad signaturou

(Herbrandovo univerzum) {true, false, not(true), not(false), not(not(true)),...}

• Bool: lze rozdělit na 2 třídy ekvivalence:• {true, not(false), not(not(true)),...} ... [true]• {false, not(true), not(not(false)),...}... [false]

• Výrazy třídy popisují různý způsob konstrukce stejné hodnoty

Page 59: Datové struktury a algoritmy Část 5 Ab straktní datové typy

59 / 61 DSA

Bool - třídy ekvivalenceDoplníme axiomy

true = [true] false = [false]not([x])=[not(x)]and([x],[y]) = [and(x, y)]

Axiomy s třídami ekvivalence=> tvoří model datového typu

Page 60: Datové struktury a algoritmy Část 5 Ab straktní datové typy

60 / 61 DSA

Prameny / References• Jan Honzík: Programovací techniky, skripta,

VUT Brno, 19xx

• Karel Richta: Datové struktury, skripta pro postgraduální studium, ČVUT Praha, 1990

• Bohuslav Hudec: Programovací techniky, skripta, ČVUT Praha, 1993