Algoritmer och datastrukturer

Relevanta dokument
Föreläsning 7. Träd och binära sökträd

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 7. Träd och binära sökträd

Föreläsning 9 Innehåll

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 10 Datastrukturer (DAT037)

BST implementering, huvudstruktur

Interfacen Set och Map, hashtabeller

Algoritmer och datastrukturer 2012, fo rela sning 8

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Föreläsning 11 Innehåll

Lösningar Datastrukturer TDA

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 14 Innehåll

13 Prioritetsköer, heapar

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Diskutera. Hashfunktion

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

Föreläsning 10 Innehåll

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning 10 Innehåll

Inlämningsuppgift och handledning

Föreläsning 8. Mängd, Avbildning, Hashtabell

Datastrukturer. föreläsning 6. Maps 1

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

Självbalanserande AVL-träd Weiss, avsnitt 4.4

Föreläsning 8. Mängd, Avbildning, Hashtabell

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Lösningsförslag till exempeltenta 1

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Inlämningsuppgift och handledning. Föreläsning 11 Innehåll. Diskutera. Hashtabeller

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

Föreläsning 9 Innehåll

Tentamen i Algoritmer & Datastrukturer i Java

Lösningsförslag till tentamen Datastrukturer, DAT037,

Algoritmer och datastrukturer 2012, föreläsning 6

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Programmering för språkteknologer II, HT2011. Rum

Tentamen Datastrukturer D DAT 036/DIT960

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Tentamen i Algoritmer & Datastrukturer i Java

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Tentamen Programmeringsteknik 2 och MN Skrivtid: Inga hjälpmedel.

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Föreläsning 3 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Programmering för språkteknologer II, HT2014. Rum

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 4 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Länkade strukturer, parametriserade typer och undantag

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Föreläsning Datastrukturer (DAT036)

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Tentamen Datastrukturer, DAT037 (DAT036)

Symboliska konstanter const

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Datastrukturer. föreläsning 10. Maps 1

Dugga Datastrukturer (DAT036)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Innehåll. Sökning och hashtabeller. En bilsamling att söka i. En bil-klass att söka efter. Hur hittar vi alla bilar som uppfyller ett annat villkor

Föreläsning 3 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Föreläsning 6 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning Datastrukturer (DAT036)

Tentamen, Algoritmer och datastrukturer

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Datastrukturer som passar för sökning. Föreläsning 11 Innehåll. Binära sökträd Definition. Inordertraversering av binära sökträd

Hashtabeller. TDA416, lp3 2016

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning 2 Datastrukturer (DAT037)

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Trädstrukturer och grafer

Grundläggande datalogi - Övning 4

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 13 Datastrukturer (DAT037)

Seminarium 13 Innehåll

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Magnus Nielsen, IDA, Linköpings universitet

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Transkript:

Algoritmer och datastrukturer Binära sökträd Hash Tabeller Sökning Många datastukturer försöker uppnå den effektivaste sökningen I arrayer - linjer sökning, och binärt sökning när arrayen kan vara sörterad I symbol tabeller, där objekt lagras i par ( key och value ) Binära Sökträd Hash tabeller Binära heap och prioritets köer Symbol tabeller- med arrayer eller länkade struktur För complexa objekt som Customer, Person, mm.och för att kunna uppnå effektiv sökning är det bäst att man associerar en nyckel med ett värde ( objekt ) Key Value (id_nummer, Customer ) Operationer i en Symbol Tabell -klass public class ST <Key extends Comparable<Key>, Value> ST() // create a symbol table key key2 key keyn keyarray void put(key key, Value v) // put key-value pair into the table Value get(key key) // return value paired with key boolean contains(key key) // is there a value paired with key? value value2 value valuen valuearray

Binär sökträd Träd- operationer (metoder) Binära träd Maxim två barn för varje node Left / Right barn Har ordnade element Mindre värde till vänster Högre värde till höger 2 Oftast Rekursiva! Mycket effektiva, enkla att förstå Vanliga metoder Beräkna antalet noder i trädet, size() Lägg till ny nod i träd, insert(), put() Ta bort nod ur träd, remove(), get() Lista ut innehållet i trädet, print() Pre-Order In-Order Post-Order 2 classen Node...och BinarySearchTree class BinaryNode < AnyType > AnyType element; BinaryNode left; BinaryNode right; BinaryNode( AnyType data) element=data; left=right=null; public class BinarySearchTree < AnyType extends Comparable<AnyType> > BinaryNode <AnyType> root; public BinarySearchTree() root= null; -public void insert -public nbrofnodes -public remove -public find...andra... 2

Insert () Insert () 6 6 2 2 Insert () insert(), består av 2 delar public void insert( AnyType x ) root = findandinsert( x, root ); anrop av findandinsert 6 2 protected BinaryNode<AnyType> findandinsert( AnyType x, BinaryNode <AnyType> t ) if( t == null ) t = new BinaryNode <AnyType>( x ); else if( x.compareto( t.element ) < 0 ) t.left = findandinsert( x, t.left ); else if( x.compareto( t.element ) > 0 ) t.right = findandinsert( x, t.right ); else throw new DuplicateItemException( x. tostring( ) ); // Dubblett ej ok return t;

Remove () Remove () a) Om noden är löv b) Om noden har ett barn 2 2 Remove () Remove består av 2 delar c) Om noden har två barn public void remove( AnyType x ) root = findandremove( x, root ); 2 4 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

protected BinaryNode<AnyType> findandremove( AnyType x, BinaryNode<AnyType> t ) Mycket korta sökningstider! if( t == null ) throw new ItemNotFoundException( x.tostring( ) ); if( x.compareto( t.element ) < 0 ) t.left = findandremove( x, t.left ); else if( x.compareto( t.element ) > 0 ) t.right = findandremove( x, t.right ); else if( t.left!= null && t.right!= null ) // Two children t.element = findmin( t.right ).element; t.right = findandremovemin( t.right ); else if( t.left!= null ) t=t.left; // only left child else t=t.right; ( only right child return t; Farliga worst cases Lösningen? Balanserade träd Hur? Försök hålla djupet av trädet så lågt som möjligt.

Hur? Balanserad SökTräd Olika tekniker att balancera AVL Träd Red Black Träd AA Träd Andra. Ett träd är balancerad om höjdskillnaden mellan den vänstra delträdet och den högra delträdet är maximum. 2 8 6 HL=2 4 0 4 HR= 2 6 HL HR = 2 = Balanserad Sök Träd AVL BST: AVL Balanserad? Ett träd är balanserad om höjdskillnaden mellan den vänstra delträdet och den högra delträdet är maximum. insert 2 2 8 6 8 6 4 0 4 HL= 4 0 HR=0 4 2 6 2 6 HL HR = 0 = 6

BST: AVL Rotation höger BST: AVL Höger rotation k2 k k2 k 8 2 k2 k C 4 0 6 B A B C 2 6 4 A BST: AVL Rotation vänster Sök träd som Symbol tabell k2 k private class Node private Key key; private Value val; // sorted by key // associated data private A k B C A B k2 C Node left, Node right; // left and right subtrees private int N; // number of nodes in subtree public Node(Key key, Value val, int N) this.key = key; this.val = val; this.n = N;

public class BST < Key extends Comparable<Key>, Value> private Node root; // root of BST public void put(key key, Value val) root = put (root, key, val); private Node put(node x, Key key, Value val) if (x == null) return new Node(key, val, ); int cmp = key.compareto(x.key); if (cmp < 0) x.left = put(x.left, key, val); else if ( cmp > 0) x.right = put(x.right, key, val); else x.val = val; // if equals, change value in node x.n = + size(x.left) + size(x.right); return x; java.util.* Innehåller klassen TreeSet och TreeMap som garanterar O(logN) i värsta fall för sökning, insettning och borttagning TreeSet- En klass som följer Set-interface ( add, contains, remove) TreeMap- En klass som följer Map-interface ( get, put, remove) Båda är implementerade med ett slags balanserad träd ( Red-black) Objekten som sätts in TreeSet och nycklarna i TreeMap måste implementera interfacen Comparable eller ha en Comparator-objekt. Hash Tabell Hashing / Hash tabeller Fråga: Varför en annan datastruktur? Svar: Konstant tid för både insert () - och find() - operationer 8

Hash? Hashfunktioner! Insert Find Daniel =8 Hash functioner använder associerade key ( som kan vara data i sig ) för att få fram datan. Hash funktionerna är olika för olika sorts data. Integers Images Strings Etc Hashing integers? Exempel av hash funktion Tänk 6bit int => 0 6 Skapa int[] vec = new int[66]; Add i => vec[i]++; Sök value j => Is vec[j] > 0? Ta bort value k => vec[k]--; Men för en... Java int : 2bit 4 miljoner platser => opraktisk! Daniel D a n i e l 68 + + 0 + 0+ 0 + 08 = 8

Men... En bättre hash funktion Hur unik är hash fuktionen? hashfunc( Daniel ) 8 hashfunc( leinad ) 8 Bättre lösning bättre hashfunc som skapar mer unika värde hash( Daniel ) 202 Wrapp värdet till ett visst intervall 202 % array.lenght ( tebellens storlek) Ett bättre sätt att beräkna hash värdet Om vi har en text sträng av längd n+ och alla tecken har index A n, A n-,...,a 0 gör s = A n X n + A n- X n- +...+ A 0 X 0 = = ((A n )X + A n- )X +...+ A 0 Använd hashvalue = s % array.length Och då... Till exempel: Danne ((( D )28 + a )28 + n )28 + n )28 + e = (((68)28 + )28 + 0)28 + 0)28 + 0 = 8 48 8 hashvalue = 8 48 8 % array.length om length = (prim nummer) => hashvalue = 8 48 8 % = 260 Hur löser man kollision? Oavsätt hur unika nyckel en hash- funktionen räknar, kollision alltid inträffas. Terminology Load factor # used positions LF = # total avaliable positions 0

Lösningar Linjer undersöknings teknik Linear probing ( linjer undersöknings teknik) Quadratic probing (kvadratisk undersöknings teknik Separate chaining ( öppna tabeller) Sök fram till näst lediga platsen. hashfunc( ) 0 8 X=8 X+, X+2, X+, X+4, X+,... Linear probing Linjer undersöknings teknik Fenomen kallat: Primary clusters ( primär kluster) Bygger upp kluster Påverkar exekveringstiden för insert () och find()!

Quadratic probing Quadratic probing Försök undvika primary clusters Snabare en linjär Kvadratisk inkrementation av undersökning avståndet 2 2 = 4 X=8 X+ 2, X+2 2, X+ 2, X+4 2, X+ 2,... Garantera att hitta fria platser om de finns Separate chaining (separat länkning ) Separate chaining Varje hash position har en länkad lista. Påverkar inte andra värde, probing görs bara i listan. Varje element I tabellen är en länkad lista. Insert H H H H H H H H H 2

Jämförelse Linear probing Enkel Kan resultera i linjär söktid Quadratic probing Kräver Load factor < 0. annars rehashing?? Kräver prim tal för array storleken Separate chaining LF < Ingen dubblering, länkade listor är dinamiska! Kan leda till linjär sökning men I verklighetet ganska kort Double hash probing Eliminerar kluster