f7: ou4, hashar, omtentan 2017-08-24 · 2019. 5. 19. · mer om hashar • det finns säkra...
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