Transcript
appunti java
pag. 182
11.7 Sintesi sugli attributi delle strutture dati Non rimane infine che costruire una tabella di sintesi che metta a confronto tutte le strutture Dati studiate. La tabella sarà più dettagliata di quella originaria in quanto si cercherà di dare conto anche dei diversi tempi di inserimento/generazione di una struttura, cancellazione e ricerca di un dato. Struttura Dati Array (semi stat.)
Mod. Accesso
Dim.nto
Organizzazione
Persistenza
Lettura Dato
Inserimento Dato
Sequen. Indiciz.
Statico(*)
Volatile
Ripetibile Veloce (10-8) [°]
Sequen. Lista (LinkedList)
Dinamico
Volatile
Ripetibile Veloce (10-8) [°]
In coda Ovunq. ma lento O(n/2) In mezzo (Lento) O(lgn) (u) Sovrascr. In coda Ovunq. rapido O(n/2) In mezzo
Vector
Sequen. Indiciz.
Dinamico
Volatile
Ripetibile Veloce (10-8) [°]
Albero (TreeSet) Insieme (HashSet) File Testo
Iterator Con Key
Dinamico
Disordinata Ordinata(u) Duplicati Disordinata Ordinata(u) Duplicati Disordinata Ordinata(u) Duplicati Ordinata Senza Dup.
Volatile
Ripetibile Veloce (10-8) [°]
Iterator Con Key
Dinamico
Senza Dup.
Volatile
Sequen.
Dinamico
Disodinata
Perm.te
File Dati
Sequen. Indiciz.
Dinamico
Disordinata Ordinata(u) Duplicati
Perm.te
Sequen.
Dinamico
Volatile
Sequen.
Dinamico
Ord. Di ins. Duplicati Ord. Di ins. Duplicati
Strutture Filtro Coda Pila (Stack)
Volatile
Cancell. Dato
Ricerca un Dato
O(n/2) O(lgn) (u)
Generaz. struttura Rapida
Rapida
In coda In mezzo Sovrascr. In Ordine
Ovunq. rapido
Ovunq. V. media O(lgn)
V. media
Ripetibile Veloce (10-8) [°]
Senza Ordine
Ovunq. rapido
V. media
Ripetibile Lenta (10-3) [°] Ripetibile Lenta (10-3) [°]
In Coda
Ricop. lentissima O(n/2)
Molto Lenta
In Coda Sovrascr.
Ricop. lentissima O(n/2) O(lgn) (u)
Molto Lenta
Distruttiva Veloce (10-8) [°] Distruttiva Veloce (10-8) [°]
In Coda
In Testa rapida
Rapida
In Testa
In Testa rapida
Rapida
O(lgn)
Rapida
appunti java
pag. 183
(*) l’array in java è allocato dinamicamente ma non può crescere in modo dinamico. (u) significa che per ottenere l’ordinamento o una ricerca di complessità logaritmica è necessario un algoritmo dell’utente. [°] la velocità di accesso 10-8 indica una tipica velocità di lettura in RAM, 10-3 una lettura su supporto esterno. •
•
Rapido, Semi Rapido, Lento, Molto Lento, Lentissimo, Si riferiscono rispettivamente: Rapido=velocità di semplice scrittura in Ram, Semi Rapido=scrittura in RAM con risistemazione di parte della struttura, Lenta=riscrittura in RAM di buona parte della struttura, Molto Lento=scrittura di un dato su dispositivo magnetico in sequenza, Lentissima = Riscrittura completa della struttura su disp. esterno. O(n/2) e O(lgn) significano rispettivamente che gli algoritmi di ricerca di un dato sono proporzionale a n/2 o al logn.
appunti java
pag. 180
11.E – Esercizi Esercizi su Liste 1. Si desidera progettare un programma che "Acquisisca il suo input da un testo contenuto in una Stringa e inserisca ciascuna parola del testo in una Lista”. Indicazioni: Fare uso si uno StreamTokenizer per isolare le Parole del testo. Richieste: • Progettare una classe opportuna ScanPar_01 che ottenga le funzionalità desiderate; • Testarne il funzionamento con un main() opportuno. 2. Generalizzare la classe progettata nell’esercizio 1) e chiamarla ScanPar_02 in modo che “a partire da un Testo contenuto indifferentemente sia in una Stringa che in un File di testo, ottenga sempre la lista delle parole”. La classe dovrebbe fornire anche la funzionalità aggiuntiva restituire un array di parole. 3. Generalizzare la classe progettata nell’esercizio 1) e chiamarla ScanPar_03 in modo che “restituisca le parole anche in ordine Lessicografico sia in un array che in una lista”. 4. Generalizzare la classe progettata nell’esercizio 1) e chiamarla ScanPar_04 e progettarne una seconda di nome Nodo in modo che “restituisca un elenco Ordinato di Oggetti Nodo costituito delle parole contenute nel testo con a fianco il numero di volte con cui ogni parola compare”. 5. Generalizzare la classe progettata nell’esercizio 1) e chiamarla ScanPar_05 inserendo un metodo che “consenta di stampare l’indice analitico di una parola assegnata del testo scandito”. Per indice analitico si intende la restituzione della parola con a fianco i numeri delle righe sulle quali la parola si trova nel testo. Es. se sul problema 5 si cerca la parola testo si deve ottenere: testo : 3, 5, 6 Esercizi sui Vector 6. Progettare una classe Misto che “Generi un Vector casuale sia per la distribuzione che per i valori delle componenti che devono essere Integer o Double in un range identico” . Es. se si chiedono 5 elementi questi saranno casualmente Integer o Double e avranno valori Integer nell’intervallo [MinMax] e Double nello stesso intervallo [Min.00000 – Max] 7. Generalizzare la classe del precedente esercizio 6) implementando un metodo che restituisca il Vector anche ordinato in modo crescente.
appunti java
pag. 181
8. Generalizzare la classe del precedente esercizio 7) implementando “un metodo di ricerca Dicotomina di un valore Integer o Double assegnato”. Richieste: Se il numero è presente ne restituisce la posizione se no la posizione corretta di inserimento. 9. Dopo aver generato un Vector Ordinato di grandi dimensioni [5.000, 10.000, 20.000 numeri] usando le classi precedenti, si desidera realizzare un main() che confronti i tempi a) di Ordinamento del vettore, b) di Ricerca Dicotomica della classe( 8) c) di ricerca interna alla Classe Vector. Esercizi su Insiemi 10. “Progettare e implementare la sottoclasse Insieme della classe HashTree come indicato nel capitolo”. 11. Per testare la classe 10) “Generare un Insieme con i numeri da 1 a 25 e stamparlo, eliminare tutti i numeri multipli di 2 e 3 e stamparlo ancora" 12. Per testare la classe 10) "Generare due insiemi con le parole dei due testi distinti contenuti in due stringhe, stamparli, ottenere Unione, Intersezione e le due Differenze e stamparle ancora" 13. Costrure una classe che "che restituisca in un Insieme i numeri primi compresi tra 2 e N, con N scelto dall’utente. Si utilizzi l’algoritmo di Eratostene. " 14. Costrure una classe che "che restituisca in un Insieme i numeri primi compresi tra 2 e N, con N scelto dall’utente. Si utilizzi un algoritmo DIVERSO da quello di Eratostene " 15. Costruire un programma “che confronti la velocità di esecuzione dei due algoritmi precedenti” Esercizi su collezioni 16. “Progettare un programma main con il minimo numero di righe di codice che consenta di ottenere un Insieme e mostrarlo, partendo da una Lista di 20 elementi Integer generarati casualmente nel range [0..9] e quindi con elementi ripetuti”. 17. “Progettare un programma main con il minimo numero di righe di codice che consenta di ottenere un Vector, partendo da un Insieme di elementi Integer generarati casualmente nel range [0..9]. Stampare il Vector ottenuto dopo aver aggiunto due Integer uguali a 9”. Esercizi su Pile, Code e Liste 18. “Progettare una classe Coda come illustrato nel relativo paragrafo del testo”. 19. “Progettare un programma main che utilizzi uno Stack per ottenere una lista Decrescente da una lista Crescente di Numeri”.
appunti java
pag. 182
20. “Progettare una Classe che ordini in modo Crescente una LinkedList qualsiasi di Double e restituisca la Lista Ordinata.” Vincoli: Si utilizzi l’algoritmo di Fusione descritto di seguito. Primo : se si dispone di due liste ordinate in modo crescente è sempre possibile fonderle per ottenere una lista ordinata. Procedura L3=fondi(L1, L2); L1=[2, 6, 8] L2=[1,6, 7] L3=[ ] L1=[2, 6, 8] L2=[6, 7] L3=[1 ] L1=[6, 8] L2=[6, 7] L3=[1, 2] L1=[8] L2=[6, 7] L3=[1, 2, 6 ] L1=[8] L2=[7] L3=[1, 2, 6, 6 ] L1=[8] L2=[ ] L3=[1, 2, 6, 6, 7 ] L1=[] L2=[ ] L3=[1, 2, 6, 6, 7,8 ] Secondo : Se una lista ha più di un elemento e non è ordinata dividerla in due liste L1,L2 =dimezza(L); Terzo : applica alla lista L il seguente algoritmo ricorsivo che restituisce la lista ordinata LF=MergeSort(L); public static LinkedList MergeSort(LinkedList L) { if (L.size()>1) { LinkedList K[]=dimezza(L); K[0]=MergeSort(K[0]); K[1]=MergeSort(K[1]); L=fondi(K[0],K[1]); } return L; } Richieste : • costruire una classe Fusione che contenga il metodo statico MergeSort() e i metodi statici privati fondi() e dimezza(); • realizzare il main di prova che richiami un metodo statico genera(N) che restituisce una lista casuale di Double e quindi applichi MergeSort(). 21. “Progettare una Classe che ordini in modo Crescente un Vector qualsiasi di Double restituendo il risultato in un Vector.” Vincoli: Si utilizzi l’algoritmo Bubble Sort. 22. “Progettare una main che confronti la velocita dei due ordinamenti precedenti realizzati su List e Vector casuali di grandi dimensioni 5.000 o 10.000 elementi”. 23. “Progettare una Classe che consenta di disporre di un metodo per Valutare un’espressione aritmetica qualsiasi che abbia gli operatori +,-,*,/,^ usando uno Stack”. Indicazioni: L’algoritmo da realizzare è il seguente:
appunti java
pag. 183
si supponga di avere la seguente stringa di caratteri che rapresenta un’espressione aritmetica: 3+4/2-7*2^2 = 3+4/2-7*4 = 3 + 2 – 28 = 23. Si noterà che per VALUTARE l’espressione si devono eseguire le singole operazioni rispettando le priorità degli operatori. L’operatore con massima priorità è la potenza ^ seguono a pari merito * e / e quindi la priorità più bassa riguarda gli operatori + e - . Come realizzare il rispetto delle priorità degli operatori ? Se rispettare la priorità significa rimandare le operazioni a priorità inferiore allora si può utilizzare lo Stak il cui funzionamento simila un rinvio temporaneo. Ecco le operazioni logiche da svolgere con l’uso di due Stak, uno di char e il secondo di numeri. )ESP)ressione 3+4/2-7*2^2 +4/2-7*2^2 4/2-7*2^2
StakNum [ empty ] [3]
StackOp [ empty ] [ empty ]
Ris 0 0
[3]
[+]
0
[+] [/, +] [/, +] [-, +]
0 0 0 0
[-, +] [*, -, +] ] [*, -, +] ] [^, *, -, +] 3 ] [^, *, -, +] ] [*, -, +]
0 0 0 0 0 0
/2-7*2^2 2-7*2^2 -7*2^2 7*2^2
[4, [4, [2, [2,
3 3 4, 3
] ]
*2^2 2^2 ^2 2
[7, [7, [2, [2, [2, [4,
2, 2, 7, 7, 2, 7,
3 3 2, 2, 7, 2,
3] ] ] ] 3 3 2, 3
[28, 2, 3 ] [-26, 3 ] [-23 ] []
[ [ [ [
-, +] +] ] ]
0 0 0 -23
Algoritmo Inizializza Oggetti Fintanto che (ESP Non è vuota) (A) Leggi un operando e mettilo nello SN (B) Leggi un Op.re confrontalo con l’Op.reSO Se (SO vuoto o Op.reSO<=Op.re) impila l’Op.re, altrimenti Fintanto che (Op.reSO > Op.re) estrai l’Op.reSO, estrai Due operandi dallo SN esegui l’operazione e impila il risultato nello SN. Poi impila l’Op.re Letto (A) (B) (A) (B) – ha prior. Inferiore a / quindi esegue e impila (A) (B) (A) (B) (A) (C)ESP è vuota: Fintanto che (SO non à vuoto) preleva Op.reSO, preleva 2 Num da SN, esegui operazione e Impila in SN (2^2)=4 (C) 7*4=28 (C) 2-28=-26 (C) 3-26=-23 (D) SO è vuoto metti in SN in Ris
24. “Generalizzare la classe precedente introducendo nell’espressione aritmetica anche le parentesi tonde che indicano una ulteriore priorità”. Indicazioni: ripetere l’algoritmo precedente con la seguente variante opportunamente collocata; immettere le parentesi aperte sempre in SO, se
appunti java
pag. 184
si in contra una parentesi chiusa eseguire tutte le operazioni impilate fino alla parentesi aperta. Esercizi su Alberi 25. “Costruire un programma che acquisisca da tastiera (o da file di testo usando streamTokenizer) parole in ordine casuale, le inserisca in un Albero e stampi l’albero per verificarne l’ordinamento Lessicografico”. Richiesta: realizzare il tutto anche in un solo main(). 26. “Realizzare un programma come quello dell’esercizio 5) utilizzando un Albero”. 27. “Realizzare un programma come quello dell’esercizio 6) utilizzando un Albero”.