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

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

02105 Eksamensnoter. Lasse Herskind S maj Sortering 3

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

Abstrakte datatyper C#-version

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

Danmarks Tekniske Universitet

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

Skriftlig eksamen i Datalogi

Mindste udspændende træ

DM507 Algoritmer og datastrukturer

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

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

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

Danmarks Tekniske Universitet

Søgning og Sortering. Philip Bille

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

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

DM507 Algoritmer og datastrukturer

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Dynamisk programmering

Grafer og graf-gennemløb

DM507 Algoritmer og datastrukturer

Løsning af møntproblemet

DM507 Algoritmer og datastrukturer

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

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

DM507 Algoritmer og datastrukturer

Dynamisk programmering

Binære søgetræer. Nærmeste naboer Binære søgetræer Indsættelse Predecessor og successor Sletning Algoritmer på træer og trægennemløb.

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

Implementation af stak med tabel 16 28 top 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. 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. 8 15 1 22 count = 5 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. DEQUEUE 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. tail Kø. count = 5 Tid. ENQUEUE, Dequeue, ISEMPTY i Θ(1) tid. Plads. Θ(N) 8 15 1 22 Udfordring. Kan vi komme ned på lineær plads med samme tid? tail

Hægtede lister 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 Dobbelt-hægtede lister i Java. class Node { int key; Node next; Node prev; 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; prev key next b c null 7 null null 2 null null null b c null 7 2 null Hægtede lister Simple operationer. 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. 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? Θ(1) for at indsætte element i tabel første gang. Θ(i) tid for at bygge tabel af størrelse i og flytte i-1 elementer. Samlet tid. n + 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? Θ(1) for at indsætte element i tabel første gang. Θ(i) tid for at bygge tabel af størrelse i og flytte i-1 elementer. Samlet tid. n + 2 + + 8 + 16 + 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