Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö



Relevanta dokument
Abstrakta datastrukturer

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Föreläsning 6. Rekursion och backtracking

Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar

Datastrukturer. föreläsning 3. Stacks 1

Tommy Färnqvist, IDA, Linköpings universitet

Tentamen TEN1 HI

Föreläsning Datastrukturer (DAT036)

Tentamen i Algoritmer & Datastrukturer i Java

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Föreläsning 6. Rekursion och backtracking

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Datastrukturer och algoritmer

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Datastrukturer och algoritmer

Föreläsning 11. ADT:er och datastrukturer

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Länkade strukturer. (del 2)

Tentamen Datastrukturer (DAT036)

Tentamen TEN1 HI

Föreläsning 3 Datastrukturer (DAT037)

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Innehåll

Föreläsning 3 Datastrukturer (DAT037)

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Tentamen Datastrukturer, DAT037 (DAT036)

Objektorienterad programmering

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen Datastrukturer (DAT036)

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Föreläsning Datastrukturer (DAT036)

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Tommy Färnqvist, IDA, Linköpings universitet

TDDC30 Programmering i Java, datastrukturer och algoritmer

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 13 Innehåll

Tentamen Datastrukturer (DAT037)

Föreläsning 3. Stack

Tentamen TEN1 HI

Lösningsförslag till exempeltenta 2

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Datastrukturer och algoritmer

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Föreläsning 4 Datastrukturer (DAT037)

Abstrakta datatyper Laboration 2 GruDat, DD1344

2 Modul 2 - (Länkade) Listor

Data- och programstrukturer

Dugga Datastrukturer (DAT036)

Datalogi, grundkurs 1. Lösningsförslag till tentamen

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 7. Träd och binära sökträd

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Stackar, köer, iteratorer och paket

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 9 Innehåll

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Övningsuppgifter. Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

Föreläsning 3. Stack

Föreläsning 6: Introduktion av listor

Vad har vi pratat om i kursen?

TDIU01 - Programmering i C++, grundkurs

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen i Algoritmer & Datastrukturer i Java

HI1024 Programmering, grundkurs TEN

Föreläsning 8: Exempel och problemlösning

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Föreläsning 2. Länkad lista och iterator

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

Träd. Rot. Förgrening. Löv

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

#include <stdio.h> #include <string.h>

Länkade listor, stackar och köer

Föreläsning 9 Datastrukturer (DAT037)

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Transkript:

Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Kö (ADT) En kö fungerar som en kö. Man fyller på den längst bak och tömmer den längst fram (köar). FIFO - first in first out enqueue(element)-köar element sist dequeue()-tar bort första elementet i kön och returnerar detta Möjliga operationer initqueue / freequeue isempty returnerar true om kön är tom isfull() vissa implementationer front() returnerar första elementet utan att ta bort det (size() returnerar antal elementet i kön)

Kö implementerad med array Att flytta alla element när vi tar bort första elementet blir ineffektivt Cirkulär array: front rear Dequeue: front++ Enqueue: rear++ Om rear = size sätt rear = 0 (samma för front) OBS rear får ej komma ifatt front full array!

Kö implementerad med länkad lista Med en enkellänkad lista kommer vi att behöva ta oss igenom hela listan varje gång vi ska köa ett element. Här kan vi välja en dubbellänkad lista som har pekare både till huvud och svans. Eftersom vi bara ska lägga till längst bak och aldrig ta bort inser man att det räcker med en enkellänkad lista som har en extra pekare till sista elementet

Bredd kontra djup När vi letar efter en lösning rekursivt blir det naturligt att vi borrar ner oss djupt kanske utan att hitta lösningen Med hjälp av en kö kan vi enkelt söka fullständigt efter lösningar på varje djup innan vi går vidare Vi ska diskutera utifrån hissexemplet

Hissen (rekursion) Vi har ett hus med 7 våningar (1-7) Startar på våning 1 och ska till våning 2 Det finns två knappar: upp3 åker upp tre våningar ner1 åker ner en våning void aka(int upp, int ner,int max, int mal,int vaning,int antalresor){ antalresor++; if(vaning==mal){ printf("det tog %d resor.\n",antalresor); }else{ if(vaning+upp<=max) aka(upp,ner,max,mal,vaning+upp,antalresor); if(vaning-ner>=1) aka(upp,ner,max,mal,vaning-ner,antalresor); } } 1. 4. 7. 6. 5. 4. 7. 6. 5. 4. 7....

Djupet först upp 1 ner Våra rekursiva anrop hamnar på stacken Vi får en algoritm som söker igenom möjligheterna enligt bilden Här måste vi sätta ett maxdjup för att komma fram Ibland är detta dåligt: när vi hittar en lösning vet vi inte om det finns en snabbare (på lägre djup) Ibland är det svårt att välja max-djup 4 7 3 6 6 2 5 4 7 6 5

Djupet först generellt med maxdjup 4

Bredden först generellt Här får vi en lösning som vi vet är en av de snabbaste lösningarna! Om vi vet att det finns en lösning behöver vi inte sätta någon maxgräns För att åstadkomma detta behöver vi dock en kö!

Bredden först med hissen Våning 1. Köa upp (4). Kö: 4 Avköar våning 4. Vi köar upp (7) och ner (3). Kö: 7, 3 Avköar våning 7. Vi köar ner (6) Kö: 3, 6 Avköar våning 3. Vi köar upp (6) och ner (2) Kö: 6, 6, 2 Avköar våning 6. Vi köar ner (5) Kö: 6, 2, 5 Avköar våning 6. Vi köar ner (5) Kö: 2, 5, 5 Avköar våning 2. 1 upp 2 1 ner 3 4 4 7 5 3 6 7 6 6 2

Köa hissen För att kunna köa de olika positionerna i trädet behöver vi använda en struct som representerar en position: typedef struct { int antalresor; int vaning; } Data; Dessutom behöver vi en kö: typedef struct { Node *front, *rear; } Queue; Med denna och tillhörande metoder helst i en separat fil kan vi sedan relativt enkelt lösa hissen med bredden först:

int main(){ Queue *q = initqueue(); int upp=15, ner=8, max=78, mal=35; Data d; d.antalresor=0; d.vaning=1; while(d.vaning!=mal){ (d.antalresor)++; if(d.vaning+upp<=max){ d.vaning+=upp; enqueue(q,d); d.vaning-=upp; } if(d.vaning-ner>=1){ d.vaning-=ner; enqueue(q,d); } d=dequeue(q); } printf("det tog %d resor.",d.antalresor); freequeue(q); return 0; }

Inlämningsuppgifter Följande uppgifter redovisas senast måndag den 4 januari och kan inte redovisas senare: 4A, 4B, 4.4 (utgå från föreläsningen och använd gärna din kö skapad för 4B för att lösa 4.4), 4.1 Dessa uppgifter bör göras nu för att ni ska kunna följa kursen på ett bra sätt. Övriga kan ni göra vid tillfälle för högre betyg.

Uppgifter ej i boken 4.A Implementera en kö som lagrar heltal med hjälp av en cirkulär array. Den ska minst ha operationerna enqueue, dequeue, isempty, isfull. Se till att det går att använda flera köer. Använd följande struct för att definiera en kö: typedef struct{ int front, rear; int element[maxq]; } Queue; Skriv också en main som testar din kö. (3p) 4.B Implementera en kö med hjälp av en enkellänkad lista med en extra pekare till slutet. Den ska lagra en struct Bok som innehåller titel och utgivningsår. Den ska minst ha operationerna enqueue, dequeue, isempty. Använd gärna structen från föreläsningen och separata filer. Skriv också en main som testar din kö. (3p)