Introduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer

Relaterede dokumenter
Introduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer

Prioritetskøer og hobe. Philip Bille

02105 Eksamensnoter. Lasse Herskind S maj Sortering 3

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo

Hashing. Ordbøger Hægtet hashing Hashfunktioner Lineær probering. Philip Bille

Danmarks Tekniske Universitet

Algoritmer og datastrukturer Course No Cheat Sheet May 15, 2012

Introduktion. Algoritmer og datastrukturer Toppunkter Algoritme 1 Algoritme 2 Algoritme 3. Philip Bille

Mindste udspændende træ. Mindste udspændende træ. Introduktion. Introduktion

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Introduktion. Introduktion. Algoritmer og datastrukturer. Eksempel: Maksimalt tal

Forén og find. Introduktion Hurtig find Hurtig forening Vægtet forening Stikompression Dynamiske sammenhængskomponenter.

1. Redegør for Lister, stakke og køer mht struktur og komplexitet af de relevante operationer

Abstrakte datatyper C#-version

Søgning og Sortering. Søgning og Sortering. Søgning. Linæer søgning

Søgning og Sortering. Søgning Linæer søgning Binær søgning Sortering Indsættelsessortering Flettesortering. Philip Bille

Mindste udspændende træ

Skriftlig eksamen i Datalogi

DM507 Algoritmer og datastrukturer

Korteste veje. Introduktion Egenskaber for korteste veje Dijkstras algoritme Korteste veje på DAGs. Philip Bille

Programmeringscamp. Implementer funktionerne én for én og test hele tiden.

Dynamisk programmering

Danmarks Tekniske Universitet

Søgning og Sortering. Philip Bille

Analyse af algoritmer

Analyse af algoritmer. Analyse af algoritmer. Analyse af algoritmer. Køretid

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Tilgang til data. To udbredte metoder for at tilgå data: Sekventiel tilgang Random access: tilgang via ID (også kaldet key, nøgle) for dataelementer.

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Grådige algoritmer. Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Grafer og graf-gennemløb

Plan. Introduktion. Eks: Max i tabel. Algoritmer og datastrukturer. Algoritmer og datastrukturer. Toppunkter. Algoritme 1. Algoritme 2.

Danmarks Tekniske Universitet

Løsning af møntproblemet

Transkript:

Introduktion til datastrukturer Introduktion til datastrukturer Philip Bille Datastrukturer Datastruktur. Metode til at organise data så det kan søges i/tilgås/manipuleres effektivt. Mål. Hurtig Kompakt Terminologi. Abstrakt vs. konkret datastruktur. Dynamisk vs. statisk datastruktur. Introduktion til datastrukturer

Stak Stak. Vedligehold en dynamisk sekvens (stakken) S af elementer under følgende operationer. PUSH(x): tilføj et nyt element x til S. POP(): fjern og returner det seneste tilføjede element i S. ISEMPTY(): returner sand hvis S ikke indeholder nogle elementer. 28 16 PUSH(28) 16 POP() 16 POP() 16 PUSH(7) 7 16 Kø Kø. Vedligehold en dynamisk sekvens (køen) K af elementer under følgende operationer. ENQUEUE(x): tilføj et nyt element x til K DEQUEUE(): fjern og returner det tidligst tilføjede element i K. ISEMPTY(): returner sand hvis K ikke indeholder nogle elementer. 8 15 ENQUEUE(1) 8 15 1 ENQUEUE(22) 8 15 1 22 DEQUEUE() 15 1 22 DEQUEUE() 15 1 22 ENQUEUE(6) 15 1 22 6 Anvendelser Stakke. Virtuelle maskiner Parsing Funktionskald Backtracking Køer. Skedulering af processer Buffering Breddeførst søgning Implementation af stak med tabel Stak. Stak med kapacitet N vha. tabel. Datastruktur. Tabel S[0..N-1] Index top i S. Operationer. PUSH(x): Tilføj x på S[top+1], sæt top = top + 1 POP(): returner S[top], sæt top = top - 1 ISEMPTY(): returner sand hvis og kun hvis top = -1. Tjek for overløb og underløb i PUSH og POP. 16 28 top

PUSH POP12 20 5 Implementation af stak med tabel 16 28 top 16 28 top 5 20 12 Tid. PUSH i Θ(1) tid. POP i Θ(1) tid. ISEMPTY i Θ(1) tid. Plads. Θ(N) plads. Mangler. Vi skal kende kapacitet N fra start. Vi spilder plads når antal elementer er << N. Implementation af kø med tabel Kø. Kø med kapacitet N vha. tabel. ENQUEUE DEQUEUE20 9 Datastruktur. Tabel S[0..N-1] Indeks (tidligst indsatte element) og tail (næste ledige element) i S og tæller count (antal elementer i kø). Operationer. ENQUEUE(x): Tilføj x på S[tail], opdater count og tail cyklisk. DEQUEUE(): returner S[], opdater count og cyklisk. ISEMPTY(): returner sand hvis og kun hvis count = 0. Tjek for overløb og underløb i DEQUEUE og ENQUEUE. 12 9 2 8 15 1 22 7 20 tail count = 5 8 15 1 22 tail

Implementation af kø med tabel Stakke og køer count = 5 8 15 1 22 Stak. Tid. PUSH, POP, ISEMPTY i Θ(1) tid. Plads. Θ(N) 16 28 top Tid. ENQUEUE i Θ(1) tid. tail Kø. Tid. ENQUEUE, Dequeue, ISEMPTY i Θ(1) tid. Plads. Θ(N) count = 5 8 15 1 22 tail DEQUEUE i Θ(1) tid. ISEMPTY i Θ(1) tid. Udfordring. Kan vi komme ned på lineær plads med samme tid? Plads. Θ(N) plads. Mangler. Vi skal kende kapacitet N fra start. Vi spilder plads når antal elementer er << N. Hægtede lister (linked lists) Introduktion til datastrukturer. Datastruktur til at vedligeholde en dynamisk sekvens af elementer i lineær plads. Rækkefølge af elementer bestemt af referencer/pegere kaldet hægter. Effektiv at indsætte og fjerne elementer eller sammenhængende dele af elementer. Dobbelt-hægtede vs enkelt-hægtede. 7 2 2 5 null null 7 2 2 5 null

Hægtede lister Hægtede lister Dobbelt-hægtede lister i Java. Simple operationer. class Node { int key; Node next; Node prev; prev key next SEARCH(, k): returner knude med værdi k i listen. Returner null hvis den ikke findes. INSERT(, x): indsæt knude x i starten af listen. Returner ny. DELETE(, x): fjern knude x i listen. Node = new Node(); Node b = new Node(); Node c = new Node();.key = 7; b.key = 2; c.key = ;.prev = null;.next = b; b.prev = ; b.next = c; c.prev = b; c.next = null; b c null 7 null null 2 null null null b c null 7 2 null 7 2 2 5 null null 7 2 2 5 null Hægtede lister Operationer på dobbelthægtet liste i Java. Node Search(Node, int value) { Node x = ; while (x!= null) { if (x.key == value) return x; x = x.next; return null; Node Insert(Node, Node x) { x.prev = null; x.next = ;.prev = x; return x; Node Delete(Node, Node x) { if (x.prev!= null) x.prev.next = x.next; else = x.next; if (x.next!= null) x.next.prev = x.prev; return ; null 7 2 2 5 null Hægtede lister 7 2 2 5 null null 7 2 2 5 null Tid. Hvor hurtigt kører operationerne? SEARCH i Θ(n) tid INSERT og DELETE i Θ(1) tid. Plads. Θ(n) Opgave. Lad p være en ny knude med værdien 10 og lad q være knuden i listen med værdi 2. Håndkør Search(,), Insert(,p) og Delete(,q).

Implementation af stak og kø med hægtede lister Opgave. Overvej hvordan man kan implementere stakke og køer med hægtede lister effektivt. Stak. Vedligehold en dynamisk sekvens (stakken) S af elementer under følgende operationer. PUSH(x): tilføj et nyt element x til S. POP(): fjern og returner det seneste tilføjede element i S. ISEMPTY(): returner sand hvis S ikke indeholder nogle elementer. Stakke og køer Stak og kø implementeret med hægtet liste Stak. Tid. PUSH, POP, ISEMPTY i Θ(1) tid. Plads. Θ(n) Kø. Tid. ENQUEUE, Dequeue, ISEMPTY i Θ(1) tid. Plads. Θ(n) Kø. Vedligehold en dynamisk sekvens (køen) K af elementer under følgende operationer. ENQUEUE(x): tilføj et nyt element x til K DEQUEUE(): fjern og returner det tidligst tilføjede element i K. ISEMPTY(): returner sand hvis K ikke indeholder nogle elementer. Hægtede lister Hægtet liste. Fleksibel datastruktur til at vedligeholde en sekvens af elementer i lineær plads. Andre hægtede datastrukturer. Cykliske lister, træer, grafer, 1 8 15 1 20 null 1 root 8 null 15 Introduktion til datastrukturer 20 null null 1 null 11 1 null null null 11 1 null null

Stak med dynamisk tabel Udfordring. Kan vi implementere en stak effektivt med tabel(ler)? Behøver vi fastsætte en øvre grænse på antallet af elementer? Kan vi komme ned på lineær plads og konstant tid? Dynamiske tabeller Mål. Implementer en stak vha. tabel(ler) i Θ(n) plads for n elementer. Så hurtige operationer som muligt. Kun fokus på PUSH. Ignorer POP og ISEMPTY indtil videre. Løsning 1. Start med tabel af størrelse 1. PUSH(x): Opret ny tabel af størrelse +1. Flyt alle elementer til ny tabel. Slet gammel tabel. Dynamiske tabeller PUSH(x): Opret ny tabel af størrelse +1. Flyt alle elementer til ny tabel. Slet gammel tabel. Tid. Hvor meget tid tager n PUSH operationer? PUSH i tager Θ(i) tid: byg tabel af størrelse i, flyt i-1, elementer og indsæt nyt element. Samlet tid. 1 + 2 + + + + n = Θ(n 2 ) Plads. Θ(n) Dynamiske tabeller Ide. Kopier kun elementer en gang i mellem. Løsning 2. Start med tabel af størrelse 1. PUSH(x): Hvis tabel er fuld (antallet af elementer i stak er lig tabellens størrelse). Opret ny tabel af dobbelt størrelse. Flyt elementer over i ny tabel. Slet gammel tabel. Udfordring. Kan vi gøre noget smartere?

Dynamiske tabeller PUSH(x): Hvis tabel er fuld (antallet af elementer i stak er lig tabellens størrelse). Opret ny tabel af dobbelt størrelse. Flyt elementer over i ny tabel. Slet gammel tabel. Tid. Hvor meget tid tager n PUSH operationer? PUSH 2 k tager Θ(2 k ) tid: byg tabel af størrelse 2 k+1, flyt 2 k elementer og indsæt nyt element. Alle andre PUSH tager Θ(1) tid. Samlet tid. 1 + 2 + + 8 + 16 + + 2 log n + n = Θ(n) Plads. Θ(n) Dynamiske tabeller Stak med dynamisk tabel. n PUSH operationer i Θ(n) tid og plads. Kan udvides til n PUSH, POP og ISEMPTY operationer i Θ(n) tid. Køretiden er amortiseret Θ(1) per operation (een operation kan tage lang tid, men tiden for enhver sekvens af k operationer er Θ(k)) Med snedige tricks kan man deamortisere løsning til Θ(1) værstefaldskøretid per operation. Kø med dynamisk tabel. Samme resultater som stak. Global genobygning. Dynamisk tabel er eksempel på global genopbygning (global rebuilding). General teknik til at gøre statiske datastrukturer dynamiske. Stakke og køer Datastruktur PUSH POP ISEMPTY Plads Tabel med kapacitet N Θ(1) Θ(1) Θ(1) Θ(N) Hægtet liste Θ(1) Θ(1) Θ(1) Θ(n) Dynamisk tabel med udvidelse Θ(n) Θ(1) Θ(1) Θ(n) Dynamisk tabel med fordobling Θ(1) Θ(1) Θ(1) Θ(n) Dynamisk tabel med deamortiseret fordobling = amortiseret Θ(1) Θ(1) Θ(1) Θ(n) Introduktion til datastrukturer