Post on 11-Dec-2020
Programmering för språkteknologer II, HT2014
Avancerad programmering för språkteknologer, HT2014
evelina.andersson@lingfil.uu.seRum 9-2035http://stp.ling.uu.se/~evelina/uv/uv14/pst2/
2
Idag
- Hashtabeller
- Kodkvalité
- Objektorienterad analys
- Övningar – Komplexitet – Objektorienterad analys/design
3
Hashtabeller
4
Associativa typer
- En array associerar heltal med värden av godtycklig typ:
String[] array = new String[4]; array[0] = "Kalle"; array[1] = "Anka"; array[2] = "Dator"; array[3] = "Bok";
Kalle Anka Dator Bok
index: 0 1 2 3
5
Associativa typer
- Tänk om vi kan associera värden av godtycklig typ med hjälp av ett godtyckligt värde, dvs en nyckel, istället för ett index.
Exempel:
nyckel: “K” “A” “D” “B”
Kalle Anka Dator Bok
6
Associativa typer
- Tänk om vi kan associera värden av godtycklig typ med hjälp av ett godtyckligt värde, dvs en nyckel, istället för ett index.
Exempel:
Problem: Hur ska datorn veta var i arrayen “K” finns?
nyckel: “K” “A” “D” “B”
Kalle Anka Dator Bok
7
Associativa typer
- Tänk om vi kan associera värden av godtycklig typ med hjälp av ett godtyckligt värde, dvs en nyckel, istället för ett index.
Exempel:
Problem: Hur ska datorn veta var i arrayen “K” finns?
Lösning: Konvertera “K” till ett giltigt index med hjälp av en hashfunktion.
nyckel: “K” “A” “D” “B”
Kalle Anka Dator Bok
8
Associativa typer
- Tänk om vi kan associera värden av godtycklig typ med hjälp av ett godtyckligt värde, dvs en nyckel, istället för ett index.
Exempel:
Lösning: Konvertera “K” till ett giltigt index med hjälp av en hashfunktion.
s2 s3 s4 s5
hashfunktion:
nyckel: “K” “A” “D” “B”
9
Hashtabeller – Skapa hashtabell
HashMap<String,String> Dictionary = new HashMap<String,String>(100);
0
1
2
3
4
5
6
7
10
Hashtabeller – insättning
K Kalle
A Anka
D Dator
B Bok
0
1
2 K Kalle
3
4
5
6
7
Sätt in ordet Kalle i ordlistan.
dictionary.put("K", "Kalle");
11
Hashtabeller – insättning
Sätt in ordet Anka i ordlistan.
dictionary.put("A", "Anka");
0
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
12
Hashtabeller – insättning
Sätt in ordet Dator i ordlistan.
dictionary.put("D","Dator");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
13
Hashtabeller – insättning
Sätt in ordet Bok i ordlistan.
dictionary.put("B", "Bok");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7 B Bok
K Kalle
A Anka
D Dator
B Bok
14
Hashtabeller – insättning
Nu har vi lagrat vår ordlista i hashtabellen.
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7 B Bok
K Kalle
A Anka
D Dator
B Bok
15
Hashtabeller – Sökning
Hur kan vi hitta ordet Kalle?
String state = dictionary.get("K");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7 B Bok
K Kalle
A Anka
D Dator
B Bok
16
Hashtabeller – Sökning
Hur kan vi hitta ordet Anka?
String state = dictionary.get("A");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7 B Bok
K Kalle
A Anka
D Dator
B Bok
17
Hashtabeller – Sökning
Hur kan vi hitta ordet Dator?
String state = dictionary.get("D");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7 B Bok
K Kalle
A Anka
D Dator
B Bok
18
Hashtabeller – Sökning
Hur kan vi hitta ordet Bok?
String state = dictionary.get("B");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7 B Bok
K Kalle
A Anka
D Dator
B Bok
19
Hashtabeller – Fakta
Skapa hashtabell:HashMap<K,V> name = new HashMap<K, V>(int capacity);
Insättning: name.put(K key, V value);
Sökning:V value = (V)name.get(K key);
K – står för key och kan vara av godtycklig typV – står för value och kan vara av godtycklig typ
20
Hashtabeller – Krockhantering
Vad händer om två nycklar får samma indexi hashtabellen?
21
Hashtabeller – Krockhantering
dictionary.put("K","Kalle");
0
1
2 K Kalle
3
4
5
6
7
K Kalle
A Anka
D Dator
B Bok
22
Hashtabeller – Krockhantering
dictionary.put("A","Anka");
0
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
23
Hashtabeller – Krockhantering
dictionary.put("D","Dator");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
24
Hashtabeller – Krockhantering
dictionary.put("B","Bok");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
25
Hashtabeller – Krockhantering
Index 2 i hashtabellen har redan ett värde, så nu blir det en krock. Hur ska vi lösa detta?
dictionary.put("B","Bok");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
26
Hashtabeller – Krockhantering
Det finns olika sätt att lösa en krock - länkning - Varje plats i hashtabellen innehåller en länkad lista
- öppen adressering - Placera datan på den första lediga platsen i hashtabellen
27
Hashtabeller – Krockhantering
länkning - Varje plats i hashtabellen innehåller en länkad lista
dictionary.put("B","Bok");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
28
Hashtabeller – Krockhantering
länkning - Varje plats i hashtabellen innehåller en länkad lista
B Bok
dictionary.put("B","Bok");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
29
Hashtabeller – Krockhantering
Länkning: Sökning
Vilket ord finns lagrat i nyckel B?
String state = dictionary.get("B"));
B Bok
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
30
Hashtabeller – Krockhantering
Länkning: Sökning
Vilket ord finns lagrat i nyckel B?
String state = dictionary.get("B"));
B Bok
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
31
Hashtabeller – Krockhantering
Länkning: Sökning
Vilket ord finns lagrat i nyckel B?
String state = dictionary.get("B"));
B Bok
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
32
Hashtabeller – Krockhantering
Länkning - insättning: - hashfunktionen används på nyckeln och vi får ett index i hashtabellen - nyckel + data placeras in i den enkellänkade listan i index
- sökning: - hashfunktion används på nyckeln och vi får ett index - Man går igenom listan i index i tills: - data med motsvarande nyckel hittas och data returneras - eller tills listan är slut. Om listan är slut, returneras null.
33
Hashtabeller – Krockhantering
Öppen adressering: Lagra på den första lediga platsen.
dictionary.put("B","Bok");
0 D Dator
1
2 K Kalle
3
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
34
Hashtabeller – Krockhantering
Öppen adressering: Lagra på den första lediga platsen.
0 D Dator
1
2 K Kalle
3 B Bok
4
5 A Anka
6
7
dictionary.put("B","Bok");
K Kalle
A Anka
D Dator
B Bok
35
Hashtabeller – Krockhantering
Öppen adressering: Lagra på den första lediga platsen.
dictionary.put("S","Stol");
S Stol
0 D Dator
1
2 K Kalle
3 B Bok
4
5 A Anka
6
7
K Kalle
A Anka
D Dator
B Bok
36
Hashtabeller – Krockhantering
Öppen adressering: Lagra på den första lediga platsen.
0 D Dator
1
2 K Kalle
3 B Bok
4
5 A Anka
6
7
dictionary.put("S","Stol");
K Kalle
A Anka
D Dator
B Bok
S Stol
37
Hashtabeller – Krockhantering
Öppen adressering: Lagra på den första lediga platsen.
0 D Dator
1
2 K Kalle
3 B Bok
4 S Stol
5 A Anka
6
7
dictionary.put("S","Stol");
K Kalle
A Anka
D Dator
B Bok
S Stol
38
Hashtabeller – Krockhantering
Öppen adressering: Sökning
0 D Dator
1
2 K Kalle
3 B Bok
4 S Stol
5 A Anka
6
7
dictionary.get("S");
K Kalle
A Anka
D Dator
B Bok
S Stol
39
Hashtabeller – Krockhantering
Öppen adressering: Sökning
0 D Dator
1
2 K Kalle
3 B Bok
4 S Stol
5 A Anka
6
7
dictionary.get("S");
K Kalle
A Anka
D Dator
B Bok
S Stol
40
Hashtabeller – Krockhantering
Öppen adressering: Sökning
0 D Dator
1
2 K Kalle
3 B Bok
4 S Stol
5 A Anka
6
7
dictionary.get("S");
K Kalle
A Anka
D Dator
B Bok
S Stol
41
Hashtabeller – Krockhantering
Öppen adressering
insättning: - applicera hashfunktionen på nyckeln och få ett index i hashtabellen - gå in i indexet och leta efter den första lediga platsen - placera nyckeln + datan på den platsen
Sökning: - applicera hashfunktionen på nyckeln - leta efter nyckeln, om den hittas returneras värdet annars returneras null.
42
Hashtabeller – Krockhantering
Täthet
- Risken för krockar ökar ju fler nycklar man placerat i hashtabellen.
- Det tar längre tid att lägga in och söka efter nycklar i en hashtabell ju fler krockar man har.
- Riktmärke:antal nycklarantal platser
=0.75
43
Hashtabeller - JAVA
Klasser: Hashtable, HashMap, HashSet – Nycklarna lagras i osorterad ordning – Krockhantering: Länkning TreeMap, TreeSet – Nycklarna lagras i sorterad ordning
Krav: Följande metoder måste implementeras: - int hashCode() – omvandlar nyckeln till ett index som finns I hashtabellen
- boolean equals(Object other) – returnerar sant om två objekt är lika annars falskt.
44
Hashtabeller - JAVA
Konstruktorer: - HashXXX(); Kapacitet: 16 Täthet: 0.75
- HashXXX(int capacity); Kapacitet: capacity Täthet: 0.75 - HashXXX(int capacity, float loadFactor); Kapacitet: capacity Täthet: loadfactor
45
Hashtabeller - JAVA
Konstruktorer: - TreeXXX(); Skapar ett tomt träd - TreeXXX(Collection<? extends E> c) Skapar ett nytt träd som innehåller samma object som c - TreeXXX(Comparator<? super E> comparator) Skapar ett nytt tomt träd sorterad enligt comparator
- TreeXXX(SortedSet<E> s) Skapar ett nytt träd med samma innehåll som i s
46
Hashtabeller - JAVA
Klasser: Hashtable, HashMap, HashSet
- När antalet element i hashtabellen överstiger kapaciteten gånger täthetsfaktorn, utökas tabellen. - Detta tar tid och ska därför inte göras ofta.
- Täthetsfaktorn kan användas för att balansera uttrymmet mot effektiviteten.
47
Hashtabeller - JAVA
Klasser: Hashtable, HashMap, HashSet
- Krockhantering: Länkning
- För att objekt av en klass ska kunna placeras i en hashtabell måste man implementera följande: - int hashCode() - Avgör i vilket index en nyckel ska placeras i - boolean equals(Object other) - Finns definierad i objekt - Avgör om två nycklar är lika
48
Hashtabeller - JAVA
int hashCode()
- Två objekt som är lika enligt equals ska få samma hashCode
- Två objekt som inte är lika enligt equals behöver inte få samma hashCode
- Strategier: - Linjär sökning: ett steg i taget - Kvadratisk sökning: 1, 2, 4 ,8 16,... - Dubbelhashning: en ytterliggare hashfunktion avgör hur många steg som ska tas
49
Klassen String - boolean equals(Object o)
Jämför alltid strängar med equals, istället för string1 == string2.
Exempel:
String string = "Hej";
if(string.equals("Hej")) { System.out.println("Same string");} else { System.out.println("Not the same string");}
50
Hashtabeller - JAVA
boolean equals(Object o)
- Ta reda på om två objekt är lika (jämför == för värden)
- Exempel: public class Person{ String name = ""; public boolean equals (Object o) { if(this == o) return true; // samma objekt }
51
Hashtabeller - JAVA
boolean equals(Object o)
- Ta reda på om två objekt är lika (jämför == för värden)
- Exempel: public class Person{ String name = ""; public boolean equals (Object o) { if(this == o) return true; // samma objekt // Testa om o inte är en instans av Person else if (!(o instanceof Person)) return false; }
o instanceof klassnamnreturnerar sant om o är en instans av klassenklassnamn, annars returneras falskt.
52
Hashtabeller - JAVA
boolean equals(Object o)
- Ta reda på om två objekt är lika (jämför == för värden)
- Exempel: public class Person{ String name = ""; public boolean equals (Object o) { if(this == o) return true; // samma objekt // Testa om o inte är en instans av Person else if (!(o instanceof Person)) return false; else { // Testa om instansvariablerna har // samma värde Person oPerson = (Person)o; return name == oPerson.name; } } }
53
Kodkvalité
54
Kodkvalité - Namn
- namnet på en variabel ska beskriva vad som finns lagrat i den
Ex. String name; är bättre än String n;
- namnet på en metod ska beskriva vad metoden utför för något Ex. String getName(); är bättre än String getN();
55
Kodkvalité – Koden i metoderna
- Om ni har flera satser som utföra ungefär samma sak: – Samla satserna i en metod och anropa den istället
– Då blir det lättare att underhålla koden om ni behöver göra ändringar i den.
Exempel: Det är lättare att göra ändringar i en metod somanropas flera gånger istället för att leta eftersnarlika kodblock och ändra på var och en av dem.
56
Kodkvalité – Koden i metoderna
- Om koden i en metod är lång kan det bli svårt att få en överblick över kod i metoden. Lösning: Dela upp koden i lämpliga metoder och anropa metoderna istället.
57
Kodkvalité – Synlighet
- Endast de metoder och variabler som andra klasser ska kunna använda ska vara publika
- De variabler som klassen själv ska kontrollera ska vara privata – Andra klasser kan ändra/hämta värden med hjälp av setter/getter (inkapsling)
58
Objektorienterad analys
59
Objektorienterad analys(OOA)
- Analysera problemet
- Vad ska programmet göra? – Skapa användningsfall
- Bestäm vilka klasser som ska användas och hur de ska samarbeta
60
Objektorienterad design(OOD)
- Förfina och detaljera analysen
- Bestäm vilka metoder och variabler som ska ingå i klasserna
61
Objektorienterad Programmering(OOP)
- Implementera designen i något objektorienterat språk (Java, C++, C#,...)
62
OOA/OOD – Översikt på arbetsgången
- Ta fram objektkandidater
- Grovrensa bland objekten
- Klassifiera objekten
- Gruppera och beskriv relationer mellan klasserna
- Ta fram användningsfall och validera systemet
- Rita klassdiagram
- Detaljdesigna klasser
63
OOA/OOD – Ta fram objektkandidater
- Brainstorming
- Substantiv-verb metoden: – Substantiv: Möjliga objektet – Verb: Möjliga metoder
Checklista:- Faktiska saker (bil, hus)- Platser(rum, trädgård)- Begrepp(bankkonto, transaktion)- Roller(kund, spelare)- Händelser(landning, avbrott)- ...
64
OOA/OOD – Grovrensa bland objekten
- Finns det dubbletter? – Är några objekt samma, men har olika namn?
- Är några orimliga och borde vara variabler? Ex. Bör namnet på en person vara en klass eller en instansvariabel?
65
OOA/OOD – Klassificera objekten
- Arbeta till exempel CRC-kort – C- class – klassens namn – R- responsibility --- Vad vet objekten av en klass eller vad gör objekten för att fylla sin funktion? Ex. Ett objekt av klassen Person vet namnet på personen – C- collaborators, --- Vilka klasser samarbetar klassen med?
–CRC-korten kan flyttas runt, uppdateras och slängas i efterhand
66
OOA/OOD – Gruppera och beskriv relationer mellan klasser
- Vilka klasser hör ihop? – Lämpligt med arv/gränssnitt? – Placera I paket?
67
OOA/OOD – Användningsfall och validering
- Användningsfall – Vad ska programmet utföra?
- Validering – Kan klasserna användas för att utföra användningsfallen – Har vi rätt klasser? – Har vi hittat alla klasser som behövs? – Vilka klasser samarbetar och hur?
68
OOA/OOD – Rita klassdiagram
- Baserat på analysen
69
OOA/OOD – Detaljdesigna klasser
- Vilka metoder behöver vi? – Framförallt icke-privata metoder – klassens gränssnitt
- Vilka variabler behövs? – Vilka datastrukturer är lämpliga att använda?
70
Laboration 4
- Textbaserat äventyrsspel
- Skriv egen kod från grunden – Strukturera upp koden i lämpliga klasser – Använd lämpliga datastrukturer
- Läs igenom instruktionen och kraven ordentligt innan ni sätter i gång!
71
Kommande veckor
Laboration 3: deadline: 13/10
Laboration 4: deadline: 29/10 Laborationstillfällen: 13/10 och 20/10
Nästa föreläsning: 3/11 - Repetition - Exempeltenta - Maila in önskemål
Det mesta schemalagda är slut– Mycket eget arbete- Maila om ni behöver hjälp/undrar något!
Anmäl er till tentan i Studentportalen
72
Arbeta själv
- Arbeta med laborationerna
- Gör programmeringsövningar – Från boken – Laborationer fårn tidigare kursomgångar
- Läs till tentamen
- Arbeta med gamla tentor