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