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}


Recommended