f7: ou4, hashar, omtentan 2017-08-24 · 2019. 5. 19. · mer om hashar • det finns säkra...

39
F7: OU4, hashar, omtentan 2017-08-24 Carl Nettelblad 2019-05-20

Upload: others

Post on 30-Jan-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • F7: OU4, hashar,

    omtentan 2017-08-24

    Carl Nettelblad

    2019-05-20

  • Lite administrativt

    • Anmäl er till uppsamlingstillfällena. Ena blev fullt, fler platser öppnade.

    • Möjligt att redovisa alla kursens uppgifter, framför allt rester.

    • Men ingen given möjlighet att komplettera igen om ni får rest då. Se till att

    kolla automattesterna, kodstil, korrekthet – och att ni själva minns vad

    koden gör!

    • ANMÄL ER i gruppindelning i Studentportalen, så vi kan bemanna utifrån

    det, senast 29 maj.

  • OU4

    • När bollar studsar byter de tillstånd

    – Lätt att skriva system med fasta regler för att växla

    mellan tillstånd som skapar oscillationer

    – I vårt fall: boll studsar in och ut ur väggen eller

    varandra fram och tillbaka

    – Lösningar?

    • Kolla att bollen faktiskt är på väg in i väggen

    • Mer allmän (feg) lösning: timer som nollställs, nya

    studsar mot samma vägg omöjliga väldigt snart

    (men kan ge problem), flytta ut positionen en bit

  • OU4

    • Vad händer om man skrivit något annat än ett tal i ett

    fält?

    – Kastas ett undantag? Inte så lyckat.

    – Låter man bli att utföra åtgärden utan att berätta för

    användaren? Kanske inte så lyckat.

  • Hitta källan

    public void actionPerformed(ActionEvent e) {

    if (e.getSource() == obj1) {

    // Åtgärd för objekt 1

    } else if (e.getSource() == obj2) {

    // Åtgärd för objekt 2

    } else {

    // throw new RuntimeException här???

    }

    }

  • step-metod

    • Hur tar vi hand om att radera objekt?

    – Om man loopar med for (Ball b : balls) ges ett fel om man använder remove

    – Att loopa med index kan gå bra, men det är lätt att missa ett

    index (om du tar bort objekt k måste du minska k med 1)

    • Kanske ingen katastrof att missa vissa par ibland på just

    den här uppgiften, men mer generellt

    – Annat alternativ: skapa lista med alla objekt som ska tas bort

    och radera dem i efterhand

    • När ska vi rita upp på nytt?

    – En gång per tidssteg

  • Hashtabeller

    • Arrayer är snabba. Lagra alla element i en array, välj

    index utifrån en hashfunktion. Samma objekt leder alltid

    till samma hashvärde.

    • Blir värdena alltid unika? Oftast inte.

    • Hur gör man då?

    – Leta efter en annan plats i arrayen. eller

    – Använd en länkad lista för alla element som

    ”kolliderar”.

    • Vi tittar på alternativet med en länkad lista.

  • Heltal som element

    • Tänk att vi har en liten tabell med 7 platser och hashfunktionen ℎ(𝑘) =𝑘 mod 7 (rest vid heltalsdivision) som hashfunktion.

    • Väljer att hålla listorna sorterade

    eftersom man vid inlägg ändå

    måste kontrollera att elementet

    inte redan är inlagt.

    k 27 4 7 42 3 14 81 26 13 8

    h(k) 6 4 0 0 3 0 4 5 6 1

  • Tidskomplexitet

    • Om tabellstorleken ungefär motsvarar antalet element

    och hashfunktionen ger bra spridning tar sökning,

    inlägg och urtag 𝒪(1) tid

    – Nära på lika snabbt som vanlig array

    – Trädstrukturer är 𝒪(log 𝑛)

    • Dessutom är varje operation ofta dyrare

  • Skapa hashfunktioner

    • Enormt viktiga att hashvärdet är ”någorlunda unikt”

    – Även när man tar modulo något mindre tal

    • För heltal: ℎ(𝑘) = 𝑘

    – Blir 𝑘 mod 𝑚 i praktiken för hashtabell storlek 𝑚

    • Teckensträngar

    – Konstruera ett heltal utifrån teckenkoderna, se mer i länkat

    dokument

    – Ofta viktigt att samma teckenföljd i annan ordning inte får

    samma kod

    – Addera hash för flera element, multiplicera med (samma)

    primtal emellan

    – Fungerar även för flera fält i ett objekt

  • Hashstrukturer i Java

    • HashSet

    • HashMap

    • Ofta bättre (snabbare) än TreeSet, TreeMap

    – Samma metoder

    – Olika implementationer av gränssnitten (interface)

    Set och Map

    – Går att skriva kod som ska ”ta” en Map och sedan ge den antingen en TreeMap eller en HashMap

  • Hashfunktioner i Java

    • Java har inbyggda hashfunktioner

    – Metoden int hashCode() finns i klassen Object

    – Precis som toString och equals

    • Standardversionen beräknar hash utifrån referenslikhet

    – D.v.s. om a == b har de också samma hashvärde

    – I standardklasser som ersätter equals ersätts också hashCode

    – Samma objekt bör inte byta hashvärde under sin livstid

    – Tänk om du stoppar in ett objekt i en HashSet och sedan förändrar det så att det byter hashvärde…

    • En egen klass bör alltid ha en egen toString

    – Om du har en egen hashCode bör du ha en egen equals, och vice versa

  • Mer om hashar

    • Det finns säkra ”kryptografiska” hashar

    – Skapar unika värden från input

    – Svårt att medvetet skapa input med viss output

    – Kan användas för att kontrollera att en fil är oförändrad

    – Om äkthet är viktigt, men inte konfidentialitet, räcker det att kryptera

    hashvärdet med en nyckel

    • Grund för certifikat på Internet, Bittorrent (filer delas upp i chunks som

    hashas och bildar ett träd), Bitcoin (varje block i blockkedjan innehåller en

    hash från föregående)

    • Vanliga hashCode i Java är inte kryptografisk

    – Att hasha ett heltal till sig självt modulo k är lätt att räkna baklänges

    • Javabiblitoteken har stöd för kryptografiska hashar också

    – Heter saker som SHA-256 (dåliga, som inte längre används, hette

    MD5, SHA-1)

  • Genomgång av tentan

    2017-08-24

    • Tentan och lösningsförslag finns på nätet.

    • Försöker fokusera på hur man kan tänka för att närma

    sig en lösning.

    • Fråga gärna om det är någon speciell uppgift ni har sett

    som ni vill veta mer om.

  • Flervalsfrågor

    • I princip kunskapsfrågor från kursen.

  • Flervalsfrågor

    • Läs noga all information om ett eller flera svar är/kan

    vara rätt.

  • Flervalsfrågor

    • En logaritmisk

    del är inte det

    samma sak

    som att den

    växer

    logaritmiskt.

    • Läs noga även

    om alternativen

    på olika frågor

    liknar varandra.

  • A2

    • Javadoc-kommentaren beskriver vad metoden gör,

    men säger inte vad den heter. Den säger inte returtyp,

    men säger vilken sorts värde som returneras. Den

    säger exakt vad argumenten heter.

    • Här fick vi veta att den räknade ut upphöjt. I texten stod

    det att var decimaltal, men double som sådant

    nämndes inte.

    • public static double pow(double base, intexponent)

  • A3

    • Standardrekursion för listor. Hjälpmetod som jämför

    varje nod tills den hittat rätt, returnerar ny efterföljare

    som sätt att utföra raderingen.

    • Notera behovet att kasta undantag i basfallet.

    • Att uppgiften ber dig att implementera en metod

    betyder inte att du BARA bör/kan/får skriva den

    metoden.

  • A4

    • Dokumentationen för String var bilaga. Parametrarna

    kan vara en char-array, ett index och en längd.

    Returtypen är en sträng. Alltså blir värdet här strängen

    (inte arrayen eller något annat) "bcd”

    • Viktigt att kunna läsa kod och skriva kod, men också

    viktigt att kunna läsa och skriva dokumentation

    • Ju komplexare funktionalitet du använder, desto

    viktigare att inte behöva förstå hela koden du anropar

    för att kunna använda den…

  • A5

    • Det är viktigt att kunna implementera

    standardmetoderna toString, equals, hashCodekorrekt för egna klasser.

    • Vi har inte gjort equals så mycket.

    • Men i kodbilagan fanns flera exempel på equals för andra klasser (t.ex. List)!

    • equals jämför alltid med ett annat Object

    • DU måste kolla att objektet inte är null och är av rätt typ (Student) innan du typomvandlar till Student och försöker komma åt dess fält

  • A6

    • Vi får en ledtråd i att String implementerar Comparable.

    • Dokumentationen för Comparable fanns med i bilagan. 0 betyder likhet. Om och endast om

    surname.compareTo(s.surname) är 0 behöver vi jämföra firstName, annars returnerar vi det vi fick för surname

  • A6

    • Vi får en ledtråd i att String implementerar Comparable.

    • Dokumentationen för Comparable fanns med i bilagan. 0 betyder likhet. Om och endast om

    surname.compareTo(s.surname) är 0 behöver vi jämföra firstName, annars returnerar vi det vi fick för surname

  • A7

    • Tidskomplexiteten tar vi reda på genom att förstå det

    rekursiva förloppet. Det här var en sorterad lista, så

    metoden stegar så länge elementet som ska läggas till

    kommer senare i sorteringsordningen än nuvarande

    element. Om vi inte vet något annat om elementet som

    läggs till bör det i medeltal hamna mitt i listan, så

    komplexiteten är proportionell mot längden.

  • A8

    • Borde ha stått höjden, men tydligt från uppgiften. Ni

    gjorde samma sak i OU3. Kruxet är att se att man

    måste följa alla grenar i trädet och ta max på varje nivå,

    antingen med Math.max eller egen if-sats som jämför (undvik för hög komplexitet!).

  • A9

    • Också väldigt lik OU3, med en demonstration av en

    viktig teknik, där hjälpmetoden inte returnerar något

    utan har voidtyp. Resultatet syns i stället i att den

    förändrar en ArrayList som skickas in.

  • A10

    • Hur kontrollera att en sträng är null eller tom? Hur göra det i rätt ordning för att undvika

    NullPointerException?

  • A11

  • A11

    • Hur fungerar arv? Om A extends B – vad gäller då?

    • Varje A är en B. Varje B är inte en A.

    • En variabel av basklasstyp kan referera till ett objekt av

    subklasstyp.

  • A11

    • I Java tillämpas konsekvent polymorfi (dynamisk

    bindning). Det är objektets typ, inte variabelns typ, som

    styr vilken metod som anropas. Draw-metoden för en Rose anropas alltid för det objektet, även om det är en Plant-variabel som refererar till den.

  • Godkänd!

    • Dags för högre betyg.

  • B1

    • Vi måste titta på List och övriga klasser, vad saknas vad gäller equals och hashCode?

    • List.equals finns, Student.equals finns, Student.hashCode finns

    • List.hashCode saknas!

    • Kombinera hashvärdena för alla studenter genom

    addition och multiplikation med primtal

    – Godtagbar trubbig strategi

  • B2

    • Rätt vanligt scenario, vi vill göra en traversering och

    någon typ av filtrering samtidigt.

    • Och vi vill inte i onödan besöka delar av trädet som inte

    kan bidra till summan.

    • Dock fel i facit, vänstergrenen måste följas även om now.data >= limit

  • B3

    • Vi ska generera en ArrayList, så vi har nog en hjälpmetod med void som returtyp

    • Vad kan vi rekursera på?

    – Början av ordet och hur många versaler vi har ”kvar” att placera ut

    • På varje nivå

    – Lägg till gemen och rekursera med en bokstav till, samma count

    – Lägg till versal och rekursera med en bokstav till, count – 1

    • Basfall

    – count blir negativt, bryt

    – Vi uppnår mallsträngens längd, lägg till i listan

  • B4

  • B4

    • Rekursion i x- och y-koordinater

    – Rekursionssteg prova x+-1, y +-1

    – Sätt färgen till newcolor

    • Basfall

    – Färgen är inte oldcolor

    • För varje rekursionssteg som inte är basfallet kommer vi att ändra färg på

    minst en pixel

    • Både rekursionsdjup och komplexitet är som värst linjära med antalet

    pixlar

    • Se upp om gammal och ny färg är identiska i första anropet

    • Annars, starta i angiven startpunkt

  • B5

    Tänk på att ni kan använda en lämplig bas när konstanta faktorer är irrelevanta.

    I bas 10 är jämförelsen lätt att göra, man kan lösa ut konstanter för de olika

    algoritmerna och se vad som dominerar. Skriva en tabell över olika värden eller

    skissa kurvor kan vara en hjälp.

  • B6

    • Titta på att alla metoder som anropas faktiskt finns för de typer

    som är deklarerade. Om variabeln har typ A kan du bara anropa

    de metoder som finns i A, även om de versioner av metoderna

    som anropas är de i B.

    • Tänk på effekterna av olika synlighet (private, protected, public)

    • Tänk på att abstrakta metoder och metoder i interface måste

    implementeras i berörda konkreta klasser

    • Tänk på skillnaden mellan extends och implements

  • Frågor?

    • Lycka till med tentan och OU5!

    • På OU5:

    – Tänk på var olika delar av logiken placeras

    – Försök att låta bli att kopiera kod

    – Försök undvika många olika delfall (särskilt i

    Symbolic)

    – Fundera på när och om det är motiverat att

    introducera nya metoder i basklasser