30
Alberi Binari di Ricerca e Dizionari Alberi Binari BST in java Dizionari e Hash Table Hash Table In Java Alberi Binari di Ricerca e Dizionari Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Alberi Binari di Ricerca e Dizionariprofs.sci.univr.it/~farinelli/courses/algBio/slides/BST-Hash.pdf · Alberi Binari di Ricerca e Dizionari - Laboratorio di Programmazione II Corso

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Alberi Binari di Ricerca e DizionariLaboratorio di Programmazione IICorso di Laurea in Bioinformatica

    Dipartimento di Informatica - Università di Verona

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Sommario

    Alberi binari di ricerca (BST)Implementazione BSTDizionari ed Hash TableHash Table in Java

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Alberi Binari

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Alberi Binari

    Concetti di baseOgni nodo puo’ avere al piu’ due figliInformazioni del nodo:

    Elemento (i.e., Chiave)figlio destrofiglio sinistro

    BinaryNode.java

    http://profs.sci.univr.it/~farinelli/courses/algBio/codice/BinaryNode.java

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Alberi binari di ricerca

    Concetti baseAlbero binario che soddisfa la seguente proprieta’Per ogni nodo n sia k chiave di n:

    tutte le chiavi contenute nel suo sottoalbero sx sono ≤ di ktutte le chiavi contenute nel suo sottoalbero dx sono ≥ di k

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Operazioni principali su BST

    Interfaccia BSTVisite

    pre-ordine, post-ordine, ampiezzain-ordine: le chiavi risultano ordinati

    get: cerca una chiave nell’albero, sfrutta la definizione diBST per efficienzaput: inserisce una chiave nell’albero mantenendo leproprieta’ del BSTremove: elimina una chiave dall’albero mantenendo leproprieta’ del BST

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    BST

    ImplementazioneStrutture collegate per albero binarioUtilizzo interfaccia ComparableInterfaccia: BST.javaRealizzazione: SimpleBST.java

    http://profs.sci.univr.it/~farinelli/courses/algBio/codice/BST.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/SimpleBST.java

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Ricerca in un BST

    Ricerca di chiavi in un BSTRicerca sfrutta l’ordine naturale delle chiaviDato un nodo n (inizialmente n = radice) ed una chiave dacercare item

    se n.chiave uguale a item, restituisco nse item < n.chiave cerco nel sottoalbero sinistrose item > n.chiave cerco nel sottoalbero destro

    Ipotesi: non ho mai due chiavi uguali nell’alberoIpotesi resa vera dalla procedura di inserimento

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Inserimento

    Inserimento chiavi in un BSTmetodo ricorsivo che attraversa l’albero fino a trovare laposizione corretta in cui inserire il nuovo nodoposizione corretta soddisfa le proprieta’ del BSTse la chiave e’ gia’ presente nell’albero non inserisco unnuovo nodo (restituisco quello gia’ presente)metodo put(..) classe SimpleBST.java

    http://profs.sci.univr.it/~farinelli/courses/algBio/codice/SimpleBST.java

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Cancellazione

    Cancellare chiavi da un BSTCancello il nodo con la chiave che voglio eliminareDebbo aggiornare i nodi in modo tale che l’albero siaancora un BSTMetodo remove(...) classe SimpleBST.java

    http://profs.sci.univr.it/~farinelli/courses/algBio/codice/SimpleBST.java

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Stampa albero

    Rappresentazione parenteticaRappresentazione intuitiva e semplice per alberi( radice ( sottoalbero sx ) ( sottoalbero dx ) )

    Example (Rappresentazione parentetica)

    2

    4

    3 5 7

    6

    ( 4 ( 2 ( ) ( 3 ( ) ( ) ) ) ( 6 ( 5 ( ) ( ) ) ( 7 ( ) ( ) ) ) )

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Esercizi

    Esercizi su BSTImplementare il metodo get(...) della classeSimpleBST.javaImplementare il metodo ricorsivo recToString(...) dellaclasse SimpleBST.javaImplementare il metodo riempiLista(...) della classeSimpleBST.javaImplementare il metodo parse(...) della classeSimpleBST.java

    ipotizziamo di avere in input solo interiutilizzare la classe StringTokenizer per dividere la stringa

    http://profs.sci.univr.it/~farinelli/courses/algBio/codice/SimpleBST.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/SimpleBST.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/SimpleBST.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/SimpleBST.java

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Dizionari e Hash Table

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Dizionari

    ADT DizionarioIn generale un ADT che supporta le seguenti operazioni e’detto Dizionario

    1 membership (get o search)2 put3 remove

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Dizionari

    Il concetto di chiaveDizionari: insieme di coppie Generalizzazione di Array: indicizziamo elementi conoggettiOrdine totale sulle chiaviChiave univoca in un dizionarioOperazioni:

    put(key, element)remove(key)get(key)

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Implementazione dei Dizionari

    Possibili implementazioniBST sono una implementazione di un dizionarioBasta aggiungere al nodo un campo elemento distinto dalcampo chiaveHashTable altra implementazione

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Hash Table in Java

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    L’interfaccia Map

    L’interfaccia Map

    Permette di indicizzare oggetti (elementi) utilizzando altrioggetti (chiavi)Metodi fondamentali:

    put(Object key, Object value)get(Object key)remove(Object key)containsKey(), containsValue()

    Vedere Map nelle API java

    http://docs.oracle.com/javase/7/docs/api/java/util/Map.html

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Implementazioni di Map

    Implementazioni di MapTreeMap:

    implementazione basata su BSTred black tree: caso speciale di BST

    HashMapimplementazione basata su hashing

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Creazione ed utilizzo di HashMap

    Example (utilizzare HashMap)

    HashMap profilo =new HashMap();

    profilo.put("A", 3);profilo.put("C", 0);profilo.put("G", 0);profilo.put("T", 1);

    System.out.println(profilo);System.out.println("valore di A = "+profilo.get("A"));

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Scandire una HashMap

    Scandire una HashMapPosso accedere all’insieme delle chiavi con il metodokeySet();Scandire il vettore con gli iteratoriAccedere agli elementi con il metodo getOppure accedere alla collezione dei valori: metodo values()

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Scansione di HashMap

    Example (utilizzo keySet())

    int sum = 0;Set keySet = profilo.keySet();for (Iterator iterator = keySet.iterator();iterator.hasNext();) {

    String nucleotide = iterator.next();sum+=profilo.get(nucleotide);

    }System.out.println("somma = "+sum);

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Scansione di HashMap

    Example (utilizzo values())

    sum = 0;Collection valueSet = profilo.values();for (Iterator iterator = valueSet.iterator();iterator.hasNext();) {

    Integer integer = iterator.next();sum+=integer;

    }System.out.println("somma = "+sum);

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Indicizzazione tramite oggetti

    il metodo hashCode()

    hashCode() e’ un metodo di object che ha una suaimplementazione di defaultBasata sulla locazione di memoria dell’oggetto(vedere APIper dettagli)Posso ridefinire il metodo hashCode() come con qualsiasialtro metodoOverriding dell’hashCode() necessario se ho ridefinitoequals()

    Se due oggetti sono uguali debbono avere lo stesso codicedi hash

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Esempio problemi hashCode()

    Example (problemi hashCode)

    HashMap map =new HashMap();

    map.put(new Studente("001"),randomEsami(5));map.put(new Studente("002"),randomEsami(2));map.put(new Studente("003"),randomEsami(3));System.out.println(map);

    Studente s = new Studente("001");List listaEsami = map.get(s);System.out.println(listaEsami);

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Overriding di hashCode()

    overriding di hashCode()

    hashCode() deve essere consistente con il metodo equals()esempio: Studente.java abbiamo fatto overriding diequals() ma non di hashCode()consistente deve essere basato sugli stessi campi

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Esempio overriding di hashCode()

    Example (overriding di hashCode)

    In Studente.java

    ...public int hashCode() {return matricola.hashCode();}...

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Fare overriding di hashCode()

    fare overriding di hashCode()

    Utilizzare il metodo hashCode() di Object per i singolicampiSe ho tipi primitivi, creo l’oggetto corrispondente e chiamohashCode()Quando ho piu’ elementi posso semplicemente sommare glihashCode()Questo risulta in un comportamento corretto: istanzeuguali avranno lo stesso hashCode()Posso avere metodi per calcolare l’hashCode() che risultanoin comportamenti piu’ efficienti per le operazioni della Mapapprofondimento B. Eckel Thinking in java (disponibileon-line)

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Esercizi I

    Esercizi su Hash Table Iimplementare il metodo calcolaMediaStudenti(...) dellaclasse ExampleHashCode.javaa

    implementare il metodo migliorStudente(...) della classeExampleHashCode.javamodificare la classe CoordinatePolari.java in maniera taleda avere un corretto funzionamento del metodo main dellaclasse TestHashCode.java [soluzione inCoordinatePolari.sol2]

    aScaricare il file Nucleotide.java per poter compilare ExampleHashCode.java.

    http://profs.sci.univr.it/~farinelli/courses/algBio/codice/ExampleHashCode.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/ExampleHashCode.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/CoordinatePolari.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/TestHashCode.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/CoordinatePolari.sol2http://profs.sci.univr.it/~farinelli/courses/algBio/codice/Nucleotide.java

  • Alberi Binaridi Ricerca eDizionari

    Alberi Binari

    BST in java

    Dizionari eHash Table

    Hash TableIn Java

    Esercizi II

    Esercizi su Hash Table IIimplementare il metodo compareTo(...) della classeSongManager.javaimplementare il metodo hashCode(...) della classeSongManager.javaa

    implementare il metodo bestSong(...) della classeSongManager.java

    aNota: il metodo non è presente e va quindi dichiarato ed implementato.

    http://profs.sci.univr.it/~farinelli/courses/algBio/codice/SongManager.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/SongManager.javahttp://profs.sci.univr.it/~farinelli/courses/algBio/codice/SongManager.java

    Alberi BinariBST in javaDizionari e Hash TableHash Table In Java