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: Array, Liste, Pile, Code e Alberi, Appunti di Algoritmi E Strutture Di Dati

Una panoramica completa delle strutture dati, esplorando concetti chiave come array, liste, pile, code e alberi. Le caratteristiche, i vantaggi e gli svantaggi di ciascuna struttura dati, fornendo esempi pratici e algoritmi di visita per alberi. Un'ottima risorsa per studenti universitari e chiunque desideri approfondire la comprensione delle strutture dati.

Tipologia: Appunti

2023/2024

Caricato il 01/11/2024

vittorio-ingrassia-1
vittorio-ingrassia-1 🇮🇹

5 documenti

1 / 13

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Il tipo di dato specifica COSA un'operazione deve fare ma non
COME
(perché il tipo di dati può essere implementato in modo diverso e a seconda di come lo
implemento le operazioni che faccio possono essere implementate in modo diverso)
sono libero di implementare il tipo e le operazioni come più mi conviene
Un esempio di tipo di dato è l’INSIEME DINAMICO che rappresenta una
collezione di elementi le cui dimensioni possono variare nel tempo. Lo posso
implementare in modo diverso (array/lista) dipendenti da esigenze progettuali.
Le operazioni tipiche su un insieme dinamico sono:
CANCELLAZIONE
INSERIMENTO
RICERCA (verifica dell'appartenenza di un elemento all'insieme).
Un insieme dinamico che supporta queste operazioni è detto DIZIONARIO.
Il dizionario contiene coppie di elementi :
L’INFORMAZIONE (il nostro dato). La
CHIAVE (di ricerca) che mi permette di rintracciare quell’elemento.
I tempi di esecuzione delle operazioni sul dizionario dipendono da come gli
elementi sono stati memorizzati e da come le operazioni sono state implementate.
NB. Questa in figura in JAVA è chiamata INTERFACCIA (Astrazione comportamentale).
Ci dice quali comportamenti deve avere la classe che sto implementando.
In base a come organizzo i miei dati le operazioni vengono implementate in
modo diverso e avranno dei costi diversi.
pf3
pf4
pf5
pf8
pf9
pfa
pfd

Anteprima parziale del testo

Scarica Strutture Dati: Array, Liste, Pile, Code e Alberi e più Appunti in PDF di Algoritmi E Strutture Di Dati solo su Docsity!

Il tipo di dato specifica COSA un'operazione deve fare ma non

COME

(perché il tipo di dati può essere implementato in modo diverso e a seconda di come lo implemento le operazioni che faccio possono essere implementate in modo diverso)  sono libero di implementare il tipo e le operazioni come più mi conviene

Un esempio di tipo di dato è l’ INSIEME DINAMICO che rappresenta una

collezione di elementi le cui dimensioni possono variare nel tempo. Lo posso implementare in modo diverso (array/lista) dipendenti da esigenze progettuali. Le operazioni tipiche su un insieme dinamico sono:

CANCELLAZIONE

INSERIMENTO

RICERCA (verifica dell'appartenenza di un elemento all'insieme).

Un insieme dinamico che supporta queste operazioni è detto DIZIONARIO.

Il dizionario contiene coppie di elementi : L’ INFORMAZIONE (il nostro dato). La CHIAVE (di ricerca) che mi permette di rintracciare quell’elemento. I tempi di esecuzione delle operazioni sul dizionario dipendono da come gli elementi sono stati memorizzati e da come le operazioni sono state implementate. NB. Questa in figura in JAVA è chiamata INTERFACCIA (Astrazione comportamentale). Ci dice quali comportamenti deve avere la classe che sto implementando. In base a come organizzo i miei dati le operazioni vengono implementate in modo diverso e avranno dei costi diversi.

I nostri dati vengono memorizzati attraverso TECNICHE DI MEMORIZZAZIONE che si dividono in: 1.TECNICHE INDICIZZATE:

memorizzano i dati attraverso gli ARRAY.

ARRAY  Struttura indicizzata costituita da una collezione di celle numerate

per memorizzare uno stesso tipo di dato (omogeneità). Gli indici delle celle di un array sono numeri consecutivi tra 1 ed N oppure tra 0 e N-1, dove N è la dimensione dell'array. L 'accesso ad ogni cella in lettura o scrittura avviene in tempo costante.

PRO : L’array è ad accesso DIRETTO (basta conoscere l’indice dell’elemento

per accedere in tempo costante).

CONTRO : Dimensione FISSA (la riallocazione dell’array richiede tempo) e

sovradimensionare un array non è conveniente. L’array inoltre memorizza solo dati omogenei. 2.TECNICHE COLLEGATE:

usano RECORD e PUNTATORI.

RECORD

 Contengono i dati della collezione

 Sono numerati normalmente attraverso i loro indirizzi di memoria

 Vengono creati e distrutti individualmente ed in modo dinamico

 Gli indirizzi non sono consecutivi in memoria (non è possibile usare aritmetica

dei puntatori)

 Ogni record contiene anche uno o più indirizzi di record con cui è in

relazione

PUNTATORI

Permettono di rappresentare i collegamenti tra i record.

PRO : Dimensione VARIABILE che comporta un utilizzo più efficiente della

memoria

CONTRO : Accesso SEQUENZIALE (tengo in memoria un puntatore che mi

fa da accesso alla mia struttura dati per poi scorrere all’interno). È necessario memorizzare il punto di accesso alla struttura collegata: il record dal quale è possibile accedere a tutti gli altri record

LISTE, PILE, CODE

Sono particolari STRUTTURE DATI con una ben definita strategia di inserimento e cancellazione degli elementi. In particolare le strategie usate sono:

LIFO : last -in first-out; (cancelliamo l’ultimo

elemento inserito) Una struttura dati che usa la strategia LIFO è detta PILA ACCESSO  TOP INSERIMENTO PUSH CANCELLAZIONE  POP

FIFO : first -in first-out; (cancelliamo il primo

elemento inserito) Una struttura dati che usa la strategia FIFO è detta CODA ACCESSO  FIRST INSERIMENTO ENQUEUE CANCELLAZIONE  DEQUEUE Possono essere implementate sia usando rappresentazioni indicizzate (gestendo opportunamente gli indici) sia usando rappresentazioni collegate (gestendo opportunamente i puntatori)

Ricapitoliamo…

L' ALBERO è un'organizzazione gerarchica dei dati

  • I dati sono contenuti nei nodi
  • Le relazioni gerarchiche sono rappresentate dagli archi Un albero è una coppia T = (N, A) costituita da un insieme di nodi N ed un insieme di archi A, con A ⊆ N×N Ogni nodo v , tranne il nodo radice, ha un solo genitore u tale che (u, v) ∈ A Un nodo può avere:
  • più figli (il numero di figli è il grado del nodo),
  • nessun figlio , il nodo è detto foglia
  • nessun padre , il nodo è detto radice Nb. I nodi che non sono né radice ne sono foglia sono detti nodi interni
  • Antenati di un nodo v sono i nodi che possono essere raggiunti da v salendo di padre in padre
  • Discendenti di un nodo v sono i nodi che possono esser raggiunti da v scendendo di padre in figlio Si chiama profondità (o livello ) di un nodo il numero di archi da attraversare per raggiungere il nodo a partire dalla radice dell’albero
  • La radice ha profondità 0
  • Se un nodo ha profondità k , I suoi figli hanno profondità k+
  • Nodi con lo stesso genitore son detti Fratelli
  • L’altezza di un albero è la massima profondità a cui si trova una delle sue foglie

VETTORE POSIZIONALE (Rappresentazione utile per alberi d-ari )

Sia T(N,A) un albero d-ario con n nodi numerate da 0 ad n-1, un vettore posizionale P è un array di dimensione n tale che P[v] contiene l’informazione relativa al nodo v. L’informazione dell’i-esimo figlio di v sarà in posizione P[d*v

  • i] con i compreso tra 1 e d. Ogni nodo ha una posizione prestabilita nell’array che dipende dalla posizione del nodo nell’albero

2. HANNO COSTO O(n) (dove n = numero dei nodi)

3. L’ACCESSO AI NODI AVVIENE ATTRAVERSO

INDICI.QUESTI ARRAY SONO SEMPLICI DA

REALIZZARE MA L’INSERIMENTO E LA

CANCELLAZIONE RISULTANO COMPLICATI.

RAPPRESENTAZIONI COLLEGATE PER ALBERI

1. Le rappresentazioni collegate permettono anche la gestione di ALBERI

DINAMICI , ovvero alberi la cui struttura cambia nel tempo

2. Danno maggiore LIBERTÀ nella rappresentazione della struttura dell’albero

ma rendono più difficoltoso l’ACCESSO alle informazioni

3. Si basano sull’idea di rappresentare ogni nodo attraverso un RECORD che

memorizzi il dato e PUNTATORI utili a rappresentare le informazioni degli archi PUNTATORI AI FIGLI

  • Ogni nodo ha un numero limitato di

figli (d)

  • Ogni nodo mantiene un puntatore ad

ogni figlio. Se un figlio è assente si

pone il puntatore a null

  • Spazio: O(n*d) NB. per d costante è

O(n)

LISTE DI PUNTATORI AI FIGLI

  • Ogni nodo ha un numero arbitrario di figli.
  • Ogni nodo ha associate una lista di puntatori a figli. La lista può essere

Per scorrere i nodi dell’albero userò un algoritmo di visita.

ALGORITMI DI VISITA DI ALBERI Sono algoritmi che consentono l’accesso sistematico ai nodi e agli archi di un albero e si distinguono in base al particolare ordine di visita dei nodi Si attraversano tutti gli archi a partire da quelli del nodo radice. Nel visitare i nodi dell’albero i nodi vengono visitati una e una sola volta.

VISITA  insieme di operazioni che dobbiamo effettuare sui dati che

sono memorizzati all’interno del nostro nodo

ALGORITMO DI VISITA GENERICA (molto astratto)

  • L’algoritmo visitaGenerica visita il nodo r e tutti i suoi discendenti in un albero
  • Richiede tempo O(n) per visitare un albero con n nodi a partire dalla Radice ***
  • L’algoritmo mantiene un insieme S dei nodi esplosi di cui non si è ancora visitati tutti i figli. Tali nodi sono punti di ramificazione NODO APERTO : è stato visitato il nodo ma non i figli (o non tutti almeno)

NODO CHIUSO : sono stati visitati sia il nodo che tutti i suoi figli ***L’algoritmo di visita generica applicato alla radice di un albero con n nodi termina in O(n) passi. Lo spazio usato è O(n) Dimostrazione

  • Operazioni di inserimento e cancellazione di elementi in S hanno costo O(1)
  • Non vi è modo di processare uno stesso nodo più di una volta
  • Ogni iterazione, apriamo e chiudiamo un nodo
  • Al più abbiamo n iterazioni  tempo O(n)
  • Ogni nodo compare una volta sola in S  spazio O(n) ALGORITMO DI VISITA IN PROFONDITA L’algoritmo di visita in profondità (DFS, depth-first search)
    1. Parte da r e visita i nodi di figlio in figlio fino a raggiungere una foglia.
    2. Retrocede al primo antenato che ha ancora figli non visitati (se esiste)
    3. ripete il procedimento a partire da uno di quei figli. Esso si implementa usando una PILA (LIFO) Si può implementare anche la versione RICORSIVA. Iterativa  esplicita la pila

ALGORITMO DI VISITA IN AMPIEZZA L’algoritmo di visita in ampiezza (BFS, breadth-first search):

  1. parte da r e visita nodi su uno stesso livello.
  2. Un nodo sul livello i può essere visitato solo dopo che tutti i nodi sul livello i-1 sono stati visitati.
  3. Si implementa usando una CODA(FIFO)