1 / 54

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

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.

glenna
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algoritmer och datastructurer -Sökträd, naiva och balancerade lösningar -HashTable -- Kapitel 19, 20.

  2. 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

  3. Är det ett sökträd? 7 2 9 11 1 5 8 3

  4. Implementation – noden class Node <AnyType> { AnyType element; Node left; Node right; Node( AnyType data) { element=data; left=right=null; } } 3

  5. ...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 }

  6. Insert () 6 7 2 9 11 1 5 3

  7. Insert () 6 7 2 9 11 1 5 3

  8. Insert () 6 7 2 9 11 1 5 3

  9. Insert () 7 2 9 6 11 1 5 3

  10. 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; }

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

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

  13. 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 !! }

  14. Remove () a) Om noden är löv 7 2 9 11 1 5 3

  15. Remove () b) Om noden har ett barn 7 2 9 11 1 5 3

  16. Remove () c) Om noden har två barn 7 2 3 9 11 1 5 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 4

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

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

  19. Hur? • Olika tekniker att balancera • AVL Träd • Red Black Träd • AA Träd

  20. Balancerad Search Trees – AVL Ett träd är balancerad om höjdskillnaden mellan den vänstra delträdet och den högra delträdet är maximum 1. 12 8 16 4 10 14 HR=1 HL=2 2 6 HL– HR = 2 – 1 = 1

  21. Balanced Search Trees – AVL Ett träd är balancerad om höjdskillnaden mellan den vänstra delträdet och den högra delträdet är maximum 1. 12 8 16 4 10 14 HR=0 HL=1 2 6 HL– HR = 1 – 0 = 1

  22. BST: AVL – Balanced? 1 insert 12 8 16 4 10 14 2 6

  23. BST: AVL – Rotation höger k1 k2 k2 C k1 B A B C A

  24. k1 8 16 4 14 2 6 1 BST: AVL – Rotate right k2 12 10

  25. BST: AVL – Rotation vänster k1 k2 k2 A k1 C A B B C

  26. 1 4 5 6 2 6 5 6 7 1 1 5 7 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!

  27. 4 5 4 5 AA – Träd • Vänster länk är inte tilllåten • I det fallat gör – screw!

  28. 15 10 15 20 10 20 A B A B AA – Träd : Operation split()

  29. 10 15 10 15 A B c A B c AA – Träd : Operation skew()

  30. Hash Tabeller? • Varför en annan datastruktur? • Konstant tid för både insert- och find- operationer

  31. Hash? ”Daniel” Insert Find =18

  32. Hashfunktioner! • Hash functioner använder associerade “key” ( som kan vara data i sig ) . • Hash funktionerna är olika för olika sorts data. • Integers • Images • Strings Etc…

  33. 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!

  34. Exempel av hash funktion ”Daniel” D a n i e l 589 68 97 110 105 101 108 + + + + + =

  35. 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…

  36. 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

  37. 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

  38. Hur löser man kollision? • Oavsett hur unika keys en hash- funktionen tar fram, kommer kollisioner alltid att inträffa. • Terminology • Load factor

  39. Lösningar • Linear probing ( undersökning ??) • Quadratic probing • Double hashing • Separate chaining

  40. Linear probing • Sök fram till näst lediga platsen. hashfunc( ) 10 18 18 X=18 X+1, X+2, X+3, X+4, X+5, ...

  41. Linear probing • Fenomen kallat: Primary clusters

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

  43. 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, ...

  44. Quadratic probing • Garantera att hitta fria platser om de finns 12 = 1 22 = 4 32 = 9

  45. 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, ...

  46. 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.

  47. Separate chaining H H H H H H H H H Insert Insert Insert

  48. 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

  49. Hash tabeller i java • I klassen java.util finns klassen HashMap<K,V> som implementerar interfacet 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 metoden equals. Anm: För flera av Javas egna klasser är detta redan gjort. T ex klassen String.

  50. Använding av HashMap • Antag vi vill vill sätta in Person-objekt i en hashtabell, med nyckel = personens namn: class Person { String name; // namn long pNbr; // personnummer public Person(String n, long pnbr) {...} public boolean equals(Object rhs) { return name.equals(((Person) rhs).name); } // andra metoder i klassen Person }

More Related