programmering för språkteknologer ii, ht2014 avancerad …evelina/uv/uv14/pst2/f5/2014... ·...

Post on 11-Dec-2020

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related