Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


STRUTTURE DATI DINAMICHE (Java), Sintesi del corso di Informatica

- Introduzione: Vettore e array - Linked List Singola - Linked List Doppia - Iteratori - Stack ADT - Queue ADT - Albero - Albero binario

Tipologia: Sintesi del corso

2020/2021

In vendita dal 15/04/2022

Enrico_Galluzzo
Enrico_Galluzzo 🇮🇹

5

(2)

7 documenti

1 / 4

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
STRUTTURE DATI DINAMICHE
INTRODUZIONE (vector, array)
Che cos’è un array? È una collezione in sequenza di variabili dello stesso tipo, ognuna di queste variabili (o
celle) ha un indice, che si riferisce unicamente al valore memorizzato in quella cella e ogni valore
memorizzato si chiama elemento di un array.
La capacità di un array determina il numero massimo di elementi memorizzabili nell’array, di conseguenza
la numerazione degli array avviene sequenzialmente (0, 1, 2, … fino a array.length-1), così possiamo
visualizzare il valore di una cella con indice k con la sintassi array[k]
Inizializzare un array: In Java si usa tradizionalmente l’operatore new e la sintassi risulta
new tipoVariabile[length].
L’operatore new restituisce un rifermento all’array creato;
tipoVariavile rappresenta appunto di che tipo è la variabile (es. String, int, double, );
length è il parametro intero positivo che rappresenta la lunghezza dell’array da creare.
Vettore ADT (Abstract Data Type): Estende la nozione di array memorizzando una sequenza di oggetti
arbitrari; è possibile accederci, inserirci o rimuovere degli elementi specificandone il rango (numero di
elementi che lo precedono). In caso il rango specificato sia errato (es. numero negativo, maggiore della
dimensione massima) viene generata un’eccezione. Operazioni:
elemAtRank(rango): restituisce l’elemento al rango specificato;
replaceAtRank(rango, oggetto): sostituisce l’elemento al rango specificato;
insertAtRank(rango, oggetto): inserisce un elemento al rango specificato;
removeAtRank(rango): rimuove e restituisce l’elemento al rango specificato.
Vettore basato su array: Utilizzo di array a di dimensioni N, con una variabile n che tiene la dimensione del
vettore; l’operazione elemAtRank(rango) richiede tempo O(1) e restituisce a[rango].
Per l’inserimento (insertAtRank(rango, oggetto)) deve essere disponibile lo spazio per spostare in
avanti gli elementi da a[rango] a a[n-1]; nel caso peggiore (ovvero rango=0) l’operazione richiede
tempo O(n).
Per la rimozione (removeAtRank(rango)) si deve coprire la cella vuota lasciata dall’elemento
rimosso, spostando indietro gli elementi da a[rango+1] a a[n-1]; nel caso peggiore (ovvero
rango=0) l’operazione richiede tempo O(n).
Prestazioni: Lo spazio utilizzato è O(n); le operazioni size, isEmpty, elemAtRank, replaceAtRank richiedono
tempo O(1) mentre le operazioni insertAtRank e removeAtRank richiedono tempo O(n) a meno che l’array
non sia utilizzato in modo circolare, allora richiedono tempo O(1); nel caso in cui l’array fosse pieno è
possibile sostituirlo con uno più grande invece di generare un’eccezione, questo si fa con due strategie:
incrementale, aumenta le dimensioni di una costante c; raddoppio, raddoppia le dimensioni dell’array.
Applicazioni: Può servire come collezione ordinaria di oggetti, struttura dati ausiliaria per algoritmi o
componenti di altre strutture dati.
pf3
pf4

Anteprima parziale del testo

Scarica STRUTTURE DATI DINAMICHE (Java) e più Sintesi del corso in PDF di Informatica solo su Docsity!

STRUTTURE DATI DINAMICHE

INTRODUZIONE (vector, array)

Che cos’è un array? È una collezione in sequenza di variabili dello stesso tipo, ognuna di queste variabili (o celle) ha un indice, che si riferisce unicamente al valore memorizzato in quella cella e ogni valore memorizzato si chiama elemento di un array. La capacità di un array determina il numero massimo di elementi memorizzabili nell’array, di conseguenza la numerazione degli array avviene sequenzialmente (0, 1, 2, … fino a array.length- 1 ), così possiamo visualizzare il valore di una cella con indice k con la sintassi “ array[k]Inizializzare un array: In Java si usa tradizionalmente l’operatore new e la sintassi risulta new tipoVariabile[length].

  • L’operatore new restituisce un rifermento all’array creato;
  • tipoVariavile rappresenta appunto di che tipo è la variabile (es. String , int , double , );
  • length è il parametro intero positivo che rappresenta la lunghezza dell’array da creare. Vettore ADT (Abstract Data Type): Estende la nozione di array memorizzando una sequenza di oggetti arbitrari; è possibile accederci, inserirci o rimuovere degli elementi specificandone il rango (numero di elementi che lo precedono). In caso il rango specificato sia errato (es. numero negativo, maggiore della dimensione massima) viene generata un’eccezione. Operazioni:
  • elemAtRank(rango) : restituisce l’elemento al rango specificato;
  • replaceAtRank(rango, oggetto) : sostituisce l’elemento al rango specificato;
  • insertAtRank(rango, oggetto) : inserisce un elemento al rango specificato;
  • removeAtRank(rango) : rimuove e restituisce l’elemento al rango specificato. Vettore basato su array: Utilizzo di array a di dimensioni N , con una variabile n che tiene la dimensione del vettore; l’operazione elemAtRank(rango) richiede tempo O(1) e restituisce a[rango].
  • Per l’ inserimento ( insertAtRank(rango, oggetto) ) deve essere disponibile lo spazio per spostare in avanti gli elementi da a[rango] a a[n-1] ; nel caso peggiore (ovvero rango=0 ) l’operazione richiede tempo O(n).
  • Per la rimozione ( removeAtRank(rango) ) si deve coprire la cella vuota lasciata dall’elemento rimosso, spostando indietro gli elementi da a[rango+1] a a[n- 1 ] ; nel caso peggiore (ovvero rango=0 ) l’operazione richiede tempo O(n). Prestazioni: Lo spazio utilizzato è O(n) ; le operazioni size , isEmpty , elemAtRank , replaceAtRank richiedono tempo O(1) mentre le operazioni insertAtRank e removeAtRank richiedono tempo O(n) a meno che l’array non sia utilizzato in modo circolare, allora richiedono tempo O(1) ; nel caso in cui l’array fosse pieno è possibile sostituirlo con uno più grande invece di generare un’eccezione, questo si fa con due strategie: incrementale , aumenta le dimensioni di una costante c ; raddoppio , raddoppia le dimensioni dell’array. Applicazioni: Può servire come collezione ordinaria di oggetti, struttura dati ausiliaria per algoritmi o componenti di altre strutture dati.

LINKED LIST SINGOLA

Che cos’è una linked list singola? È una struttura dati astratta formata da una sequenza di nodi che inizia con un puntatore head e ciascuno di questi nodi memorizza l’elemento e il puntatore del prossimo nodo. Inserimento in testa: Alloca un nuovo nodo ; inserisce un nuovo elemento; essendo che il nuovo nodo punta alla vecchia head , aggiorna la head per puntare al nuovo nodo. Inserimento in coda: Alloca un nuovo nodo ; inserisce un nuovo elemento; nuovo nodo che punta a null ; essendo che il nodo precedente punta al nuovo nodo viene aggiornata la tail per puntare a un nuovo nodo. Rimozione in testa: Aggiorna la head per puntare al nodo successivo nella lista; consente al garbage collector di deallocare il precedente nodo head. Rimozione in coda: Non è efficiente e non esiste un modo a tempo costante per aggiornare la tail affinché punti al nodo precedente.

LINKED LIST DOPPIA

A differenza della linked list singola può essere attraversata sia in avanti che all’indietro, qui ciascun nodo memorizza l’elemento, il puntatore al nodo precedente e il puntatore al nodo prossimo ; i nodi speciali sono due: header e trailer. Inserimento: Inserisce un nuovo nodo tra un nodo p ed il suo successore. Rimozione: Rimuove un nodo p dalla lista.

ITERATORI

Che cos’è un iteratore? È un modello di progettazione software che rappresenta la scansione di una sequenza di elementi, eseguito uno alla volta. Java definisce un’interfaccia parametrizzata, Iterable , con l’unico metodo Iterator() che restituisce un iteratore con gli elementi presenti nella collazione. Ciascuna chiamata ad iterator() restituisce una nuova istanza Iterator , consentendo più attraversamenti simultanei.

STACK ADT

È una struttura dati che contiene una sequenza di oggetti arbitrari; per l’inserimento e per l’eliminazione viene seguita una logica LIFO (Last-In First-Out). Operazioni:

  • push(oggetto) : inserisce un elemento;
  • pop() : rimuove e restituisce l’ultimo elemento inserito;
  • top() : restituisce l’ultimo elemento inserito;
  • size() : restituisce il numero di elementi memorizzati;
  • isEmpty() : indica se non sono stati memorizzati elementi nella struttura dati. A volte eseguire un’operazione di un ADT può causare una condizione di errore, e per questo esiste l’ eccezione ; un’eccezione viene generata ( thrown ) da un’operazione che non può essere portata a termine correttamente; un altro metodo per ovviare a questo problema è eliminare le eccezioni, quindi anche se lo stack è vuoto, le operazioni possono comunque essere svolte solo che restituiranno null. Stack basato su array: Vengono inseriti elementi da sinistra a destra e la variabile tiene traccia dell’indice dell’elemento in testa. L’ array che memorizza lo stack può però riempirsi, quindi con l’operazione push() verrà generata un’eccezione. Prestazioni: Lo spazio utilizzato dalla struttura dati è O(n) ; e il tempo necessario per ogni operazione è O(1). Limitazioni: La dimensione dello stack è definita a priori e non si può cambiare. Applicazioni: Cronologia delle pagine visitate in un browser Web , sequenza di annulla in un editor, struttura dati ausiliaria per algoritmi, componente di altre strutture dati.

ALBERO BINARIO

È un albero con la caratteristica che ciascun nodo interno può avere al massimo due figli, e i figli di un nodo sono una coppia ordinata e vengono chiamati figlio sinistro e figlio destro. Definizione: un albero è costituito da un solo nodo, o da un albero la cui radice ha una coppia ordinata di figli che sono a loro volta alberi binari. Applicazioni: Espressioni aritmetiche, processi di decisione, ricerca. Alberi di decisione: L’albero binario è spesso associato a problemi decisionali, dove i nodi interni sono le domande (con risposta si/no) e i nodi esterni sono le decisioni. L’albero binario ADT estendo l’albero ADT ereditandone quindi tutti i metodi, ma se ne aggiungono altri come left(p) , right(p) e sibling(p) , tali metodi restituiscono null se rispettivamente manca il nodo sinistro, destro o di siblling (fratello) di p. Attraversamento in inordine: un nodo viene visitato dopo il suo sottoalbero sinistro e prima del suo sottoalbero destro. Albero binario basato su linked list: un nodo è reso da un oggetto che memorizza elemento, nodo parente, nodo figlio sinistro e nodo figlio destro; gli oggetti nodo implementano la posizione ADT.