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

Slides:



Advertisements
Liknande presentationer
Snabbguide och tips.
Advertisements

void hittaMax(int tal[], int antal, int *pmax) { int i; ??=tal[0]; for(i=1;i??) ??=tal[i]; } int main() { int v[]={1,2,3,4,2}; int.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2004 Datastrukturer och algoritmer Föreläsning 4.
Funktioner och programorganisation
1 Logikprogrammering ons 11/9 David Hjelm. 2 Repetition Listor är sammansatta termer. De består av en ordnad mängd element. Elementen i en lista kan vara.
2D1311 Programmeringsteknik med PBL
Prolog, Mån 16/9 Rebecca Jonson.
Algoritmer och data strukturer -Länkade listor
Sökning och sortering Linda Mannila
Föreläsning 3 Lista Array/länkad lista Lista implementerad som länkad lista Inlämningsuppgifter.
Nya typer Konstruerare, selektorer och predikat Rekursiva datatyper
Fortsättningskurs i Programmering lektion 6
För utveckling av verksamhet, produkter och livskvalitet. Rekursiva algoritmer, en annan sort tänkande -Hur -När -Bra/Dåligt (kap 7)
Logikprogrammering Ons, 25/9
Föreläsning 7 Analys av algoritmer T(n) och ordo
OOP Objekt-orienterad programmering
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Datastrukturer och algoritmer Föreläsning 4.
Datastrukturer och algoritmer Föreläsning 11. Datastrukturer och algoritmer VT08 Innehåll  Mängd  Lexikon  Heap  Kapitel , , 14.4.
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
Binära Sökträd, kapitel 19
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
Algoritmer och datastrukturer
Föreläsning 2 Datastrukturer Abstrakta datastrukturer Stack
C-programmering ID120V William Sandqvist Länkad lista
Programmeringsteknik för K och Media
Tar fram v ur kön v = R(true,0,Null) och q = (). d = 0 Leta sedan fram grannarna = {A, B} För granne A: newDist = 0+4 = 4. Ej besökt. q = (A(true,4,R))
ABC EFG IJK Markera noden som besökt och lägg in den i kön. q = (A) Ta fram första elementet (A), q = ( ) Ta sedan fram grannmängden till A S = {B, F,
Växjö 21 april -04Språk & logik: Kontextfria grammatiker1 DAB760: Språk och logik 21/4: Kontextfria 10-12grammatiker Leif Grönqvist
Föreläsning 10 Länkade lista Stack och Kö Att arbeta med listor
Tentamensdags och lab 3…. Större program delas normalt upp i flera filer/moduler vilket har flera fördelar:  Programmets logiska struktur när man klumpar.
Anders Sjögren Selektion i C ”vägval” if och switch - satserna.
Pathfinding. –Vad är det? –Sökning från A till B.
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
Datasamlingar och generiska enheter
1 ITK:P1 Föreläsning 7 Algoritmer och datastrukturer DSV Marie Olsson.
Vektorer (klassen Vector) Sortering
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: Trådprogrammering i Java - Avbrott (”interrupts”) - Metoden join() -
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Generiska algoritmer Kan användas på containertyper och arrays Använder iteratorer Implementerar.
Problemlösning Veckodagsproblemet Gissa talet Siffersumman.
Riktade listor i C och Java Lösning till gruppövning 1.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Namnrum, räckvidd och rekursion Linda Mannila
Logikprogrammering 21/10 Binära träd
Föreläsning 5 Arrayer & ArrayList Hur man använder API:n
Prioritets Köer (Priority Queues ), Graph Data Structures & Problem Solving using Java --Kap 21,14.
Reflektioner kring OU1 Generellt sett bra kvalitet på dokumentationen! Första intryck... –Skulle du lämna in en jobbansökan med ett häftstift/gem eller.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
För utveckling av verksamhet, produkter och livskvalitet. Stack och Kö - Implementering - Tilllämpningar.
Datastrukturer och algoritmer
Stack och Kö -Implementering -Tilllämpningar -- Kapitel 16, 11.
Rekursion. En metoddefinition som innehåller ett anrop av sig själv kallas rekursiv.
Graph och graph-algoritmer. Några enkla graph teorier Hur IP trafik hittar destinationen i Internät ? GPS-system ? Sociala nätverk. Vanligaste frågeställningar:
F. Drewes, Inst. f. datavetenskap1 Föreläsning 9: Implementering av underprogram Aktiveringsposter Exekveringsstacken Implementera dynamisk räckvidd.
Köer -- Kapitel 16. Principen med en kö Köer är FIFO datastrukturer  First In – First Out  enqueue() Lägg till data i kön (först)  dequeue() Hämta.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 9 ( ) Innehåll: - IPC: Semaforer.
Logikprogrammering 23/10 Binära träd In- och uthantering David Hjelm.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Föreläsning 9 Grafalgoritmer.
TILLÄMPAD DATALOGI (TILDA) Övningsgrupp 2 Marcus Hjelm
TILLÄMPAD DATALOGI (TILDA) Övning 1 Marcus Hjelm
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Datastrukturer och algoritmer Föreläsning 13 Sortering.
För utveckling av verksamhet, produkter och livskvalitet. Algoritmer och Datastrukturer -- Kap 21,14 Prioritets Köer (Priority Queues ), Graph.
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
© Anders Broberg, Lena Kallin Westin, 2007 Datastrukturer och algoritmer Föreläsning 4.
Iteratorer och generiska algoritmer sid. 1 6/28/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Iterator vector ::iterator b = ivec.begin() vector ivec vector.
Länkade listor á la C/C++
Föreläsning 8: Exempel och problemlösning
Repetitionsföreläsning 1: Lite rekursion & problemlösning
Presentationens avskrift:

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: 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! frontrear

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); } 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); }

Djupet först 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 upp ner

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. upp ner

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; } 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)