algoritmer och datastructurer - sökträd, naiva och balancerade lösningar -hashtable

54
För utveckling av verksamhet, produkter och livskvalitet. Algoritmer och datastructurer -Sökträd, naiva och balancerade lösningar -HashTable -- Kapitel 19, 20.

Upload: glenna

Post on 13-Jan-2016

37 views

Category:

Documents


2 download

DESCRIPTION

Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar -HashTable -- Kapitel 19, 20. Speciella träd -Binära Sökträd. Har ordnade element Mindre värde till vänster Högre värde till höger. 7. 2. 9. 11. 1. 5. 3. Är det ett sökträd?. 7. 2. 9. 11. 1. 5. 8. 3. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Algoritmer och datastructurer-Sökträd, naiva och balancerade lösningar

-HashTable-- Kapitel 19, 20.

Algoritmer och datastructurer-Sökträd, naiva och balancerade lösningar

-HashTable-- Kapitel 19, 20.

Page 2: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Speciella träd -Binära Sökträd

7

2

3

9

1151

Har ordnade element Mindre värde till vänsterHögre värde till höger

Page 3: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Är det ett sökträd?

7

2

3

9

1151

8

Page 4: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Implementation – noden

3

class Node <AnyType>{ AnyType element; Node left; Node right; Node( AnyType data) { element=data; left=right=null; }}

Page 5: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

...och BinarySearchTree

public class BinarySearchTree <AnyType extends

Comparable<? super AnyType> > { Node <AnyType> root; public BinarySearchTree() { root=null; } -public void insert -public nbrOfNodes -public remove -public find , findMin, findMax}

Page 6: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Insert ()

7

2

3

9

1151

6

Page 7: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Insert ()

7

2

3

9

1151

6

Page 8: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Insert ()

7

2

3

9

1151

6

Page 9: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Insert ()

7

2

3

9

1151

6

Page 10: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

BinarySearchTree-insert (Comparable x)

public void insert ( Comparable x){ root = isert(x, root);}

public BinaryNode insert( Comparable x, BinaryNode t){ if(t==null) t= new BinaryNode(x); else if ( x.compareTo(t.element)<0) t.left=findPlaceAndLink(x, t.left); else if (x.compareTo(t.element)>0) t.right=findPlaceAndLink(x, t.right); else throw new DuplicateException(" No dublicates"); return t;

}

Page 11: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Binära Sökträd – metoden find()-mycket kort söktid

Page 12: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Binära Sökträd – metoden findMax()-mycket kort söktid

Page 13: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

BinarySearchTree-find( )

public String find ( Comparable x){ BinaryNode n= findNode( x, root); if(n==null) return null; else return n.element;

}

public BinaryNode findNode( Compare x, BinaryNode t){ while( t!=null) { if(x.compareTo(t.element)<0) t=t.left; if(x.compareTo(t.element)>0) t=t.right; else return t ; // hittat!! }return null; // inte hittat !! }

Page 14: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Remove ()

7

2

3

9

1151

a) Om noden är löv

Page 15: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Remove ()

7

2

3

9

1151

b) Om noden har ett barn

Page 16: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Remove ()

7

2

3

9

1151

4

c) Om noden har två barn

3

Ersätt värdet i noden med den minsta värdet i i det högra delträdet och sedan ta bort den noden

Page 17: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Farliga specialfall! Trädet blir en länkad lista

Page 18: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Lösningen? Balancerade träd

• Hur ? Försök hålla djupet av trädet så lågt som möjligt.

Page 19: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Hur?

• Olika tekniker att balancera • AVL Träd• Red Black Träd• AA Träd

Page 20: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Balancerad Search Trees – AVL

12

8 16

14104

2 6

Ett träd är balancerad om höjdskillnaden mellan den vänstra delträdet och den högra delträdet är maximum 1.

HR=1HL=2

HL– HR = 2 – 1 = 1

Page 21: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Balanced Search Trees – AVL

12

8 16

14104

2 6

HL=1

HL– HR = 1 – 0 = 1

HR=0

Ett träd är balancerad om höjdskillnaden mellan den vänstra delträdet och den högra delträdet är maximum 1.

Page 22: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

BST: AVL – Balanced?

128 16

104

2 6

1

14

insert

Page 23: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

BST: AVL – Rotation höger

A

k1

B

C

k2

A B C

k1

k2

Page 24: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

BST: AVL – Rotate right

10

12

16

14

k2

8

4

2 6

1

k1

Page 25: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

BST: AVL – Rotation vänster

A

k1

B C

k2

A

B

C

k1

k2

Page 26: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

AA – Träd

En ny nod skapas alltid som löv och har nivå 1.

En horizontal länk är en förbindelase med en nod med samma nivå. .

Två horisontala länkar är inte tilllåtna. Split!

5 6

5 76

4 1

5

6

7

2

1 1

Page 27: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Vänster länk är inte tilllåten

I det fallat gör – screw!

AA – Träd

4 5

4 5

Page 28: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

AA – Träd : Operation split()

A

10 2015

B

15

2010

A B

Page 29: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

AA – Träd : Operation skew()

A

10 15

B c

1510

A B c

Page 30: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Hash Tabeller?

• Varför en annan datastruktur?

• Konstant tid för både insert- och find- operationer

Page 31: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Hash?

Insert

”Daniel”=18

Find

Page 32: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Hashfunktioner!

• Hash functioner använder associerade “key” ( som kan vara data i sig ) .

• Hash funktionerna är olika för olika sorts data. • Integers• Images• StringsEtc…

Page 33: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Hashing integers?

• Tänk 16bit int => 0 – 65 535• Skapa int[] vec = new int[65536];• Add i => vec[i]++;• Sök value j => Is vec[j] > 0?• Ta bort value k => vec[k]--;• Men för en ... Java int : 32bit

• 4 billion items => impractical!

Page 34: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Exempel av hash funktion

DD aa nn ii ee ll

”Daniel”

68 97 110 105 101 108+ + + + + = 589

Page 35: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Men...

• Hur unik är den?• hashfunc(”Daniel”) → 589• hashfunc(”leinaD”) → 589

• Bättre lösning men….!• hashfunc(”TestValue”) → 129310392• Wrapp värdet till ett visst intervall

• Vilken? Arraystorleken…

Page 36: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

En bättre hash funktion

• Ett bättre sätt att beräkna hash värdet • Om vi har en text sträng av längd n+1 och alla tecken har

index An, An-1,...,A0

• gör s = AnXn + An-1Xn-1 +...+ A0X0 =

• = ((An)X + An-1)X +...+ A0

• Använd hashValue = s % array.length

Page 37: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Och då......

• For example: ”Danne”

(((’D’)128 + ’a’)128 + ’n’)128 + ’n’)128 + ’e’ =

(((68)128 + 97)128 + 110)128 + 110)128 + 101 =

18 458 851 173

hashValue = 18 458 851 173 % array.length

om length = 7919 (prim nummer) =>

hashValue = 18 458 851 173 % 7919 =2690

Page 38: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Hur löser man kollision?

• Oavsett hur unika keys en hash- funktionen tar fram, kommer kollisioner alltid att inträffa.

• Terminology• Load factor

positions avaliable total#

positions used#LF

Page 39: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Lösningar

• Linear probing ( undersökning ??)• Quadratic probing• Double hashing• Separate chaining

Page 40: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Linear probing

• Sök fram till näst lediga platsen.

hashfunc( )

101818

X=18 X+1, X+2, X+3, X+4, X+5, ...

Page 41: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Linear probing

• Fenomen kallat: Primary clusters

Page 42: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Linear probing

• Bygger upp kluster• Påverkar exekveringstiden för insert () och find()!

Page 43: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Quadratic probing

• Försök undvika“primary clusters “• Snabbare än linjär probing• Kvadratisk inkrementation av undersöknings-avståndet

X=18 X+12, X+22, X+32, X+42, X+52, ...

Page 44: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Quadratic probing

• Garantera att hitta fria platser om de finns

12 = 122 = 432 = 9

Page 45: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Double hashing

• Använder ytterligare en till hash funktion för att hitta fri plats.

X = hash(obj);X2 = hash2(obj);

X=18, X2=7 X+1*X2, X+2*X2, X+3*X2, X+4*X2, ...

X=18, X2=7 18+1*7, 18+2*7, 17+3*7, 18+4*7, ...

Page 46: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Separate chaining

• Varje hash-position har en länkad lista. • Påverkar inte andra värdet, probing görs bara i listan. • Varje element i tabellen är en länkad lista.

Page 47: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Separate chaining

HH HH HH HH HH HH HH HH HHInsertInsertInsert

Page 48: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Jämförelse

• Linear probing• Enkel• Kan resultera i linjär söktid

• Quadratic probing• Kräver Load factor < 0.5 annars rehashing ??• Kräver primtal för array storleken

• Separate chaining• LF < 1• Ingen dubblering, länkade listor är dynamiska !• Kan leda till linjär sökning men i verklighetet ganska

kort • Double hash probing

• Eliminerar kluster

Page 49: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Hash tabeller i java

• I klassen java.util finns klassen HashMap<K,V> som implementerarinterfacet Map<K,V>.

public int hashCode() och public boolean equals(Object x)

så att man får identisk hashkod för objekt som är lika enligt metodenequals.Anm: För flera av Javas egna klasser är detta redan gjort. T exklassen String.

Page 50: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Använding av HashMap

• Antag vi vill vill sätta in Person-objekt i en hashtabell, med nyckel= personens namn:

class Person {String name; // namnlong pNbr; // personnummer

public Person(String n, long pnbr) {...}public boolean equals(Object rhs) {return name.equals(((Person) rhs).name);}// andra metoder i klassen Person}

Page 51: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Använding av HashMap

HashMap<String,Person> reg = new HashMap<String,Person>();Person p = new Person("Kalle", 1111111111);reg.put(p.name, p);...Person q = reg.get("Kalle");if (q != null) {...}Observera att vi här inte själva behöver omdefiniera hashCodeeftersom nycklarna är av typen String, och i denna klass är redanhashCode omdefinierad ( så att strängar för vilka equals ger trueockså får samma hashkod).

Page 52: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

Användning av HashSet• Om vi vill sätta in Person-objekt i en samling av typen HashSet<Person> och

gör så här:

HashSet<Person> reg = new HashSet<Person>();Person p = new Person("Kalle", 1111111111);reg.add(p);...if (reg.contains(new Person("Kalle",0))System.out.println("found");elseSystem.out.println("not found");så blir utskriften ”not found”

Page 53: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

• Anledningen är att när Kalle sätts in beräknas hashkoden förobjektet som p refererar till och placeringen i tabellen beror pådenna.• När vi sedan söker efter Kalle baseras sökningen på hashkodenav det objekt som är parameter till contains-metoden och dettaär ett annat objekt (med samma namn).• Sökningen utgår från den plats denna senare hashkod anger ochmed största sannolikhet är det i en helt annan del av tabellen änden där Kalle sattes in.

Användning av HashSet

Page 54: Algoritmer och datastructurer - Sökträd, naiva och balancerade lösningar  -HashTable

För utveckling av verksamhet, produkter och livskvalitet.

hashCode-metod

• Vi kan se till att alla Person-objekt som har samma namn ocksåfår samma hashkod genom att omdefiniera metoden hashCode iklassen Person:

class Person {String name; // namnlong pNbr; // personnummer

public Person(String n, long pnbr) {...}public boolean equals(Object rhs) {som förut}public int hashCode() {return name.hashCode();}// övriga metoder i klassen Person}