DATASTRUCTUREN LIJSTEN. Dr. D.P. Huijsmans 12 sept 2012 Universiteit Leiden, LIACS

Vergelijkbare documenten
DATASTRUCTUREN LIJSTEN. Dr. D.P. Huijsmans 2e college Leiden 11 sept 2013 Universiteit Leiden, LIACS

Schriftelijk tentamen Datastructuren Woe 5 jan uur Met uitwerkingen

DATASTRUCTUREN VOOR GESORTEERDE DATA

DATASTRUCTUREN VOOR GESORTEERDE DATA

Datastructuren en algoritmen voor CKI

Schriftelijk tentamen Datastructuren Ma 8 aug uur Met voorbeeld uitwerking

Datastructuren en algoritmen voor CKI

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Datastructuren Uitwerking jan

Stacks and queues. Hoofdstuk 6

O(1) ZOEKMETHODEN: HASH TECHNIEKEN. Dr. D.P. Huijsmans 24 okt 2012 Universiteit Leiden LIACS

Datastructuren en algoritmen voor CKI

IN1805 I Operating System Concepten

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

4EE11 Project Programmeren voor W. College 3, , Blok D Tom Verhoeff, Software Engineering & Technology, TU/e

O(1) ZOEKMETHODEN: HASH TECHNIEKEN. Dr. D.P. Huijsmans College 7 16 okt 2013 Universiteit Leiden LIACS

Hoofdstuk 7: Werken met arrays

Amorized Analysis en Union-Find Algoritmiek

DATASTRUCTUREN BACHELOR INFORMATICA

Datastructuren: stapels, rijen en binaire bomen

Lineaire data structuren. Doorlopen van een lijst

Opgaven Abstracte Datastructuren Datastructuren, Werkgroep, 31 mei 2017.

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort

Programmeren in C++ Efficiënte zoekfunctie in een boek

Tentamen Programmeren in C (EE1400)

Programmeermethoden NA. Week 6: Lijsten

Introductie in C++ Jan van Rijn. September 2013

Bouwstenen voor PSE. Datatypes en Datastructuren

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

QR-code op aanvoerbrief 2.xx.0: Specificaties

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni 2011

Datastructuren: stapels, rijen en binaire bomen

Programmeermethoden NA

Indexen.

Blog-Het gebruik van variabelen in Excel VBA

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Tentamen Programmeren in C (EE1400)

Datastructuren. Analyse van algoritmen. José Lagerberg. FNWI, UvA. José Lagerberg (FNWI, UvA) Datastructuren 1 / 46

In deze aflevering van deze serie zal ik proberen een groot gebrek van Turbo Pascal weg te nemen, namelijk het gemis aan Random Access Files.

Datastructuren Werkcollege Intro

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

V = {a, b, c, d, e} Computernetwerken: de knopen zijn machines in het netwerk, de kanten zijn communicatiekanalen.

6.2 VBA Syntax. Inleiding Visual Basic

Algoritmiek. 2 februari Introductie

17 Operaties op bits Bitoperatoren en bitexpressies

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

Achtste college algoritmiek. 8 april Dynamisch Programmeren

2.6 Veldeigenschappen

Hoofdstuk 9. Hashing

MEER OVER BINAIRE ZOEK BOMEN EN VARIANTEN

Arrays. Complexe datastructuren. Waarom arrays. Geen stijlvol programma:

Programmeermethoden. Arrays (vervolg 2) Walter Kosters. week 9: 6 10 november kosterswa/pm/

Variabelen en statements in ActionScript

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument

Tweede college algoritmiek. 12 februari Grafen en bomen

Elfde college algoritmiek. 10 mei Algoritme van Dijkstra, Gretige Algoritmen

Van CaseTalk naar een database in SQLite studio

TCP-IP message van partner PLC naar Alarmsysteem met als inhoud alarmen en analoge waarden in Format code 01.

Kortste Paden. Algoritmiek

Pascal uitgediept Data structuren

Datastructuren Uitwerking jan

Opgaven Hash Tabellen Datastructuren, 15 juni 2018, Werkgroep.

Koppeling met een database

De Leidsche Flesch Studievereniging voor Natuurkunde, Sterrenkunde, Wiskunde en Informatica sinds DLF Pointerworkshop

Programmeermethoden. Arrays (vervolg 2) Walter Kosters. week 9: 5 9 november kosterswa/pm/

Dynamiek met VO-Script

Het Eindfeest. Algoritmiek Opgave 6, Voorjaar

Vraag 1 (2 punten) (iii) Een lees-opdracht van virtueel adres 2148 seg 0, offset idem

Eerste college algoritmiek. 5 februari Introductie

DATA COMPRESSIE DATASTRUCTUREN

De volgende opgave gaat over de B-bomen van het college, waar sleutels zowel in de bladeren als ook in de interne knopen opgeslagen worden.

Data Definition Language

INTERVAL GRAFEN EN BOMEN DATASTRUCTUREN

Algoritmiek. 15 februari Grafen en bomen

is eigenlijk overbodig!

6.8 Lijsten: oefeningen

Examen Datastructuren en Algoritmen II

Informatica: C# WPO 10

Modelleren en Programmeren

DATASTRUCTUREN VOOR SCHIJFBLOK OPSLAG VAN GESORTEERDE DATA. Dr. D.P. Huijsmans College 6 9 okt 2013 Universiteit Leiden LIACS. Image:reviews.cnet.

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Hoofdstuk 7: Werken met arrays

Examen Programmeren I 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni 2011

Datastructuren en Algoritmen

GETIJSPECIALS ONDER MELISSA Appendix: Exporteren NE reeksen 29 April 2001

Een typisch programma in C en C++ bestaat uit een aantal onderdelen:

Handleiding Pivot docent Wendy Bruins versie 1.2 december 2008

MEER OVER BINAIRE ZOEK BOMEN EN VARIANTEN

Examen Software Ontwikkeling I 2e Bachelor Informatica Academiejaar Januari, **BELANGRIJK** : Schrijf je naam onderaan dit blad

De symmetrische min-max heap

Hoofdstuk 13: Sorteren & Filteren* 2010

int getaantalpassagiers{): void setaantalpassagiers(int aantalpassagiers);


Inleiding Programmeren 2

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

Hutscodering. De techniek: illustratie. een tabel met 7 plaatsen, genummerd van 0 tot en met 6.

Een gelinkte lijst in C#

29 november 2012 Hashing. Een tijd-ruimte afweging Hashfuncties

Transcriptie:

DATASTRUCTUREN LIJSTEN Dr. D.P. Huijsmans 12 sept 2012 Universiteit Leiden, LIACS

EEN ANALOGIE VOOR ABSTRACTE DATATYPEN (ADT) ADT: architectuur + functionaliteit Woon/werk elementen, adressering Mogelijkheden voor bewoning/opslag, verkeer Nieuwbouw + aanmaak voorzieningen Sloop + vrijgeven perceel Woon/werkverkeer: architectuur + gebruiksmogelijkheden Woonblok(ken), straatnamen,adressen Vrijstaande huizen, rijtjeshuizen, flats Verkeer, auto (pointer), bussen (buffers) Voorzieningen: nieuwbouw, verhuizing, uit/thuis, postbezorging, verbouw, baan plus reizen, sloop 2

EENVOUDIGE WOON,WERKARCHITECTUREN Byte array Losse variabelen 3 2-byte array (upper & lower byte per element)

2D EN POINTER ARCHITECTUUR ANALOGIËN 2D data array 1D array van data elementen met pointers 4x3 array met indexen en waardes 4

EISEN AAN ADT Complete beschrijving van zowel: Architectuur: (alle benodigde data geheugen elementen hulptellers en pointer voorzieningen) Functionaliteit (publiek gebruik) (hoe van deze architectuur gebruik gemaakt kan worden: operaties) Creatie/Annihilatie: (reserveren van geheugen structuur en vrijgeven ervan na afloop) Randvoorwaarden (publiek gebruik): precondities (geldige invoer en huidige situatie voldoet aan?) postcondities (operatie geslaagd? -> resultaten voldoen aan) 5

VERSCHILLENDE SOORTEN LIJSTEN(RIJEN/QUEUE/ARRAY) 1 dimensionaal: Lijst: random access Geordende lijst (gesorteerd): priority queue Circulaire lijst: buffer, FIFO queue 2 dimensionaal: Matrix N dimensionaal: Serialisatie (Array Mapping Function) 6

LIJST/RIJ/QUEUE IMPLEMENTATIES Array implementatie (index(en)) Circulair array (modulo size) verbonden lijst implementatie (single linked list) Extra next pointer veld Circulaire variant Dubbel verbonden lijst implementatie (double linked list) 2 extra pointer velden Links/rechts, vorige/volgende Circulaire variant 7

ADT_1D_ARRAY SPECIFICATIE Elementen: alle elementen zijn van hetzelfde opgegeven (eventueel samengestelde) datatype Structuur: lineaire index waarvan de waardes 1 op 1 corresponderen met de afzonderlijke elementen van elke 1D array waarde. Type Array: array Indextype of ComponentType (b.v. Maand: array[1..12] of String; met Maand[3]:= Maart ;) Domein: Index range met bijbehorende elementwaarden (b.v. [1.12] met [ Januari December ]) Operaties: Als A en B gelijksoortige array s, c een variabele van type element Array element kopieren: c :=A[i]; Array element wijzigen: A[i] :=c; Array kopieren: A := B; 8

ADT_2D_ARRAY SPECIFICATIE Elementen: alle elementen zijn van hetzelfde opgegeven (eventueel samengestelde) datatype Structuur: 2 lineaire indexen waarvan het Carthesisch product i,j 1 op 1 correspondeert met de afzonderlijke elementen van elke 2D array waarde. Type Array: array [Indextype1,Indextype2] of ComponentType (b.v. FotoHelderheid[50,256] is 126) Domein: Carthesische product van Index ranges met toegestane elementwaarden (b.v. i,j [0..500,0..750] met FotoHelderheid [0..255]) Operaties: Als A en B gelijksoortige array s, c een variabele van type element Array element kopieren: c :=A[i,j]; Array element wijzigen: A[i,j] :=c; Array kopieren: A := B; 9

SERIALISATIE AMF = ARRAY MAPPING FUNCTION Serialisatie van multi-dimensinale index naar 1D geheugenopslag m.b.v. AMF AMF = Array Mapping Function B.v. Het 1D adres, waar een 2D byte array element A[i,j] met rij i ε [0..5] en kolom j ε [0..3] opgeslagen wordt, is bij rij voor rij serialisatie 1D adres A[i,j]=c0+ i*rijlengte +j =c0+6i+j Waarbij c0 het begin adres is waar de compiler het array A laat beginnen. Bij kolom voor kolom serialisatie 1D adres A[i,j]=c0 +j*kolomlengte+i=c0+4j+i Als elk array element een 4 byte integer zou zijn dan wordt dit c0+j*kolomlengte*elementbreedte+i*elementbreedte=c0+16j+4i 10

SERIALISATIE VOORBEELD Van het 2D byte array A[i,j] met i=[0..5] en j=[0..3] kunnen de 6*4=24 elementen met c0=0 en c1=4 afgebeeld worden op [0..24] opgeteld bij het adres (in wezen c0) waar de compiler array A laat beginnen. A j 0 1 2 3 i 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 3 12 13 14 15 4 16 17 18 19 5 20 21 22 23 11

MULTIDIM. ARRAY VOORBEELDEN kd array Voorbeeld 2D: Grijswaarden foto Google Earth Voorbeeld 3D: Kleurenfoto (RGB lagen of matrix RGB tripletten) Voxelmodel (3D reconstructie x,y,z locaties): Serial sections groep Fons Verbeek Digitale videoscene (2D,t) Voorbeeld 4D: Vormverandering in de tijd (3D,t): embryonale ontwikkeling (groep Verbeek) 12

LINEAIRE RIJ (ONGESORTEERD,LINKSAANGESCHOVEN) nil nil nil nil 1 2 T-1 T T+1 Max T Hier toevoegen 13

OPERATIES OP EEN ONGESORTEERDE 1D TOEGANGSRIJ Array met vaste lengte A[1..Max] beschikbaar Links aangeschoven rij, ongesorteerd (gevulde plaatsen, gevolgd door lege) Teller voor aantal gevuld Operaties bij LIFO gebruik: Aansluiten: als teller<max; Teller->Teller+1; elem->a[teller]; Beurt (LIFO): als Teller>0; Beurt= A[Teller];A[Teller]=nil;Teller->Teller-1] Rij leeg? Y als Teller=0, anders N Rij vol? Y als Teller=Max, anders N Initialisatie/vrijmaken: A[i]=nil voor i ε [1..Max] (lege rij); Teller=0 14

1D TIJDGESORTEERDE RIJ ALS FIFO RIJ Achteraan toevoegen (teller nu head pointer) Vooraan afhalen (tail pointer) Randvoorwaarden: Tail mag head niet inhalen Tekortkoming: Wachtrij loopt tegen eind array aan Oplossing: bij lezen 1 element rest rij terugschuiven? Complexiteit? Betere oplossing met behoud O(1) complexiteit? 15

LINEAIRE RIJ (GESORTEERD,LINKSAANGESCHOVEN) opschuiven > > > > > nil nil nil nil 1 2 T-1 T T+1 Max T Hier invoegen 16

OPERATIES OP EEN GESORTEERDE 1D RIJ Door sorteervolgorde wordt invoegen complexer: Zoek invoegplek. Dom O(N) slim O(logN) Schuif alle elementen daar voorbij 1 op. O(N) Voeg element in. O(1) Hoe voorkomen we het moeten opschuiven van reeksen data waarden? (duurste onderdeel) 17

CIRCULAIR 1D ARRAY EN BUFFERING Een eenvoudige manier om een lijst/rij geimplementeerd als 1D array cyclisch te doorlopen (FIFO queue/buffer b.v.) is m.b.v. modulo adressering: Als A domein [0..max] heeft kan oplopende teller T modulo (max+1) steeds opnieuw array A doorlopen Met een aparte head- en tail-teller die elkaar niet mogen inhalen, kan dan m.b.v. een 1D array een buffer of FIFO queue gerealiseerd worden. 18

ADT_FIFOQUEUE/COMMUNICATIE BUFFER Voor specificatie en array implementatie zie los blad 19

SINGLE LINKED LIST Voordeel van array implementatie: random access O(1) Nadeel van array implementatie: Array misschien maar deels gebruikt Array misschien te klein Linked list implementatie: geheugen vrijmaken per nieuw bijkomend element Voordeel: niet snel te klein (tot hele geheugen op) vrijgegeven als niet meer nodig Nadeel: extra next_pointer nodig per element Niet meer random access, maar lijst aflopen via pointers 20

SINGLE LINKED LIST CONCEPTUEEL LINEAIR nil head current Data element Nextpointer 21

SINGLE LINKED LIST IMPLEMENTATIE AT RANDOM head nil current Voorganger van current alleen te vinden door aflopen verbonden lijst vanaf head Nummer vanaf head is lineaire index 22

ADT SINGLE LINKED LIST Specificatie zie apart vel Wel/niet ook een teller voor aantal knopen? Hoe ziet een lege linked list eruit? Wat mist in deze specificatie? Implementatie komt nog 23

SINGLE LINKED LIST INSERT nil head current nil head current 24

CIRCULAIR VERBONDEN LIJST 25

LEGE CIRCULAIR VERBONDEN LIJST Alleen Head- en Current-pointer waarde nil CIRCULAIR VERBONDEN LIJST MET 1 KNOOP Head- en Current-pointer wijzen beide naar de ene knoop Rechts-pointer ook 26

SINGLE LINKED LIST COMPLETE SPECIFICATIE Zie uitgedeelde beschrijving Na Create lege lijst: Create(var SLL:SingleLinkedList) Lege lijst nil nil HeadKnoop CurrentKnoop 27

SINGLE LINKED LIST TOEVOEGEN EERSTE ELEMENT InsertThisOne(SSL:SinglelinkedList;elem1:DataType) nil nil + elem1 HeadKnoop CurrentKnoop Lege lijst elem1 nil Lijst met 1 knoop HeadKnoop CurrentKnoop 28

SINGLE LINKED LIST TOEVOEGEN TWEEDE ELEMENT elem1 nil Lijst met 1 knoop elem2 + HeadKnoop CurrentKnoop InsertThisOne(SSL:SinglelinkedList;elem2:DataType) elem1 elem2 nil Lijst met 2 knopen 29 HeadKnoop CurrentKnoop

SINGLE LINKED LIST WEGHALEN ELEMENT elem1? elem3 nil Lijst met 3 knopen _ elem3 HeadKnoop CurrentKnoop DeleteThisOne(SSL:SinglelinkedList) elem1 elem2 nil Lijst met 2 knopen 30 HeadKnoop CurrentKnoop

WEGHALEN KNOOP: VOORGANGER? Zoek vanaf HeadKnoop naar knoop die naar huidige (te deleten) knoop wijst While loop met p vanaf Headpointer tot Knoop waarvan NextKnoop CurrentKnoop is Dure operatie O(N) Snellere procedure O(1) als: delete Lijst dubbelverbonden, dan ook direct pointer naar voorganger beschikbaar? head p elemi 31

SINGLE LINKED LIST WEGHALEN LAATSTE ELEMENT DeleteThisOne(SSL:SinglelinkedList) elem nil Lijst met 1 knoop HeadKnoop CurrentKnoop Lege lijst nil HeadKnoop nil CurrentKnoop 32

MOGELIJK EXTRA OPERATIES ADT_SLL Extra teller voor aantal in lijst: Moet bijgehouden worden tijdens inserts,deletes Extra operatie om i-de knoop in lijst vanaf Head tot CurrentKnoop te maken: Dure operatie O(N) vanaf HeadKnoop lijst doorlopen; Resultaat wordt CurrentKnoop Extra operatie om te zoeken naar knoop met bepaalde Data-Element waarde: Dure operatie O(N) vanaf HeadKnoop zoeken naar eerste knoop met Data_Element = gezochte waarde; Resultaat Y-> wordt CurrentKnoop 33

CIRCULAIR DUBBEL VERBONDEN LIJST 34

LEGE CIRCULAIR DUBBEL VERBONDEN LIJST Alleen Head- en Current-pointer waarde nil CIRCULAIR DUBBEL VERBONDEN LIJST MET 1 KNOOP Head- en Current-pointer wijzen beide naar deze ene knoop Links- en Rechts-pointer van deze knoop ook 35

DUBBEL VOORDEEL CIRCULAIRE LIJSTEN Dubbel verbonden en tevens circulaire lijsten: Operatie complexiteit: SCLL DCLL FindFirst O(1) O(1) FindNext O(1) O(1) FindPrevious O(N) O(1) RetrieveThisOne O(1) O(1) InsertAfterThisOne O(1) O(1) InsertBeforeThisOne O(N) O(1) DeleteThisOne O(N) O(1) UpdateThisOne O(1) O(1) Empty O(1) O(1) Last (Head-1) O(N) O(1) 36

LINKED LIST VERSIE DUBBEL VERBONDEN CIRCULAIRE LIJST Zie apart vel voor ADT_DCLL specificatie en linked list implementatie Wordt ook wel een RING genoemd 37

ADT_DCLL DELETE BIJ LAATSTE KNO(O)P(EN) Als de buren links en rechts gelijk zijn: current elem1 current elem2 head head HeadKnoop CurrentKnoop Kunnen er nog twee knopen in de lijst staan 38

ADT_DCLL DELETE LAATSTE KNOOP Herkenning zonder teller aantal in lijst: CurrentKnoop^.RightKnoop=CurrentKnoop^.LeftKnoop En CurrentKnoop^.RightKnoop=CurrentKnoop Head=Current Enige element Head=Current Aktie: Head Current Dispose(CurrentKnoop) HeadKnoop:=nil CurrentKnoop:=nil 39

ADT EN DATA IN EEN FILE Gegevens opgeslagen in een file Sequentie: [0..Max) geindexeerde data elementen met regelmatig oplopende index die tot door zou kunnen lopen, maar in de praktijk ergens eindigt door eindigheid beschikbaar geheugen. Afhankelijk van hoe gegevens in de file zijn gestructureerd, kunnen er I/O functies omheen geschreven worden: Simpelste file opzet (Unix, Pascal): byte-stream Ingewikkelder opzet: variabele lengte records met vaste lengte voor index-key 40

ADT_BYTESTREAMFILE MAGNEETBAND ANALOGON Data niet verder gestructureerd dan dat het een lineair geordende rij bytes [0..Max) is in een benoemde filenaam binnen een hierarchische directory en waarop de volgende file functies zijn gespecificeerd: Create (lege) File met bepaalde naam in (sub)dir Delete File Open File voor lezen en/of schrijven (Pascal of!) Sluit File Skip n bytes op File (voorwaarts/achterwaarts) (niet in Pascal!) Lees m bytes van File -> buffer (Pascal 1 byte!) Schrijf k bytes van buffer -> File (Pascal 1 byte!) 41

MAGNEETBAND ANALOGON VOOR RECORDS (VASTE OF VARIABELE LENGTE) In plaats van een serie bytes kan een magneetband ook gedacht worden als een sequentie van records: - van vaste lengte (steeds m bytes/record lezen/schrijven) - van variabele lengte (steeds zoveel bytes lezen totdat EOR byte code bereikt is) eor eor eor eor eor 42