Datastrukturer. Kapitel Introduktion till datastrukturer Abstrakta datastrukturer
|
|
- Maja Lina Nyberg
- för 8 år sedan
- Visningar:
Transkript
1 Kapitel 2 Datastrukturer 2.1 Introduktion till datastrukturer Att studera datastrukturer är att lära sig om metoder för att organisera data så att de passar databearbetningen. Detta ingår som en klassisk del i datalogin. Å ena sidan har vi själva datorn hårdvaran med internt och externt minne. De elementära byggstenarna är bytes som man får tillgång till via heltalsadresser. Å andra sidan, när man skriver program, organiserar man data på en högre nivå, med hjälp av datastrukturer, i stället för att manipulera data på byte-nivå. En datastruktur kan ses som en container, skapad för att lagra en samling objekt av en given typ. Dessa objekt kallar vi fortsättningsvis element. Med hjälp av variabler (locators) kan vi lokalisera (hitta fram till) data i datastrukturen. När ett element lagras i en container är det en locator som gör det möjligt att senare nå detta element. Till varje datastruktur finns ett antal operationer. Operationer som till exempel lagrar nya element, tar reda på om ett visst element är representerat i containern eller returnerar antalet element i containern. Hur effektiv datastrukturen är avgörs av hur stor plats containern tar och hur lång tid operationerna behöver för att utföras. Till effektiviteten måste man nog också räkna hur lättanvänd strukturen är när man ska lösa praktiska problem Abstrakta datastrukturer Datastrukturer är konkreta implementationer av abstrakta datatyper(adt). Abstrakta datatyper är väl definierade datatyper med en tillhörande mängd operationer. En viss ADT kan implementeras (konkretiseras) på olika sätt. För en del av operationerna kan en viss implementation vara bättre (effektivare) än en annan. Står man inför ett större programmeringsprojekt bör man först välja vilka abstrakta datastrukturer man ska använda. Senare, under arbetet med att skriva programkoden kommer frågan hur de ska implementeras. 1
2 2.1. INTRODUKTION TILL DATASTRUKTURER Grundläggande datastrukturer Det finns förstås en repertoar av återkommande och mer eller mindre standardiserade abstrakta datastrukturer. Den viktigaste kategorin är sekvens. Ofta vill man samla elementen i en följd, såsom i en lista eller tabell. Till denna hör lista, stack och kö. Några vanliga operationer är insättning, sökning och borttagning. Den vanligaste realiseringen av dessa datatyper är genom array eller länkad lista. Andra abstrakta datatyper, mer eller mindre vanliga är ordnat träd, binärt träd, lexikon, mängd, prioritetskö och graf. Även textbehandling, geometri och grafik kräver ibland sina egna datastrukturer som kanske inte direkt tillhör någon av de ovan uppräknade. Figur 2.1: Till de fundamentala datastrukturerna hör SEKVENS (Sequence). En sekvens är en container som lagrar element i en bestämd ordning. De viktigaste operationerna är att lägga till och ta bort element på en given plats. STACK och KÖ är kanske de två mest omtalade datastrukturerna, som båda hör till denna kategori. I programspråket C implementeras dessa ofta som länkade listor, men arrayer kan duga lika bra. PRIORITETSKÖ (Priority Queue). Elementen i denna container tillhör ett totalt ordnat universum. Den viktigaste operationerna är att kunna ta bort och returnera det största (alternativt det minsta) elementet i containern. Strukturen har en naturlig användning är vid sortering och en effektiv implementation är genom en HEAP. Vi kommer senare i kursen, under kapitlet sortering, till HEAPSORT. Det finns en mängd varianter på HEAP som vi inte kommer att beröra i denna kurs: min-max heap, pagodas, deaps, binomial heaps och Fibonacci heaps. Håkan Strömberg 2 KTH Syd
3 KAPITEL 2. DATASTRUKTURER STACK LEXIKON (Dictionary) Elementen i denna container tillhör också ett totalt ordnat universum. De viktigaste operationerna är söka, lägga till och ta bort element. Till varje element finns en unik nyckel. Här finns många sofistikerade metoder vid implementationen. Vi kommer att beröra HASHTABELLER. Flera metoder innehåller balanserade träd: AVL-TREE, RED-BLACK-TREE, 2-3-TREE, TREE, WEIGHT-BALANCED- TREE, BIASED SERCH TREE, SPLAY TREE. Ofta handlar tillämpningarna om externt minne som till exempel databaser. Sekvens SEKVENS (S) är en container som lagrar element där ordningen är viktig Operationer: SIZE(N) returnerar antalet element N i containern S HEAD(c) tilldelar c en locator till första elementet i S TAIL(c) tilldelar c en locator till sista elementet i S LOCATERANK(r,c) tilldelar c en locator till det r:te elementet i S. Om r < 0 eller r > N, där N är antalet element i S, tilldelas c en NULL locator. PREV(c,c ) tilldelar c en locator i S som föregår elementet med locator c. Om c är locator till det första elementet i S tilldelas c en NULL locator. NEXT(c,c ) tilldelar c en locator i S som följer efter elementet med locator c. Om c är locator till det sista elementet i S tilldelas c en NULL locator. INSERAFTER(e,c,c ) sätter in elementet e i S efter elementet med locator c och returnerar c, som är locator till e. INSERTBEFORE(e,c,c ) sätter in elementet e i S före elementet med locator c och returnerar c, som är locator till e. INSERTHEAD(e,c) sätter in elementet e först i S och returnerar c, som är locator till e. INSERTHEAD(e,c) sätter in elementet e sist i S och returnerar c, som är locator till e. INSERRANK(e,r,c) sätter in e på den r:te positionen och returnerar c, som är en locator till e. Om r < 0 eller r > N, där N är antalet element i S, tilldelas c en NULL locator. REMOVE(c,e) tar bort och returnerar elementet e med locator c från S MODIFY(c,e) byter ut elementet med locator c i S mot e Håkan Strömberg 3 KTH Syd
4 2.1. INTRODUKTION TILL DATASTRUKTURER Figur 2.2: Array, Dubbellänkad lista, Länkad lista Kostnad när sekvensen implementeras som: Operation ARRAY LÄNKAD LISTA DUBBELLÄNKAD LISTA SIZE O(1) O(1) O(1) HEAD O(1) O(1) O(1) TAIL O(1) O(1) O(1) LOCATERANK O(1) O(N) O(N) PREV O(1) O(N) O(1) NEXT O(1) O(1) O(1) INSERTAFTER O(N) O(1) O(1) INSERTBEFORE O(N) O(N) O(1) INSERTHEAD O(N) O(1) O(1) INSERTTAIL O(1) O(1) O(1) INSERTRANK O(N) O(N) O(N) REMOVE O(N) O(N) O(1) MODIFY O(1) O(1) O(1) N är antalet element i S PRIORITETSKÖ (Priority Queue) Prioritetskö är en container med element i ett ordnat universum. Operationer: SIZE(N) returnerar antalet element N i kön Q MAX(c) returnera en locator c till det största elementet i Q INSERT(e,c) placerar elementet e i kön Q och returnerar locator till e REMOVE(c,e) tar bort och returnerer elementet e med locator c från Q REMOVEMAX(e) tar bort och returnerar det största elementet e från Q MODIFY(c,e) ersätter elementet med locator c med elementet e Håkan Strömberg 4 KTH Syd
5 KAPITEL 2. DATASTRUKTURER STACK Kostnad när prioritetskön implementeras som: Operation OSORTERAD SEKVENS SORTERAD SEKVENS HEAP SIZE O(1) O(1) O(1) MAX O(N) O(1) O(1) INSERT O(1) O(N) O(log N) REMOVE O(1) O(1) O(log N) REMOVEMAX O(N) O(1) O(log N) MODIFY O(1) O(N) O(log N) N är antalet element i Q. En HEAP är binärt sökträd. Mer om det senare i kursen LEXIKON (Dictionary) Operationer: SIZE(N) returnerar antalet element N i D FIND(x,c) om D innehåller ett element med nyckeln x kommer c att vara en locator till detta element LOCATEPREV(x,c) tilldelar c en locator till det element i D med den största nyckeln som är mindre än x LOCATENEXT(x,c) tilldelar c en locator till det element i D med den minsta nyckeln som är sörre än eller lika med x LOCATERANK(r,c) tilldelar c en locator till det r:te elementet i D PREV(c,c ) tilldelar c en locator till det element i D med den största nyckeln som är mindre än nykeln till det element som har locator c NEXT(c,c ) tilldelar c en locator till det element i D med den minsta nyckeln som är större än nykeln till det element som har locator c MIN(c) tilldelar c en locator till elementet i D med den minsta nyckeln MAX(c) tilldelar c en locator till elementet i D med den största nyckeln INSERT(e,c) sätter in ett element e i D och returnerar dess locator c. Om det redan finns ett element e i D med samma nyckel returneras NULL locator. REMOVE(c,e) Avlägsnar och returnerar elementet e med locator c från D MODIFY(c,e) ersätter elementet med locator c i D med elementet e Håkan Strömberg 5 KTH Syd
6 2.1. INTRODUKTION TILL DATASTRUKTURER Kostnad när lexikonet implementeras som: Operation OSORTERAD SEKVENS SORTERAD SEKVENS SORTERAD SEKVENS DUBBELLÄNKAD LISTA DUBBELLÄNKAD LISTA ARRAY SIZE O(1) O(1) O(1) FIND O(N) O(N) O(log N) LOCATEPREV O(N) O(N) O(log N) LOCATENEXT O(N) O(N) O(log N) LOCATERANK O(N) O(N) O(1) NEXT O(N) O(1) O(1) PREV O(N) O(1) O(1) MIN O(N) O(1) O(1) MAX O(N) O(1) O(1) INSERT O(1) O(N) O(N) REMOVE O(1) O(1) O(N) MODIFY O(1) O(N) O(N) N är antalet element i D Operation (A,B)-TREE AVL-TREE BUCKET ARRAY HASH SIZE O(1) O(1) O(1) O(1) FIND O(log N) O(log N) O(1) O(N/M) LOCATEPREV O(log N) O(log N) O(M) O(N+M) LOCATENEXT O(log N) O(log N) O(M) O(N+M) LOCATERANK O(log N) O(log N) O(M) O(N+M) NEXT O(log N) O(log N) O(M) O(N+M) PREV O(log N) O(log N) O(M) O(N+M) MIN O(1) O(1) O(M) O(N+M) MAX O(1) O(1) O(M) O(N+M) INSERT O(log N) O(log N) O(1) O(1) REMOVE O(log N) O(log N) O(1) O(1) MODIFY O(log N) O(log N) O(1) O(1) N är antalet element i D. Nycklarna är heltal i [1,M] (A,B)-TREE och AVL-TREE ingår inte i kursen. BUCKET ARRAY är enkelt att implementera. Återkommer i samband med sortering. Även Hash Tabell kommer längre fram i kursen. Håkan Strömberg 6 KTH Syd
7 KAPITEL 2. DATASTRUKTURER STACK Stack 2.2 Stack I figur 2.3 ser du den vanligaste metaforen för en stack en tallrikshållare på en lunchrestaurang. Bilden vill visa att: den tallrik vi lägger dit sist också är den vi först plockar bort. En stack är en LIFO, last in first out eller hellre på svenska SIFU, sist in först ut Figur 2.3: En tallriksstack En programmerare sitter vid sin dator när telefonen ringer. I samma ögonblick som han svarar läggar han arbetet vid datorn på en stack. Detta arbete får vila till telefonsamtalet är över. Under tiden som samtalet pågår kommer ett nytt samtal. Han ber personen från det första samtalet att vänta ett stund och kopplar in nästa. Han lägger det första telefonsamtalet på stacken och just nu har vår programmerare två jobb på stacken. Precis då ställer sig en av hans kollegor i dörren och undrar om han ska med på lunch. För en kort stund hamnar alltså även det andra samtalet på stacken när han svarar sin kollega: Ja, jag kommer snart. Han återgår sedan till det andra samtalet. Han hämtar ned det från stacken. När han avslutar det samtalet hämtar han så ned det första från stacken. När även det är avslutat finns bara programmeringsjobbet kvar. Han blir påmind om lunchen. Ett jobb blir kvar på stacken i en timme till Operationer Vi har tidigare sagt att till en abstrakt datastruktur finns ett antal operationer. Först till de som är viktigast för en stack: Push. Push lägger ett element överst på stacken. Denna operation är förstås alldeles nödvändig för en stack. För att vara säker på att man inte överskrider stackens kapacitet testar operationen så att stacken inte är full. Om stacken redan är full vet vi inte hur vi ska fortsätta och avbryter därför exekveringen. Det är svårt att välja rätt nivå när vi ska beskriva dessa operationer. Först den högsta Håkan Strömberg 7 KTH Syd
8 2.2. STACK tänkbara nivån. Algorithm 2.2.1: PUSH(element) Lägg element överst på stacken Följande nivå är mer detaljerad och kanske kommer man för nära själva implementationen. Man känner på sig att Stack här är en array och StackMax är en övre gräns för hur många element stacken kan innehålla. Eftersom det finns andra sätt att konkretisera denna operation är denna nivå för låg. Algorithm 2.2.2: PUSH(element) if StackIndex { < StackMax StackIndex StackIndex+1 then { Stack[StackIndex] = element Felmeddelande else avbryt Pop. Pop returnerar det översta elementet på stacken och tar samtidigt bort det från stacken. Under förutsättning att stacken inte är tom förstås. Även denna operation är också nödvändig för en normal stack. Om denna operation försöker utföras på en tom stack vet vi inte hur vi ska fortsätta och avbryter därför processen med ett felmeddelande. Algorithm 2.2.3: POP() Returnerar det översta elementet på stacken IsEmpty. IsEmpty returnerar true om stacken är tom och false annars. Operationen är till för att klienten ska ha möjlighet att undvika att anropa Pop när stacken är tom, vilket skulle leda till att exekveringen avbryts. Håkan Strömberg 8 KTH Syd
9 KAPITEL 2. DATASTRUKTURER STACK Algorithm 2.2.4: ISEMPTY() if Stacken är tom then return (TRUE) else return (FALSE) IsFull. IsFull returnerar true om stacken är full och false annars. Denna operation är på liknande sätt som IsEmpty till för att undvika plötsliga avbrott. Är stacken redan full ska man inte anropa Push Algorithm 2.2.5: ISFULL() if Stacken är full then return (TRUE) else return (FALSE) Här följer några mindre viktiga operationer som möjligtvis kan förekomma i samband med en stack. Top Top returnerar första värdet på stacken utan att ta bort det. Någon gång kanske man bara vill testa översta elementet på stacken, utan att ta bort det. Den här operationen kan man klara sig utan eftersom en Pop, följt av en Push av elementet igen, ger samma resultat. InitStack InitStack initierar stacken innan vi börjar använda den. För vissa implementationer, speciellt de som använder dynamiskt minne måste stacken först initieras (skapas). FreeStack Använder vi InitStack för att skapa vår stack så måste vi ha en operation, FreeStack, för att ta bort den från heapen när den inte ska användas längre. StackDepth För att få reda på hur många element som just nu finns på stacken. IsOnStack En operation som tar reda på om ett givet element finns på stacken. Operationen returnerar 1 om elementet inte finns. Annars returnerar funktionen platsen där elementet finns. Stacken lämnas orörd. Från valet av operationer ovan kan diskussionen om vem som har ansvaret väckas. Ska operationerna omsättas till kod på ett sätt som gör klienten fri från ansvar. Det vill säga ska rutinerna som sköter stacken hålla reda på hur många element som finns där, se till att programmet inte kraschar genom tester i Pop och Push. Om klienten i stället håller reda på hur många element stacken innehåller så finns ingen risk för felaktiga anrop. Håkan Strömberg 9 KTH Syd
10 2.2. STACK Implementation av en stack Vi har nu definierat den abstrakta datastrukturen stack. Hur kan den då implementeras? Hur ska vi realisera den i vår programkod. Vi börjar med ett exempel: EXEMPEL 2.1 I denna uppgift ska du skriva ett program som kan analysera parentesuttryck. Programmet ska avgöra om den inmatade strängen med parenteser är balanserad och korrekt. Strängen kan endast innehålla följande tecken ( ) { } [ ] Att ett parentesuttryck är korrekt betyder att det innehåller lika många vänster- som högerparenteser av varje sort och att parenteserna dessutom kommer i rätt ordning. Nedan följer några exempel (()) Korrekt (())) Felaktigt [{()}] Korrekt [[[[[ Felaktigt [[[((()))]]] Korrekt [({}]) Felaktigt (([{}]))) Felaktigt (((])) Felaktigt Den inmatade strängen får högst innehålla 30 parenteser. En mycket passande algoritm för att lösa problemet Algorithm 2.2.6: PARENTESTEST(s) INITSTACK() for i 1 to LENGTH(s) if vänsterparentes then PUSH(s(i)) if högerparentes do if ISEMPTY() then return (felaktig) then if POP() not matchar s[i] then return (felaktig) if ISEMPTY() then return (korrekt) else return (felaktig) Vi har använt oss av operationerna PUSH, POP, INITSTACK och ISEMPTY. Om vi väljer en array som stack, en array som kan lagra tecken (char) så kommer motsvarande funktioner att se ut så här. Håkan Strömberg 10 KTH Syd
11 KAPITEL 2. DATASTRUKTURER STACK 1 char stack[30]; 2 int plats=0; 3 4 void push(char t){ 5 stack[plats]=t; 6 plats++; 7 } 8 9 char pop(void){ 10 char t1; 11 plats ; 12 t1=stack[plats]; 13 return t1; 14 } bool isempty(void){ 17 return (plats<0); 18 } 1 2 Vi tillåter oss två globala variabler här, själva stacken stack och plats som håller reda på var nästa lediga plats finns för ett stackat element. 4 7 Lägger in det pushade elementet i stack och ökar plats Minskar platsen, tar ut ett element från stacken, och returnerar elementet Returnerar true om plats är negativ, det vill säga stacken är tom. H Vad är det som gör att man med dessa funktioner inte kan testa två parentesuttryck i samma programkörning? Med vilken tidigare nämnd operation kan man avhjälpa detta? Det återstår en del jobb för att hålla reda på vad som är vänsterparentes, vad som är högerparentes och när de matchar. Men de lämnar vi. För den intresserade heter programmet parentes.c Stackbibliotek Även om dessa funktioner är korta och enkla att återskapa från minnet så är det otillfredsställande att skriva om dem varje gång man ska använda dem. Målet är därför att placera dem i en egen fil stack.c och att skapa en stack.h som kan inkluderas i början av klientprogrammet på vanligt sätt. Här följer ett enkelt, första försök. Vi visar delar av de tre filerna stack.h, stack.c och stacktest.c Håkan Strömberg 11 KTH Syd
12 2.2. STACK 1 void push(char t); 2 char pop(void); 3 int isempty(void); 4 int isfull(void); 1 3 Ovan ser vi stack.h, som i detta enkla fall inte innehåller något annat än funktionsdeklarationer för fyra stackoperationer. 1 static char stack[30]; 2 static int plats=0; 3 4 void push(char t){ 5 stack[plats]=t; 6 plats++; 7 } Själva stacken deklareras tillsammans med variabeln plats som ska hålla reda på antalet. Båda dessa variabler deklareras som static vilket innebär att de inte är globala men inte kända utanför denna modul. 4 8 Sedan kommer funktionerna push, pop, isempty och isfull i en följd. 1 #include "stack.h" 2 #include <stdio.h> 3 void main(void){ push( h ); 6 c=pop(); } 1 Lönen för vår möda det räcker nu att skriva #include "stack.h" för att nå biblioteket stack 5 6 Länkaren hittar koden till push och pop i den obj-fil som skapas då stack.c kompileras. Så här långt fungerar det hela om vi utvecklar programmet i ett projekt där dessa tre filer ingår. Håkan Strömberg 12 KTH Syd
13 KAPITEL 2. DATASTRUKTURER STACK UPPGIFT 2.1 Implementera enkel stack. (1) På hemsidan hittar du en zip-fil med länken Enkel Stack (array), som innehåller filerna main.c, stack.h och stack.c. Skapa ett projekt som kan exekvera main.c Ännu generellare stack I det stackbibliotek vi skrivit ovan kan elementen bara vara av typen char. Om vi vill använda en stack där elementen är av typ int eller kanske en av klienten definierad post, struct, så måste vi med den teknik vi hittills använt, skriva en uppsättning funktioner för varje datatyp. Om typen hos elementet är en post så kan vi ju aldrig förutsäga hur den kommer att se ut och måste därför skriva stack.h och stack.c för varje tillämpning Flera stackar samtidigt Det är tänkbart att vi råkar ut för en situation där vi vill ha flera stackar igång samtidigt. Kan detta lösas med den kod vi skrivit ovan? Nej och det är uppenbart att när vi anpassar rutinerna till detta fall, så måste vi i alla funktioner lägga till en ny parameter, som anger vilken stack som avses. Det vi saknar här kan lösas med objektorienterad programmering i Java. UPPGIFT 2.2 Implementera stack i Java. (3) I Java finns förstås redan stack implementerad. Trots det ska du här skriva en generell klass Stack med flera av de operationer vi nämnt ovan. På filen namn.dat finns ett antal förnamn och vilken fotbollsklubb de hejar på AIK, DIF eller HIF. Filen inleds med ett tal n som anger hur många personer den innehåller. Därefter följer 2n rader, först förnamnet på en rad sedan klubben på nästa. Använd den nyskrivna Java-klassen för att åstadkomma en utskrift där först namnen på alla AIK-are skrivs ut, följt av djurgårdarnas och hammarbyarnas namn Stacken som en länkad lista. 1 struct objekt{ 2 int nummer; 3 struct objekt naesta; 4 }; 5 6 typedef struct objekt objekt 7 8 objekt start=null; Håkan Strömberg 13 KTH Syd
14 2.2. STACK 1 4 Vår första stack ska hantera heltal. Varje element i stacken skall vara av typen objekt. Strukturen objekt innehåller, i tillägg till heltalet, en pekare till nästa elementet på stacken. 6 Pekaren start håller reda på var stackens topp finns. Den pekar ut det sist pålagda elementet. Om start är NULL betyder det att stacken är tom. 1 bool tom(void){ 2 return start==null; 3 } Funktionen tom returnerar true om stacken är tom och false om det finns minst ett element. Ovan har vi ju sagt att stacken är tom om start är NULL. 1 void push(int nr){ 2 objekt ny; 3 ny=(objekt )malloc(sizeof(objekt)); 4 ny >nummer = nr; 5 ny >naesta=start; 6 start=ny; 7 } Med hjälp av denna funktion lägger vi till element på stacken. I vardagslag använder man de svengelska ordet pusha (skjuta på) för att lägga upp ett element på en stack. Ordet är just nu ett modeord det är ofta man pushar för olika saker. Funktionen tar emot ett heltal, men returnerar ingenting. Man räknar helt enkelt med att det kommer att lyckas och har därför ingen anledning att rapportera. Det enda som skulle kunna gå snett är att stacken inte rymmer det nya elementet. Misstänker man att detta kan inträffa är nog det bästa att ha en global variabel som noterar denna händelse. Detta för att hålla stackfunktionerna så rena som möjligt från ovidkommande parametrar. 2 4 ny är en pekare till ett objekt. Med malloc allokerar vi dynamiskt ett utrymme på heapen. Sen kopieras värdet på variabeln nr till nummer. 5 8 Detta element ska nu hamna överst i stacken. Om stacken är tom innan, har detta enda element ingen efterföljare. Pekaren naesta får då värdet NULL genom att sättas lika med start pekaren som är NULL om stacken är tom. I annat fall kommer det tidigare första elementet att sjunka ner i stacken och det nya elementet har en efterföljare som tidigare pekades ut av start. 6 Till sist justeras start, som ju ska peka ut första elementet. Håkan Strömberg 14 KTH Syd
15 KAPITEL 2. DATASTRUKTURER STACK 1 int pop(void){ 2 int nr; 3 nr = start >nummer; 4 objekt p = start; 5 start = start >naesta; 6 free(p); 7 return nr; 8 } Funktionen pop hämtar ner element från stacken. Inga indata och ett heltal som utdata. 3 4 Funktionen tar i variabeln nr hand om värdet på heltalet till det första elementet på stacken. Pekaren p sätts till att peka på det första elementet på stacken. Denna pekare skall vi använda för att deallokera det minne som vi tidigare allokerade dynamiskt. 5 Det första elementet på stacken länkas sen ut ur listan genom att flytta startpekaren så den pekar på nästa elementet på stacken. 6 Utrymmet som vi allokerade dynamiskt med hjälp av malloc friges sen med hjälp av free. Vi använder här pekaren p som vi satt att peka på det första elementet på stacken. 7 Till sist returneras värdet på heltalet till det element som vi har tagit bort från stacken. Om elementet är det sista på stacken kommer start att få värdet NULL i annat fall kommer start att peka ut elementets efterföljare. Programmeraren får själv förvissa sig om att stacken inte är tom, före anropet av pop, med hjälp av tom. EXEMPEL 2.2 Ett program som utnyttjar de tre funktionerna för att bygga upp stacken, så som den ser ut i figurerna. Figur 2.4: Push anropas med ett element vars värde är 96. Så här ser stacken ut efter första anropet 1 void main(void){ 2 int nr; 3 nr=96; push(nr); Håkan Strömberg 15 KTH Syd
16 2.2. STACK Figur 2.5: Nu står ett element med värdet 48 på tur att stackas Figur 2.6: Efter push(a) har talet 48 hamnat på stacken. 1 nr=48; push(nr); Figur 2.7: På samma sätt hamnar där sedan ett element med värdet 7 1 nr=7; push(nr); 1 while(!tom()){ 2 nr=pop(); 3 printf("%d",nr) 4 } 5 } Observera att vi i huvudprogrammet endast talar om vilka heltal vi vill lägga på stacken. Sen tar programmet själv hand om att skapa element av typen objekt som lägges på stacken. 1 4 I denna loop poppas ett element i taget av från stacken till stacken blir tom. Håkan Strömberg 16 KTH Syd
17 KAPITEL 2. DATASTRUKTURER STACK Figur 2.8: Med hjälp av pop kan vi nu lyfta ned det översta elementet från stacken, det med värdet 7 UPPGIFT 2.3 Implementera enkel stack som länkad lista. (1) På hemsidan hittar du en fil med länken Enkel Stack (länkad lista), som innehåller filerna main.c, stack.h och stack.c. Skapa ett projekt som kan exekvera main.c. Skapa gärna en roligare tillämpning. UPPGIFT 2.4 Sortering med hjälp av stackar. (2) På hemsidan hittar du en fil med länken StackSort, som innehåller filerna main.c, stack.h, stack.c och tal.dat. Skapa ett projekt som kan exekvera main.c. Sätt dig in i koden så att du kan redogöra för hur programmet fungerar. 2.3 Idioten Många patienser brukar kallas Idioten, antagligen för att de på ett eller annat sätt gör skäl för namnet. Det här är emellertid den riktiga Idioten, vilket dock inte på något sätt innebär att den är dummare än alla andra. Tvärtom, det är en trevlig patiens med fler kombinationsmöjligheter än man kanske från början kan upptäcka. I Dostojevskis berömda roman Bröderna Karamasov lägger Grusjenka en patiens som kallas Idioten. Kanske var det den här. Figur 2.9: 2 och 9 kan kastas. Därefter kan E flyttas ner. Då blir 7 fri och 3 kan kastas, varefter 10 kan flyttas till en tom hög Håkan Strömberg 17 KTH Syd
18 2.3. IDIOTEN Så går den till En vanlig kortlek med 52 kort. Man börjar med att lägga ut fyra kort med framsidan upp i en vågrät rad (se figur 2.9). Finns bland dessa fyra kort två eller flera av samma färg, har man rätt att plocka bort de lägsta korten i denna färg. När det inte går att plocka bort fler kort, lägger man ut en ny rad med fyra kort ovanpå de förra. Esset är högsta kortet. Om några av de översta korten är av samma färg, får man återigen plocka bort de lägsta, tills det bara ligger olikfärgade kort kvar. Var gång det uppstår ett tomrum, får man lägga dit vilket som helst av de översta korten från de andra högarna. På det sättet fortsätter man att lägga ut rader om fyra kort i taget, kastar de lägre i samma färg och flyttar kort till tomma platser. Patiensen har gått ut, när endast de fyra essen ligger kvar på bordet. På hemsidan finns programmet Patiens demo, med vilket du kan träna tills du förstår vad den går ut på. Du lägger ut nya kort genom att klicka på knappen Lägg ut, tar bort ett kort med vänster musknapp och flyttar ett kort till en tom plats genom att använda höger musknapp två gånger Ett program som lägger patiensen Nedan finner du, med kommentarer, ett nästan färdigt program, som lägger patiensen gånger och sedan skriver ut antalet lyckade försök. Läs igenom kommentarerna och sätt dig in i programmet så pass att du kan lösa uppgifterna! En programfil som heter patiens.c, finns för övrigt innehållande koden i det skick du ser den här main På topdown-vis börjar vi med huvudfunktionen, föredömligt kort. Det är svårt att se att de funktionsanrop, som finns här leder till närmare 150 rader kod. Håkan Strömberg 18 KTH Syd
19 KAPITEL 2. DATASTRUKTURER STACK 1 #define ANTALFORSOK int main(void){ 3 int lek[53],antal=0; 4 int forsok; 5 6 srand(time(0)); 7 for(forsok=1;forsok<=antalforsok;forsok++){ 8 blanda(lek); 9 if (lagg patiens(lek)) 10 antal++; 11 } 12 printf("%d lyckade försök \n",antal); 13 } Funktionen main inleds med deklaration av en kortlek, lek, en variabel forsok, som håller reda på hur många försök vi har gjort och en variabel antal, som håller reda på antalet lyckade försök. Rutinen inleds med srand(time(0)), för att slippa få samma resultat efter varje körning. for-loopen kommer sedan att exekveras i varv. I varje varv börjar vi med att blanda kortleken. Funktionen lagg_patiens anropas sedan med den nyblandade kortleken. Om funktionen skickar tillbaka ett tal 0 (då alltid 1) har patiensen lyckats och räknaren antal ökas med ett Deklarationer Följande deklarationer väljer vi att göra på global nivå posttypen kort som innehåller kortets färg och valör. kort som är en array av pekare. Varje cell kommer att tjänstgöra som en stack. En stack för varje korthög. 1 struct kort{ 2 int valor,farg; 3 }; 4 struct kortelement{ 5 struct kort kort; 6 struct kortelement nasta; 7 }; 8 struct kortelement start[4]={null,null,null,null}; 9 int nstack[4]={0,0,0,0}; 1 3 En posttyp kort deklareras, där förstås kortets färg och valör är viktiga data. Håkan Strömberg 19 KTH Syd
20 2.3. IDIOTEN 4 7 En posttyp kortelement omsluter kort och innehåller en pekare nasta av typ struct kortelement. 8 Här deklareras, globalt, en array med fyra pekare (övertyga dig om det). Elementen i arrayen ska innehålla en pekare till översta elementet i var och en av de fyra stackarna (högarna) eller är NULL (då stacken är tom). 9 Arrayen nstack håller reda på hur många kort det finns i varje hög Funktioner för att hantera de fyra stackarna Dessa funktioner, tom, push och pop, har vi redan stött på i inledningen av detta kapitel. 1 int tom(int nr){ 2 return (start[nr]==null); 3 } 4 5 void push(struct kort p,int nr){ 6 struct kortelement ny; 7 ny=(struct kortelement )malloc(sizeof(struct kortelement)); 8 nstack[nr]++; 9 ny >kort=p; 10 ny >nasta=start[nr]; 11 start[nr]=ny; 12 } 1 struct kort pop(int nr){ 2 struct kort p; 3 struct kortelement tmp; 4 p=start[nr] >kort; 5 tmp=start[nr]; 6 nstack[nr] ; 7 start[nr]=start[nr] >nasta; 8 free(tmp); 9 return p; 10 } int length(int nr){ 13 return nstack[nr]; 14 } struct kort overst(int nr){ } Vid flera tillfällen, längre ned i detta program behöver vi titta på det översta elementet i en stack, utan att för den skull plocka bort det. Visst skulle det kunna ordnas genom att först anropa pop och sedan push, men bättre är nog en funktion overst, som returnerar en kopia av stacktoppen. Håkan Strömberg 20 KTH Syd
21 KAPITEL 2. DATASTRUKTURER STACK Funktionen ska ta emot ett tal som anger vilken stack som avses och sedan returnera en post av typ korttyp, som är en kopia av det översta kortet på högen. Om stacken är tom ska ett kort med valören och färgen 1 returneras, (viktigt, för att det ska passa in i det övriga programmet) lagg_patiens Funktionen lagg_patiens är programmets hjärta. 1 int lagg patiens(int lek[ ]){ 2 int n=0,omgang,nr,hog; 3 struct kort p; 4 for(omgang=1;omgang<=13;omgang++){ 5 for(nr=0;nr<4;nr++){ 6 n++; 7 p.valor=(lek[n] 1)%13; 8 p.farg=(lek[n] 1)/13; 9 push(p,nr); 10 } 11 while (samma farg(&hog)){ 12 pop(hog); 13 hog tom(); 14 } 15 } 16 return lyckat(); 17 } 4 15 Eftersom leken innehåller 52 kort och man lägger ut 4 kort åt gången, ser forloopen till att det görs 13 utlägg Denna loop gör fyra varv ett för varje kort i ett utlägg. Variabeln n håller reda på vilket kort i leken som står på tur. Valör och färg bestäms utifrån kortets ordningsnummer. Kortnummer 1 till 13 kommer alla att få färg 0 och korten 40 till 52 får färg 3. Kortnumren 1,14,27,40 får valören 0 och kommer att motsvara lekens tvåor. På samma sätt kommer kortnumren 13, 26, 39, 52 att få valören 12, som motsvarar essen. När p har fått sina värden läggs den på rätt hög med funktionen push När korten är utlagda är det dags att ta bort de som går. Funktionen samma_farg returnerar 1 om det finns två högar med samma toppfärg. I variabeln hog finns numret på den hög, i vilken kortet, som ska tas bort ligger. 12 Med pop för rätt hög försvinner kortet. 13 Möjligtvis kan nu högen hog blivit tom. Detta måste kontrolleras och eventuellt åtgärdas med hog_tom. 16 När vi kommit hit har alla kort lagts ut. Funktionen lyckat kontrollerar att de fyra högarna nu innehåller fyra ess på toppen och inget annat. Från lyckat returneras 1 eller 0. Håkan Strömberg 21 KTH Syd
22 2.3. IDIOTEN lyckat Funktionen som ska avgöra om patiensen lyckats. 1 int lyckat(void){ 2 int hog,k; 3 struct kort p; 4 for(hog=0;hog<4;hog++){ 5 p=overst(hog); 6 if (p.valor!=12){ 7 kvar(); 8 return 0; 9 } 10 } 11 k=kvar(); 12 return k==4; 13 } 4 10 Så fort ett kort som inte är ett ess påträffas avslutas lyckat och returnerar När man hamnar här har patiensen misslyckats och högarna måste tömmas inför nästa försök, innan talet 0 returneras. 11 Man kan bara hamna här när alla toppkort är ess. Detta räcker dock inte för ett lyckat försök. Funktionen kvar räknar därför det totala antalet kort på högarna. Om detta tal är 4 ja då har patiensen gått ut och funktionen returnerar kvar Funktionen räknar hur många kort det finns kvar på de fyra högarna sammantaget och anropas av funktionen lyckat. Är det fyra stycken kan patiensen ha gått ut. 1 int kvar(void){ } Funktionen kvar har inga indata men returnerar det sammanlagda antalet kort på de fyra högarna. Det är inte bara det att vi är intresserade av detta antal, dessutom vill vi rensa högarna inför nästa försök. Håkan Strömberg 22 KTH Syd
23 KAPITEL 2. DATASTRUKTURER STACK blanda För att programmet ska ge en rättvis utvärdering av chanserna för att patiensen ska gå ut måste kortleken blandas på ett korrekt sätt. I ett senare kapitel ska vi titta närmare på algoritmer av detta slag. 1 void blanda(int lek[ ]){ 2 int k,plats,tmp; 3 4 for(k=1;k<=52;k++) 5 lek[k]=k; 6 for(k=1;k<=52;k++){ 7 plats=k+rand()%(53 k); 8 tmp=lek[k]; 9 lek[k]=lek[plats]; 10 lek[plats]=tmp; 11 } 12 } Här konstaterar vi bara att variabeln lek är en array, som innehåller 53 celler (vi använder inte 0:an) Först fylls kortleken på med alla korten i ordning från 1 till 52 och sedan sker själva blandningen, som innebär att slumpmässigt utvalda kort byter plats i arrayen samma_farg Vilka högar har samma färg på toppkorten, om det nu finns några högar med samma toppfärg över huvud taget. 1 int samma farg(int hog){ 2 int hog1,hog2; 3 struct kort k1,k2; 4 for(hog1=0;hog1<3;hog1++){ 5 k1=overst(hog1); 6 for(hog2=hog1+1;hog2<4;hog2++){ 7 k2=overst(hog2); 8 if(k1.farg==k2.farg && k1.farg!= 1){ 9 if(k1.valor>k2.valor) 10 hog=hog2; 11 else 12 hog=hog1; 13 return 1; 14 } 15 } 16 } 17 return 0; 18 } Håkan Strömberg 23 KTH Syd
24 2.3. IDIOTEN Denna rutin har som uppgift att ta reda på om det finns två kort med samma färg högst upp på de fyra högarna. En rutin med en dubbel for-loop, som hämtar ner kopior av av två stackars översta kort med hjälp av funktionen overst till k1 och k2, och jämför dem. Om korten har samma färg returnerar funktionen talet 1. Dessutom får referensvariabeln hog ett värde, som anger numret på den hög ifrån vilken ett kort ska kastas. 8 Varför ingår k1.farg!=-1 i villkoret? Hur många gånger testas villkoret i 8? 9 12 Övertyga dig om att det blir rätt hög från vilken man kastar ett kort hog_tom Denna funktion tar reda på om det finns någon tom hög. I så fall flyttas toppkortet med högsta valören till denna hög. 1 void hog tom(void){ 2 int hog,fhog; 3 struct kort p; 4 for(hog=0;hog<4;hog++){ 5 if(tom(hog)){ 6 fhog=hogsta topp(); 7 if(fhog> 1){ 8 p=pop(fhog); 9 push(p,hog); 10 } 11 } 12 } 13 } Funktionen hogsta_topp returnerar numret på den hög i vilken det högsta kortet ligger och hog anger den tomma högen. Med en pop och en push är flyttningen avklarad hogsta_topp Funktionen går helt enkelt igenom de fyra högarna och tar reda på vilken hög, som har högsta toppkortet. Om denna maxvalör finns i flera högar kommer den hög med lägsta numret att väljas. Håkan Strömberg 24 KTH Syd
25 KAPITEL 2. DATASTRUKTURER STACK 1 int hogsta topp(void){ 2 int hog,hogmax= 1,max= 1; 3 struct kort p; 4 5 for(hog=0;hog<4;hog++){ 6 p=overst(hog); 7 if(p.valor>max && length(hog)>1){ 8 hogmax=hog; 9 max=p.valor; 10 } 11 } 12 return hogmax; 13 } Här finns möjlighet till förbättringar. Som programmet fungerar nu flyttar den det högsta kortet till den tomma högen. Även om man inte tar reda på ordningen hos de oförbrukade korten kan man säkert ofta göra ett intelligentare val. Bara det att jag inte vet hur! Har du några idéer? 2.4 Programmeringsuppgifter Tanken är nu att du ska arbeta med detta program i flera etapper, men det är också fritt fram att implementera idéerna i Java. UPPGIFT 2.5 Fullfölj programmet. (3) Hämta in programmet patiens.c från hemsidan och fullfölj de två funktionerna overst och kvar. UPPGIFT 2.6 Uppskatta sannolikheten. (1) Uppskatta sannolikheten att patiensen ska gå ut genom att köra programmet ett par gånger. UPPGIFT 2.7 Hur många kort blir kvar?. (2) Gör de tillägg i programmet som krävs för att kunna svara på frågan Vilket är det vanligaste antalet kort som blir kvar i högarna efter en läggning av Idioten? UPPGIFT 2.8 En bättre strategi. (4) Försök att finna ett bättre sätt att flytta kort till tomma högar. Håkan Strömberg 25 KTH Syd
Abstrakta datastrukturer
Föreläsning 2 Datastrukturer Abstrakta datastrukturer Stack Stack implementerad med array Länkad lista Stack implementerad med länkad lista Inlämningsuppgifter Datastrukturer En datastruktur är en struktur
Algoritmer och Datastrukturer
Kapitel 1 Algoritmer och Datastrukturer 1.1 Algoritm Vad är en algoritm? En bra algoritm är som en skarp kniv den gör exakt vad den är konstruerad för att göra, med minsta möjliga ansträngning. Att försöka
Algoritmer och Datastrukturer
Kapitel 1 Algoritmer och Datastrukturer 1.1 Algoritm Vad är en algoritm? En bra algoritm är som en skarp kniv den gör exakt vad den är konstruerad för att göra, med minsta möjliga ansträngning. Att försöka
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
Algoritmer och Datastrukturer Kary FRÄMLING/Göran PULKKIS (v23) Kap. 7, Sid 1 BINÄRA TRÄD Träd används för att representera olika slags hierarkier som ordnats på något sätt. Den mest använda trädstrukturen
TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU
TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: Abstrakta datatyper Listor Stackar
Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö
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
Tentamen i Algoritmer & Datastrukturer i Java
Tentamen i Algoritmer & Datastrukturer i Java Hjälpmedel: Skrivhjälpmedel, miniräknare. Ort / Datum: Halmstad / 2010-03-16 Skrivtid: 4 timmar Kontaktperson: Nicolina Månsson Poäng / Betyg: Max 44 poäng
TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 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 På denna föreläsning: Prioritetskö Heap Representation som
Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar
Dynamiskt minne Agenda Vad är dynamiskt minne Motivering Hur gör man i C Övningar Minne Datorns primärminne används till olika ändamål De flesta system partitionerar minnet efter användningen: Programkoden
TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU
TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: Abstrakta datatyper Listor Stackar
Föreläsning 11. ADT:er och datastrukturer
Föreläsning 11 ADT:er och datastrukturer ADT:er och datastrukturer Dessa två begrepp är kopplade till varandra men de står för olika saker. En ADT (abstrakt datatyp) är just abstrakt och är inte kopplad
Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel
Data- och Programstrukturer Provmoment: Ladokkod: Tentamen ges för: Omtentamen NDP011 Systemarkitektprogrammet 7,5 högskolepoäng Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum:
Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet
Föreläsning 13 Innehåll Algoritm 1: Sortera Exempel på problem där materialet i kursen används Histogramproblemet Schemaläggning Abstrakta datatyper Datastrukturer Att jämföra objekt Om tentamen Skriftlig
Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad
1 Datatyper Tobias Wrigstad Det finns flera olika typer av (slags) data Olika datatyper har olika egenskaper. T.ex. är ett personnummer inte ett tal. (Den sista siffran skall stämma enligt den s.k. Luhnalgoritmen
Tentamen TEN1 HI
Tentamen TEN1 HI1029 2015-03-17 Skrivtid: 8.15-13.00 Hjälpmedel: Referensblad (utdelas), papper (tomma), penna Logga in med tentamenskontot ni får av skrivvakten. Det kommer att ta tid att logga in ha
Föreläsning 6: Introduktion av listor
Föreläsning 6: Introduktion av listor Med hjälp av pekare kan man bygga upp datastrukturer på olika sätt. Bland annat kan man bygga upp listor bestående av någon typ av data. Begreppet lista bör förklaras.
Länkade strukturer. (del 2)
Länkade strukturer (del 2) Översikt Abstraktion Dataabstraktion Inkapsling Gränssnitt (Interface) Abstrakta datatyper (ADT) Programmering tillämpningar och datastrukturer 2 Abstraktion Procedurell abstraktion
Tentamen *:58/ID100V Programmering i C Exempel 3
DSV Tentamen *:58/ID100V Sid 1(5) Tentamen *:58/ID100V Programmering i C Exempel 3 Denna tentamen består av fyra uppgifter som tillsammans kan de ge maximalt 22 poäng. För godkänt resultat krävs minst
TDIU01 - Programmering i C++, grundkurs
TDIU01 - Programmering i C++, grundkurs Pekare och Listor Eric Elfving Institutionen för datavetenskap 31 oktober 2014 Översikt 2/41 Internminne Pekare Dynamiska datastrukturer (Enkellänkade) listor Arbeta
Programmering B med Visual C++ 2008
Programmering B med Visual C++ 2008 Innehållsförteckning 1 Repetition och lite nytt...5 I detta kapitel... 5 Programexekvering... 5 Loop... 5 Källkod... 6 Verktyg... 6 Säkerhetskopiera... 6 Öppna, kompilera,
Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista
Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista Abstrakt stack Abstrakt kö Länkade listor Abstrakta datatyper Det är ofta praktiskt att beskriva vilka operationer man vill kunna göra på sina
Tommy Färnqvist, IDA, Linköpings universitet
Föreläsning 9 Pekare, länkade noder, länkade listor TDDD86: DALP Utskriftsversion av föreläsning i Datastrukturer, algoritmer och programmeringsparadigm 25 september 2015 Tommy Färnqvist, IDA, Linköpings
Exempel ( )
Exempel Antag att vi vill ha en generell stack. En stack är en mekanism som man kan lagra i och hämta från enligt principen sist in, först ut (eng LIFO). Man skall alltså kunna Skapa en stack Lägga värden
Datastrukturer. föreläsning 3. Stacks 1
Datastrukturer föreläsning 3 Stacks 1 Abstrakta datatyper Stackar - stacks Köer - queues Dubbeländade köer - deques Vektorer vectors (array lists) All är listor men ger tillgång till olika operationer
Tentamen Datastrukturer (DAT036)
Tentamen Datastrukturer (DAT036) Datum och tid för tentamen: 2013-12-16, 14:00 18:00. Ansvarig: Nils Anders Danielsson. Nås på 0700 620 602 eller anknytning 1680. Besöker tentamenssalarna ca 15:00 och
Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö
Datastrukturer och algoritmer Föreläsning 4 Test, Stack och Kö 1 Innehåll Test Datatyperna Stack och kö Specifikation och Gränssnitt Konstruktion Tillämpning 2 Testa VIKTIGT! Test går att göra under många
Exempeltenta GruDat 2002/2003
Exempeltenta GruDat 2002/2003 Endast ett svarsalternativ på varje fråga är korrekt. Felaktigt svar eller felaktigt antal ikryssade svarsalternativ ger noll poäng på uppgiften. Obs: Den riktiga tentan kommer
Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor
Abstrakta datatyper 1 Primitiva vektorer Vektorer kan skapas av primitiva datatyper, objektreferenser eller andra vektorer. Vektorer indexeras liksom i C från 0. För att referera en vektor används hakparenteser.
Föreläsning 2 Datastrukturer (DAT037)
Föreläsning 2 Datastrukturer (DAT037) Fredrik Lindblad 1 2016-11-02 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037 Tidskomplexitet
Abstrakta datatyper Laboration 2 GruDat, DD1344
Abstrakta datatyper Laboration 2 GruDat, DD1344 Örjan Ekeberg (fritt från en idé av Henrik Eriksson) 27 oktober 2008 Målsättning Målet med denna laboration är att ge en inblick i hur man kan använda abstrakta
Föreläsning 10. Pekare (Pointers)
Föreläsning 10 Pekare (Pointers) Dagens kluringar 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; int f(int a) if(a==1) return a; else return
Lösningar Datastrukturer TDA
Lösningar Datastrukturer TDA416 2016 12 21 roblem 1. roblem 2. a) Falskt. Urvalssortering gör alltid samma mängd av jobb. b) Sant. Genom att ha en referens till sista och första elementet, kan man nå både
Lösningsförslag för tentamen i Datastrukturer (DAT037) från
Lösningsförslag för tentamen i Datastrukturer (DAT7) från --9 Nils Anders Danielsson. Träd- och köoperationerna har alla tidskomplexiteten O(log s), där s är antalet element i trädet/kön (notera att jämförelser
F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander
F12 - Collections ID1004 Objektorienterad programmering Fredrik Kilander fki@kth.se Collections (samlingar) En collection är ett objekt som fungerar som en samling av andra objekt En collection erbjuder
Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.
5(16) Tentamen på kurserna Programmeringsteknik med C och Matlab Programmering i C Tid: 2/11-11, kl. 9-13 Lärare: Jonny Pettersson Totalt: 60 poäng Betyg 3: 30 poäng Betyg 4: 39 poäng Betyg 5: 48 poäng
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.
Tentamen Programmeringsteknik II 2014-0-27 Skrivtid: 0800 100 Tänk på följande Skriv läsligt! Använd inte rödpenna! Skriv bara på framsidan av varje papper. Börja alltid ny uppgift på nytt papper. Lägg
Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp
Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Dataingenjörsprogrammet, elektroingenjörsprogrammet och medicinsk teknik KTH Skolan för Teknik och Hälsa Redovisning: Se Kurs-PM om hur redovisningen
ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition
Seminarium 4 Köer och Stackar Innehåll ADT:erna Kö och Stack Definitioner Operationer Exempel på användning Givna klasser i Java Interfacet Queue Klassen Stack Klassen LinkedList Klassen PriorityQueue
Tentamen Datastrukturer (DAT036)
Tentamen Datastrukturer (DAT036) Det här är inte originaltesen. Uppgift 6 var felaktigt formulerad, och har rättats till. Datum och tid för tentamen: 2011-12-16, 8:30 12:30. Ansvarig: Nils Anders Danielsson.
*Pekarvärden *Pekarvariabler & *
*Pekarvärden *Pekarvariabler & * Motivering Pekare är ett fundamentalt koncept i C (och C++) Multipla returvärden från funktioner. Arrayer hanteras via pekare Dynamiskt minne (kommer i slutet av kursen)
ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar
Föreläsning 1 Innehåll ADT Prioritetskö Prioritetsköer och heapar Prioritetsköer och heapar ADT prioritetskö Klassen PriorityQueue i java.util ar Implementering av prioritetskö med heap Sortering med hjälp
Maskinorienterad programmering, IT2
Maskinorienterad programmering, IT2 Laboration nr 5 C-programmering Prioritetskö Förberedelser Läs noga igenom uppgifterna så att du förstår vad du skall göra och hur problemen skall lösas. Gör en skiss
Fredag 10 juni 2016 kl 8 12
KTH CSC, Alexander Baltatzis DD1320/1321 Lösningsförslag Fredag 10 juni 2016 kl 8 12 Hjälpmedel: En algoritmbok (ej pythonkramaren) och ditt eget formelblad. För betyg E krävs att alla E-uppgifter är godkända,
Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6
Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6? DAGENS AGENDA Komplexitet Ordobegreppet Komplexitetsklasser Loopar Datastrukturer Några nyttiga regler OBS! Idag jobbar
Föreläsning Datastrukturer (DAT036)
Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2013-11-25 Idag Starkt sammanhängande komponenter Duggaresultat Sökträd Starkt sammanhängande komponenter Uppspännande skog Graf, och en möjlig
Föreläsning 8: Exempel och problemlösning
TDA 545: Objektorienterad programmering Föreläsning 8: Exempel och problemlösning Magnus Myréen Chalmers, läsperiod 1, 2015-2016 De tre senaste föreläsningarna Läsanvisning: kap 2 & 13 meddelanden och
Datastrukturer och algoritmer
Innehåll Datastrukturer och algoritmer Föreläsning 2 Fält Specifikation, Konstruktion och Specifikation, Konstruktion Dynamiska resurser Länk Länkade celler 25 26 Fält Modell Schackbräde Organisation n-dimensionellt
DAI2 (TIDAL) + I2 (TKIEK)
TNTMN KURSNMN PROGRM: KURSTKNING XMINTOR lgoritmer och datastrukturer I2 (TIL) + I2 (TKIK) 2017/2018, lp 4 LT75 Uno Holmer TI ÖR TNTMN redagen den 1/8 2018, 08.0-12.0 HJÄLPML NSVRIG LÄRR atastrukturer
Datastrukturer och algoritmer
Innehåll Datastrukturer och algoritmer Föreläsning 2 Fält Specifikation, Konstruktion och Specifikation, Konstruktion Dynamiska resurser Länk Länkade celler 23 24 Konstruktion av Fält Fysisk datatyp i
Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:
Länkade listor i C Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till: Dynamiskt allokerad array Arrayer allokerade på stacken Kan alltså användas till att
Föreläsning 14 Innehåll
Föreläsning 14 Innehåll Abstrakta datatyper, datastrukturer Att jämföra objekt övriga moment i kursen Om tentamen Skriftlig tentamen både programmeringsuppgifter och teoriuppgifter Hitta fel i fingerade
Tentamen Datastrukturer D DAT 035/INN960
Tentamen Datastrukturer D DAT 035/INN960 21 december 2007 Tid: 8.30-12.30 Ansvarig: Peter Dybjer, tel 7721035 eller 405836 Max poäng på tentamen: 60. (Bonuspoäng från övningarna tillkommer.) Betygsgränser,
Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.
Programmering med Java Programmering med Java Programspråket Java Källkodsexempel Källkod Java API-exempel In- och utmatning Grunderna Ann Pan panda@nada.kth.se Rum 1445, plan 4 på Nada 08-7909690 Game.java
Seminarium 13 Innehåll
Seminarium 13 Innehåll Prioritetsköer och heapar Prioritetsköer ADTn Klassen PriorityQueue i java.util Implementering med lista Heapar ADTn För implementering av prioritetskö För sortering Efter seminariet
Övning från förra gången: readword
(9 september 2010 T4.1 ) Övning från förra gången: readword /** readword.c * * int readword(char w[], int n) { * * Läser tecken tills en bokstav påträffas. * Läser och lagrar sedan högst n-1 bokstäver
Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då
Agenda Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer Övningar nu och då 1 Motivering I de flesta problem ingår att hantera multipla data I de
Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp
Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Dataingenjörsprogrammet, elektroingenjörsprogrammet och medicinsk teknik KTH Skolan för Teknik och Hälsa Redovisning: Se Kurs-PM om hur redovisningen
Föreläsning 4 Datastrukturer (DAT037)
Föreläsning 4 Datastrukturer (DAT037) Fredrik Lindblad 1 2016-11-10 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt Se http://wwwcsechalmersse/edu/year/2015/course/dat037 Förra
TDIU01 - Programmering i C++, grundkurs
TDIU01 - Programmering i C++, grundkurs Sammanfattning period 1 Eric Elfving Institutionen för datavetenskap 1 oktober 2013 Översikt Ett C++-programs uppbyggnad Variabler Datatyper Satser Uttryck Funktioner
TUTORIAL: SAMLING & KONSOLL
TUTORIAL: SAMLING & KONSOLL Denna tutorial är en fortsättning på den tutorial där vi skapade klassen Car och sedan objekt av denna klass. Vi skall nu lära oss att lagra dessa objekt i en samling och även
Tentamen, Algoritmer och datastrukturer
UNDS TEKNISKA ÖGSKOA (6) Institutionen för datavetenskap Tentamen, Algoritmer och datastrukturer 23 8 29, 8. 3. Anvisningar: Denna tentamen består av fem uppgifter. Totalt är skrivningen på 36 poäng och
ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar
Föreläsning 1 Innehåll Prioritetsköer och heapar Prioritetsköer och heapar ADT prioritetskö Klassen PriorityQueue i java.util Heapar Implementering av prioritetskö med heap Sortering med hjälp av heap
TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find
TDDI16 Datastrukturer och algoritmer Prioritetsköer, heapar, Union/Find Prioritetsköer En vanligt förekommande situation: Väntelista (jobbhantering på skrivare, simulering av händelser) Om en resurs blir
Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??
Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? C är ett språk på relativt låg nivå vilket gör det möjligt att konstruera effektiva kompilatorer, samt att komma nära
Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen
Datastrukturer och algoritmer Föreläsning 15 Inför tentamen 1 Innehåll Kursvärdering Vi behöver granskare! Repetition Genomgång av gammal tenta 2 Första föreläsningen: målsättningar Alla ska höja sig ett
Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp
Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Dataingenjörsprogrammet, elektroingenjörsprogrammet och medicinsk teknik KTH Skolan för Teknik och Hälsa Redovisning: Se Kurs-PM om hur redovisningen
Frekvenstabell över tärningskast med C#
Instruktion Frekvenstabell över tärningskast med C# Introduktionsuppgift Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402 Innehåll Du ska följa steg för steg -instruktionen i
Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA
Välkommen till Datastrukturer, algoritmer och programkonstruktion eller DOA Jag: Christer Labbassar: Caroline: Johan: Agenda, före lunch Inledning om DOA-kursen Backspegel Mål Syfte Examination Om lärande
Föreläsning Datastrukturer (DAT037)
Föreläsning Datastrukturer (DAT037) Nils Anders Danielsson 2015-11-20 Idag Grafer: Terminologi. Datastrukturer. Topologisk sortering. Kortaste vägen. Bredden först-sökning. Dijkstras algoritm. (Vi får
Tentamen ID1004 Objektorienterad programmering May 29, 2012
Omtentamen för ID1004 Objektorienterad programmering HT11, 29 maj 2012, 09-13 Denna tentamen examinerar 3 högskolepoäng av kursen. Inga hjälpmedel är tillåtna. Tentamen består av 12 frågor. Varje fråga
BridgeView. Klasser i BridgeView. Klassen Grafiska Gränssnittet. Klassen TSPELET
BridgeView Till denna andra prototyp av programmet har klasserna byggts ut och fått en struktur som klarar av det enda användarfall, som hittills tagits upp. Förhoppning finns att nya användarfall inte
Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.
Datastrukturer och algoritmer Föreläsning 7 Tabell, hashtabell Relation & lexikon Innehåll Tabell Tabell Hashtabell Relation, lexikon Modell Uppslagsbok Organisation Ändlig avbildning av argument på värden
Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna
Föreläsning Innehåll Prioritetsköer och heapar Prioritetsköer och heapar ADT prioritetskö Klassen PriorityQueue i java.util Implementering med lista ar Implementering av prioritetskö med heap Sortering
Tentamen Datastrukturer, DAT037 (DAT036)
Tentamen Datastrukturer, DAT037 (DAT036) Datum, tid och plats för tentamen: 2017-08-17, 8:30 12:30, M. Ansvarig: Fredrik Lindblad. Nås på tel nr. 031-772 2038. Besöker tentamenssalarna ca 9:30 och ca 11:00.
Magnus Nielsen, IDA, Linköpings universitet
Föreläsning 7 Introduktion till sortering TDDC91,TDDE22,725G97: DALG Utskriftsversion av föreläsning i Datastrukturer och algoritmer 24 september 2018 Magnus Nielsen, IDA, Linköpings universitet 7.1 1
Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary 1 1.1 Definitioner... 1 1.2 Implementation... 2
Föreläsning 4 ADT Map/Dictionary, hashtabeller, skip-listor TDDC91: DALG Utskriftsversion av föreläsning i Datastrukturer och algoritmer 9 september 2015 Tommy Färnqvist, IDA, Linköpings universitet 4.1
Kurskod D0010E Datum 2012-05-15 Skrivtid 5tim
LULEÅ TEKNISKA UNIVERSITET Tentamen i Objektorienterad programmering och design Totala antalet uppgifter: 5 Lärare: Håkan Jonsson, 491000, 073-820 1700 Resultatet o entliggörs senast: 2012-05-29. Tillåtna
Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe
Fortsä'ning Pekare Ulf Assarsson Originalslides av Viktor Kämpe Pekare och Arrayer/VK 2 Pekare och Arrayer/VK 3 Förra föreläsningen Pekare Bll data Arrayer fix storlek och adress Dynamisk minnesallokering
Föreläsning 1 Datastrukturer (DAT037)
Föreläsning 1 Datastrukturer (DAT037) Fredrik Lindblad 1 30 oktober 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037
Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.
Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 3 Innehåll Lite om felhantering och Exceptions Mer om variabler och parametrar
Tentamen i Algoritmer & Datastrukturer i Java
Tentamen i Algoritmer & Datastrukturer i Java Hjälpmedel: Skrivhjälpmedel, miniräknare. Ort / Datum: Halmstad / 2007-03-13 Skrivtid: 4 timmar Kontakt person: Nicolina Månsson, tel. 035-167487 Poäng / Betyg:
Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.
-Algoritmer och Datastrukturer- Abstrakt datatyp Datatyp för en variabel Betecknar i ett programmeringsspråk den mängd värden variabeln får anta. T ex kan en variabel av typ boolean anta värdena true och
Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2
AID-nummer: Datum: 2014-12-18 Kurskod: 725G61 Provkod: LAB1 Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2 Skrivningstid: 2014-12-18 klockan 8.00-10.00. Hjälpmedel: Inga. För varje fråga
Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar
öreläsning 2 Stackar, köer och listor TDDC91,TDDE22,725G97: DALG Utskriftsversion av föreläsning i Datastrukturer och algoritmer 6 september 2018 Magnus Nielsen, IDA, Linköpings universitet x 21 Introduktion
Tentamen Datastrukturer D DAT 035/INN960
Tentamen Datastrukturer D DAT 035/INN960 22 december 2006 Tid: 8.30-12.30 Ansvarig: Peter Dybjer, tel 7721035 eller 405836 Max poäng på tentamen: 60. (Bonuspoäng från övningarna tillkommer.) Betygsgränser,
732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning
Varför? 732G11 Linköpings universitet 2011-02-08 Varför? 1 2 3 Varför? 4 5 Medelvärde av 5000 tal Varför? while-loopen int nrofints = 5000; int [] integers = new int [ nrofints ]; int pos = 0; while (
Användarhandledning Version 1.2
Användarhandledning Version 1.2 Innehåll Bakgrund... 2 Börja programmera i Xtat... 3 Allmänna tips... 3 Grunderna... 3 Kommentarer i språket... 4 Variabler... 4 Matematik... 5 Arrayer... 5 på skärmen...
Programmering II (ID1019) :00-17:00
ID1019 Johan Montelius Programmering II (ID1019) 2014-03-10 14:00-17:00 Förnamn: Efternamn: Instruktioner Du får inte ha något materiel med dig förutom skrivmateriel. Mobiler etc, skall lämnas till tentamensvakten.
Föreläsning Datastrukturer (DAT036)
Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2013-10-30 Repetition Analys av tidskomplexitet. Kostnadsmodeller. Asymptotisk komplexitet/notation. Dynamiska arrayer. Amorterad tidskomplexitet
Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö
Stack < == > Stack och Kö Y s t M A p 1 Stack, specifikation En lista med element av typen T. Samtliga operationer utförs endast på listans ena ände, top. Stack() post: stacken är tom 2 Kö == > Y s t M
Länkade strukturer, parametriserade typer och undantag
Länkade strukturer, parametriserade typer och undantag Programmering för språkteknologer 2 Sara Stymne 2013-09-18 Idag Parametriserade typer Listor och länkade strukturer Komplexitet i länkade strukturer
Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.
Tentamen Programmeringsteknik I 2012-06-04 Skrivtid: 1400-1700 Hjälpmedel: Java-bok Tänk på följande Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till
Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB
Arrayer (vektorer) Murach s: kap 8 2013-01-15 1 Elektronikcentrum i Svängsta AB Arrayer Arrayer (vektorer) Ofta i ett program har vi flera variabler av samma datatyp som är relaterade till varandra. Exempel
Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering
Föreläsning 1 Objektorienterad programmering DD1332 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer Kompilering och exekvering Ett program måste översättas till datorns språk
Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer
Arrayer Samling av data Datastrukturer int[] minatelnummer = new int[30]; // allokering av tillräckligt // stort minnesutrymme Element refereras genom indexering ringa = minatelnummer[25]; // indexering
C++ Slumptalsfunktioner + switch-satsen
C++ Slumptalsfunktioner + switch-satsen Veckans avsnitt består av ett antal lite udda funktioner man kan ha nytta av när man skriver program. Det är en slumptalsgenerator och lite annat smått och gott.
Föreläsning 4 Datastrukturer (DAT037)
Föreläsning 4 Datastrukturer (DAT07) Fredrik Lindblad 1 november 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt Se http://wwwcsechalmersse/edu/year/2015/course/dat07 1 Innehåll
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
Tentamen Programmeringsteknik II 2018-10-19 Skrivtid: 8:00 13:00 Tänk på följande Skriv läsligt. Använd inte rödpenna. Skriv bara på framsidan av varje papper. Lägg uppgifterna i ordning. Skriv uppgiftsnummer
Lösningsförslag till tentamen Datastrukturer, DAT037,
Lösningsförslag till tentamen Datastrukturer, DAT037, 2018-04-05 1. q.dequeue() tar O(1) (eventuellt amorterat) s.contains(x) tar O(1) pq.add(x) tar O(log i) I värsta fall exekveras innehållet i if-satsen.
Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen
Tentamen för teknisk kemi, 10p, moment 1 29 november 1999 Skrivtid 9-15 Hjälpmedel: av följande böcker. - U. Bilting och J. Skansholm: Vägen till C - A. Kelley & I. Pohl: A Book on C Maxpoäng: Gräns för