Kurshandbok för
Algoritmer och mjukvarudesign
Studietips från Pär
Att lära sig programmera tex html, css, javascript C#, python är som att lära sig spela ett instrument – det handlar mindre om att memorera fakta och mer om att bygga upp ett ”muskelminne” i fingrarna och hjärnan. För att verkligen bemästra hantverket behöver du kombinera teori med att faktiskt göra, varje dag. Här är min metod för att du ska lyckas:
- Gör det till en daglig vana: Sätt av 2–4 timmar varje dag hemma eller i skolan. Varva läsning i kurslitteratur och kolla inspelningar, med att faktiskt skriva kod då skapar du en naturlig rytm där hjärnan får bearbeta informationen från flera olika håll.
- Härma för att förstå: Börja med att skriva av kodexempel ur kursboken, inspelningar, från nätet. Det kan kännas enkelt, men det är ett kraftfullt sätt att låta ögonen och händerna lära sig språkets mönster. Innan du vet ordet av kommer syntaxen att sitta i ryggmärgen.
- Experimentera och lek: När du har skrivit av kod – våga ändra! Testa att byta ut en html tagg, en css styling, förändra en variabel eller ändra en loop och se vad som händer. Det är i de små misstagen och felsökningarna som den verkliga förståelsen föds. Det är här du går från att kopiera till att förstå.
- Bygg något eget från dag ett: Låt all ny kunskap landa direkt i ett eget projekt – kanske ett system för en pizzeria, en bilfirma, en förening eller en frisör. Genom att använda det du precis lärt dig och applicera det på ditt egna projekt, förvandlar du abstrakt teori till ett hantverk du faktiskt äger.
- "Rubber Ducking": När du felsöker och ändrar i din kod – försök att förklara högt för dig själv (eller en badanka på skrivbordet) varför du tror att koden gör som den gör. Att sätta ord på kodlogiken och vad den gör, del för del, är det sista steget för att verkligen befästa kunskapen.
Veckoplanering
Vecka 18 - Hashtabeller
Kursmaterial
- En hashtabell, eller hash table, är en datastruktur som används för att lagra nyckel-värde-par. Den är mycket effektiv för att snabbt hitta, lägga till och ta bort data. Här är en grundläggande förklaring av hur en hashtabell fungerar i C#: 1) Nyckel och värde: Varje element i en hashtabell består av en nyckel och ett värde. Nyckeln används för att identifiera värdet. 2) Hashfunktion: En hashfunktion tar en nyckel och omvandlar den till ett index i tex en array där värdet lagras. Detta gör att man kan hitta värdet snabbt. 3) Kollisioner: Ibland kan två olika nycklar generera samma index. Detta kallas en kollision, och det finns olika metoder för att hantera detta, såsom chaining( kedjning) eller open addressing (öppna adressering).
- Kap 8 Hashtables
- Sid 210-212 Hashtable fundmentals
- Sid 212-213 Chaining
- Sid 214 Remove items
- Sid 213-214 Openadressing
- Sid 215 Linear Probing
Del 1 Intro Hashtabeller Den första delen handlar om hashtabeller och presenteras i form av en PowerPoint där jag går igenom grundläggande koncept, vanliga begrepp och visar kodexempel på hur man kan skapa en egen implementation av en hashtabell. Jag förklarar vad en hashfunktion är, hur data organiseras i så kallade buckets, och hur man hanterar kollisioner med hjälp av chaining (kedjning). Dessutom går jag igenom vanliga algoritmer för att lägga till, ta bort och söka efter data i en hashtabell.
Del 2 Hashtabeller Open addressing Den andra delen om hashtabeller presenteras i en PowerPoint där jag förklarar open addressing, som är ett alternativt sätt att hantera kollisioner jämfört med chaining. Jag går igenom hur open addressing fungerar och vilka olika metoder som kan användas inom det. Dessutom pratar jag om vad som händer när hashtabellen börjar bli full. Då behöver man bland annat öka tabellens storlek dynamiskt och genomföra en rehashing, vilket innebär att alla element placeras om i en ny, större tabell.
Fö1 Hashtabell (Pär) I den här delen får du lära dig hur man skapar en egen klass för att implementera en hashtabell, som bland annat kan användas för att hantera bilobjekt. Som buckets används en array där varje plats innehåller en länkad lista. I dessa listor kan vi lagra key-value-par, där nyckeln (key) är bilens registreringsnummer och värdet (value) är själva bilobjektet.
Vi går igenom hur add-metoden fungerar för att lägga till ett bilobjekt i hashtabellen. Den använder både en hashfunktion och en teknik för att hantera kollisioner. Om flera bilar får samma index i arrayen, används chaining, vilket innebär att flera objekt kan lagras i samma bucket med hjälp av en länkad lista.
Hashfunktionen som används är baserad på DJB2-algoritmen. Den tar en sträng (t.ex. registreringsnumret) och omvandlar den till ett index i arrayen. Det är på den här platsen i tabellen som bilobjektet sedan lagras eller hämtas.
Fö2 Hashtabell -Get Metoden(Pär) I den här delen får du lära dig hur man skapar en get-metod som används för att hämta data från hashtabellen baserat på en nyckel – i det här fallet ett registreringsnummer. När du anropar metoden med ett regnummer som nyckel, returneras det bilobjekt som är kopplat till just den nyckeln.
Om det har uppstått en kollision (det vill säga att flera olika regnummer har hamnat på samma plats i arrayen), används chaining för att hantera detta. Det innebär att flera objekt kan ligga i en länkad lista på samma index. get-metoden går då igenom listan och letar efter det regnummer som matchar det du söker. När en matchning hittas, returneras det tillhörande bilobjektet.
Fö3 Hashtabell - Remove metoden (Pär) I den här delen får du lära dig hur man skapar en remove-metod, som används för att ta bort ett objekt från hashtabellen baserat på en nyckel – till exempel ett registreringsnummer. Metoden letar upp rätt plats i tabellen med hjälp av hashfunktionen och söker sedan igenom den länkade listan (om chaining används) för att hitta och ta bort det objekt som matchar nyckeln.
Fö4 Hashtabell - Openadressing (Pär) I den här delen får du lära dig hur man hanterar kollisioner med öppen adressering. Exemplet visar hur man lägger till ett bilobjekt i hashtabellen genom att använda linjär probing – en metod där man söker efter nästa lediga plats i arrayen om den ursprungliga positionen redan är upptagen. På så sätt hittar man en tom plats där bilobjektet kan sparas, utan att använda länkade listor.
Fö5 Hashtabell - Openadressing (Pär) I den här delen får du lära dig hur man hanterar kollisioner med öppen adressering. Exemplet visar hur man hämtar ett bilobjekt baserat på registreringsnummer. Om det uppstår en kollision – det vill säga att flera nycklar har hamnat på samma plats – används linjär probing för att söka vidare i tabellen. Det innebär att man steg för steg kontrollerar nästa indexposition tills man hittar det bilobjekt som matchar det angivna registreringsnumret.
Fö6 Hashtabell (Hans Edy) Hans Edy föreläning om hash tabeller
Fö7 Öppen adressering (Hans Edy) Hans Edy's föreläsning om bla öppenadressering i hashtabeller
Att göra
- Gör en egna implementation av Hashtabell som har Add, Get, Remove funktionalitet. Den ska också ha egen hash- och resize. Samt hantera kollisoner med chaining och eller openadressing. Låt AI-verktyg ställa frågor till dig om Hashtabeller samt ge dig programmeringsuppgifter på Hashtabeller
- Examination: Se kursrummet i Canvas vad som ska göras, hur det ska lämnas in och redovisas samt deadline.
Instuderingsfrågor
- What is a hash table?
- What is a bucket in a hash table?
- What is the purpose of a hash function in a hash table?
- How is a hash function chosen for a hash table?
- What is a hash collision?
- How does a hash table handle collisions?
- What is a hash collision chain?
- What is a hash table collision resolution algorithm?
- What is the difference between open addressing and chaining collision resolution techniques?
- How does linear probing work in open addressing?
- What is the time complexity of searching for an element in a hash table?
- What is the worst-case time complexity for searching for an element in a hash table?
- What is the load factor of a hash table?
- What is the ideal load factor for a hash table?
- What is the purpose of a hash tables resize operation?
- What is the difference between a hash table and an array?
- What is the difference between a hash table and a map?
Vecka 19 - Inlämning av labb 4 om Hashtabeller
Vecka 22 - Binära träd
Kursmaterial
- Ett binärt sökträd (BST) är en datastruktur som används för att lagra sorterade data och möjliggör snabb sökning, insättning och borttagning av element. Här är några viktiga egenskaper hos ett binärt sökträd: 1)Noder: Varje nod i trädet innehåller en nyckel och två pekare, en till vänster barn och en till höger barn. 2) Ordning: För varje nod gäller att alla nycklar i det vänstra delträdet är mindre än nodens nyckel, och alla nycklar i det högra delträdet är större. 3) Rekursion: Trädet är rekursivt definierat, vilket innebär att varje delträd också är ett binärt sökträd.
- Kap10 Trees focus binärt sökträd
Fö1 Träd (Pär) I den här delen får du en grundläggande genomgång av datastrukturen träd. Jag förklarar vad ett träd är och går igenom vanliga begrepp som används för att beskriva dess uppbyggnad. Du får lära dig vad en nod är, vad som menas med roten (startpunkten i trädet), barn (noder som är kopplade under en annan nod), syskon (noder som har samma förälder), löv (noder utan barn), samt begreppen djup och höjd, som beskriver hur långt ner eller högt upp en nod befinner sig i trädet.
Fö2 Binärt sökträd (Pär) I den här delen får du lära dig vad ett binärt sökträd (BST) är och vilka grundläggande egenskaper det har. Ett binärt sökträd är en datastruktur där varje nod har högst två barn – ett vänsterbarn och ett högerbarn. Värdena i trädet är organiserade så att alla värden i vänstra delen är mindre än nodens värde, och alla värden i högra delen är större.
Du får också se hur man lägger till nya värden i ett BST, både med hjälp av rekursion och med en while-loop. Båda metoderna visar hur man navigerar genom trädet för att hitta rätt plats att sätta in det nya värdet, samtidigt som trädets struktur och ordning bevaras.
Fö3 Binärt sökträd traversering av alla noder (Pär) I den här delen får du lära dig hur man besöker alla noder i ett binärt sökträd (BST) med hjälp av in-order-traversering. Denna metod går igenom trädet i en särskild ordning: först det vänstra barnet, sedan själva noden, och till sist det högra barnet. När man använder in-order på ett BST, kommer nodernas värden att visas i stigande ordning, till exempel från A till Ö eller från lägsta till högsta tal.
Fö4 Binärt sökträd traversering av alla noder (Pär) Visar hur du sökar i ett BST både rekursivt och med hjälp av while loop. Vad är tidskomplexiteten i bäst resp sämst fall?
Fö5 Binära träd (Hans Edy) Hans Edy's föreläsning om träd och binäraträ, där begrepp gås igenom. Hur man traverser ett träd samt implementation av träd.
Fö6 Binärt sökträd (Hans Edy) Hans Edy's föreläsning om binärt sökträd. Hur man lägger till, tar bort nod.
Att göra
- Låt AI-verktyg ställa frågor till dig om vanliga koncepet, kunskaper och kodings förmågor som du måste ha kring binärt sökträd samt låt AI ge dig programmeringsuppgifter om binära träd.
- Examination: Se kursrummet i Canvas vad som ska göras, hur det ska lämnas in och redovisas samt deadline.
Instuderingsfrågor
- What is a Binary Search Tree?
- What is the time complexity of searching for an element in a balanced BST?
- What is the worst-case time complexity for searching an element in a BST?
- How does an in-order traversal of a BST output the elements?
- What property must the left and right subtrees of a BST node satisfy?
- What is a balanced BST, and why is it important?
- Describe the process of inserting a new value into a BST.
- Give an example of a situation where a BST is preferable over a hash table.
- How would you check if a binary tree is a BST?
| PROGRAM | IT-säkerhet och mjukvarutestning – kandidatprogram |
|---|---|
| SYFTE | Olika typer av datastruktur introduceras, som länkadelistor, köer, hashtabeller och träd. För- och nackdelar diskuteras med avseende till snabbhet, minnesresurser och komplexitet som grund för kvalificerade val av datastruktur för att lösa ett specifikt problem. |
| KURSPLAN | Gå till kursplan hos DU |