Kurshandbok för

Algoritmer och mjukvarudesign

Studietips från Pär

Min pedagogiska grundidé bygger på att lära sig programmering är som ett hantverk som kräver en kombination av teoretisk input och praktisk muskelminne. För att bygga en solid grund rekommenderar jag följande metodik: Avsätt 2–4 timmar dagligen. Varva läsning i kurslitteraturen med att se de inspelade föreläsningarna för att få olika perspektiv på samma koncept. Börja med att 'skriva av' befintliga kodexempel. Det kan låta enkelt, men det tränar ögat att se detaljer och syntax som man annars missar. Gör små, kontrollerade förändringar i koden och testkör direkt. Vad händer om du ändrar en loop eller en variabeltyp? Det är i felsökningen den verkliga förståelsen föds. Skapa ett eget 'projekt' som följer dig genom kursen. Det kan vara ett system för en bilfirma, ett register för en idrottsförening eller en personlig boklista. Genom att applicera det du lärt dig på en 'verkligt' projekt får du en praktisk kompetens.

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

Kursmaterial

  • Kom ihåg inlämning av labb 4 om Hashtabeller senast fredag kl 17:00

Att göra

  • Examination: Kom ihåg inlämning av labb 4 om Hashtabeller senast fredag kl 17:00

Instuderingsfrågor

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?
Vecka 23 - Inlämning av labb 7 om Binära träd

Kursmaterial

  • Kom ihåg inlämning av labb 7 om Binära träd senast fredag kl17:00

Att göra

  • Examination: Kom ihåg inlämning av labb 7 om Binärt sökträd senast fredag kl 17:00

Instuderingsfrågor

Hans Jernberg

Lärarehje@du.se

Pär Eriksson

Lärarepei@du.se

Elin Ekman

Lärareekm@du.se

Mustafa Al-Hammadi

Läraremum@du.se
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