Strutture dati: domande di esercitazione con spiegazioni

Domande a risposta multipla gratuite su Strutture dati, con suggerimenti e spiegazioni, su tre livelli: termini e fatti chiave, applicare i concetti, casi e analisi.

Esercizio gratuitoFacile

Che cos'è la proprietà di max-heap?

Esercizio successivo →
Esercitati su Strutture dati gratisEsercitati su Strutture dati ora5 esercizi gratuiti ogni giorno. Nessuna carta richiesta.

Su cosa ti eserciti

  1. Faciletermini e fatti chiave
  2. Mediaapplicare i concetti
  3. Difficilecasi e analisi

Impara Strutture dati da zero

Prima di questo: Algoritmi e complessità

1Che cos’è una struttura dati

Una struttura dati è un modo di organizzare i dati in memoria in modo che certe operazioni siano veloci: trovare un elemento, aggiungerne uno, rimuoverne uno.

Nessuna struttura è veloce in tutto. Sceglierne una significa scegliere quali operazioni devono costare poco. I loro costi si scrivono in notazione O grande, con n il numero di elementi.

I due mattoni fondamentali sono l’array e la lista concatenata.

a7[0]3[1]9[2]4[3]7394∅h

Un array memorizza i suoi elementi in un unico blocco di memoria, uno dopo l’altro. Il computer può calcolare dove si trova l’elemento i, quindi leggere a[i] richiede O(1). Inserire all’inizio significa spostare ogni elemento: O(n).

Una lista concatenata memorizza ogni elemento in un nodo con un puntatore al nodo successivo. L’ultimo puntatore è null. Inserire in testa (h) cambia un solo puntatore: O(1). Ma per raggiungere l’elemento i bisogna seguire i puntatori: O(n).

Una lista doppiamente concatenata ha anche un puntatore al nodo precedente, quindi si può scorrere in entrambe le direzioni.

Autoverifica Quale operazione è O(1) per un array ma O(n) per una lista semplicemente concatenata?
  1. Contare gli elementi uno per uno
  2. Inserire un nuovo elemento all’inizio
  3. Leggere l’elemento all’indice i
  4. Visitare ogni elemento una volta

Risposta: Leggere l’elemento all’indice i. Un array calcola direttamente l’indirizzo dell’elemento i. Una lista concatenata deve seguire i puntatori a partire dalla testa. Inserire all’inizio è il caso opposto: economico per una lista, costoso per un array.

2Pile e code

Una pila (stack) è come una pila di piatti: si aggiunge e si toglie solo in cima. L’ultimo elemento entrato è il primo a uscire: LIFO.

  • push mette un elemento in cima, pop rimuove l’elemento in cima, peek legge l’elemento in cima senza rimuoverlo. Tutte sono O(1).
  • Usi: la funzione annulla di un editor, lo stack delle chiamate di un programma, il controllo del bilanciamento delle parentesi, la ricerca in profondità.

Una coda (queue) è come la fila a una cassa: ci si mette in fondo e si esce dalla testa. Il primo elemento entrato è il primo a uscire: FIFO.

  • enqueue aggiunge in fondo, dequeue rimuove dalla testa. Entrambe sono O(1).
  • Usi: lavori di stampa, messaggi in attesa di essere gestiti, ricerca in ampiezza.

Una deque (coda a doppia estremità) permette di aggiungere e rimuovere a entrambe le estremità. Una coda con priorità rimuove sempre per primo l’elemento con la priorità più alta; di solito è costruita come heap.

Autoverifica Quale struttura dati si adatta meglio al pulsante “annulla” di un editor di testo?
  1. Un grafo
  2. Una coda
  3. Una pila
  4. Una tabella hash

Risposta: Una pila. L’annullamento deve invertire per prima l’azione più recente: ultimo entrato, primo uscito. Una coda annullerebbe per prima l’azione più vecchia.

3Alberi, heap, tabelle hash e grafi

Un albero ha un nodo in alto, la radice. Ogni altro nodo ha esattamente un genitore. I nodi senza figli sono foglie. Un albero con n nodi ha n − 1 archi.

In un albero binario ogni nodo ha al massimo due figli. Un albero binario di ricerca (BST) aggiunge una regola: le chiavi nel sottoalbero sinistro sono minori del nodo, quelle nel sottoalbero destro sono maggiori.

Cercare in un BST segue un solo percorso verso il basso, quindi costa O(altezza). Un albero bilanciato (AVL, rosso-nero) mantiene l’altezza vicina a log₂ n. Chiavi inserite in ordine crescente formano una catena di altezza n.

Un heap è un albero binario in cui ogni genitore è minore dei suoi figli (min-heap) o maggiore (max-heap). Il minimo o il massimo è nella radice, e inserimento e rimozione costano O(log n).

Una tabella hash memorizza coppie chiave–valore. Una funzione hash trasforma la chiave in un indice, quindi inserimento e ricerca richiedono O(1) in media. Due chiavi con lo stesso indice sono una collisione, risolta con il concatenamento (una lista per ogni posizione) o con l’indirizzamento aperto (si prova un’altra posizione).

Un grafo ha vertici collegati da archi, che possono avere una direzione o un peso. Si memorizza come matrice di adiacenza, memoria O(V²), o come liste di adiacenza, O(V + E).

Autoverifica Le chiavi 50, 30, 70, 20 e 40 vengono inserite in quest’ordine in un albero binario di ricerca vuoto. Qual è il figlio sinistro di 30?
  1. 20
  2. 40
  3. 70
  4. Non ha figlio sinistro

Risposta: 20. 20 è minore di 50, quindi va a sinistra fino a 30. È minore anche di 30, quindi va ancora a sinistra. 40 è maggiore di 30 e diventa il suo figlio destro.

4Il metodo passo dopo passo

Le domande spesso descrivono un compito e chiedono quale struttura si adatta, oppure chiedono come appare una struttura dopo alcune operazioni.

  1. Trova l’operazione che deve essere veloce: accesso per posizione, per chiave, l’elemento più recente, quello più vecchio, il più piccolo, o un intervallo.
  2. Abbinala a una struttura: indice → array, chiave → tabella hash, più recente → pila, più vecchio → coda, più piccolo o più grande → heap, ordine o intervalli → albero di ricerca bilanciato.
  3. Controlla il costo, in notazione O grande, delle altre operazioni di cui il compito ha bisogno.
  4. Per una domanda di simulazione, esegui le operazioni una alla volta e annota lo stato dopo ciascuna.
  5. Verifica lo stato finale rispetto alla regola della struttura: LIFO, FIFO, l’ordine del BST o l’ordine dell’heap.

5Un esempio svolto

Segui ogni passaggio. Prova a prevedere il successivo prima di aprirlo.

Esempio svolto

Le chiavi 50, 30, 70, 20, 40 e 60 vengono inserite in quest’ordine in un albero binario di ricerca vuoto. Qual è la visita in ordine simmetrico e quanti confronti servono per cercare 60?

1

Inserisci la radice

La prima chiave, 50, diventa la radice.

2

Inserisci 30 e 70

30 è minore di 50, quindi va a sinistra. 70 è maggiore di 50, quindi va a destra.

503070
3

Inserisci 20, 40 e 60

20: minore di 50, minore di 30, quindi a sinistra di 30. 40: minore di 50, maggiore di 30, quindi a destra di 30. 60: maggiore di 50, minore di 70, quindi a sinistra di 70.

503070204060
4

Visita in ordine simmetrico

Una visita in ordine simmetrico (in-order) visita il sottoalbero sinistro, poi il nodo, poi il sottoalbero destro.

Si ottiene 20, 30, 40, 50, 60, 70: le chiavi in ordine crescente, come accade sempre in un BST.

5

Cerca 60

Confronta con 50: maggiore, vai a destra. Confronta con 70: minore, vai a sinistra. Confronta con 60: trovato.

503070204060

La ricerca richiede 3 confronti, uno per livello.

Risposta

In ordine simmetrico: 20, 30, 40, 50, 60, 70. La ricerca di 60 richiede 3 confronti.

6Errori comuni

  • Confondere LIFO e FIFO. Una pila restituisce l’elemento più recente, una coda il più vecchio.
  • Pensare che una lista concatenata dia accesso rapido per indice. Deve scorrere dalla testa.
  • Supporre che un BST sia sempre O(log n). Lo è solo un albero bilanciato; inserimenti ordinati danno O(n).
  • Dimenticare le collisioni in una tabella hash. O(1) è il caso medio, non il caso peggiore.
  • Confondere le visite. Preorder: prima il nodo. In-order: il nodo nel mezzo. Postorder: il nodo per ultimo.
  • Usare una matrice di adiacenza per un grafo grande e sparso. Spreca memoria O(V²).
Autoverifica Inserisci 1, 2 e 3 in una coda vuota, in quest’ordine. Quale elemento restituisce il primo dequeue?
  1. 1, 2 e 3 insieme
  2. 1
  3. 2
  4. 3

Risposta: 1. Una coda è first in, first out, quindi 1 esce per primo. 3 sarebbe la risposta per una pila (pop), che restituisce l’elemento più recente.

7Come sono fatte le domande d’esame

  • Facile: termini e fatti chiave. LIFO e FIFO, che cos’è un nodo, una radice o una foglia, la regola del BST, che cosa fa una funzione hash.
  • Medio: applicare i concetti. Quale struttura si adatta a un compito, il risultato di push e pop o di inserimenti in un BST, visite di alberi, una tabella hash con sondaggio lineare, costi in notazione O grande.
  • Difficile: casi e analisi. Alberi bilanciati, heap negli array, B-tree, trie, union-find, filtri di Bloom e progetti come una cache LRU.

Per un heap memorizzato in un array a partire dall’indice 0, i figli dell’indice i si trovano in 2i + 1 e 2i + 2, e il suo genitore in ⌊(i − 1) / 2⌋.

Impara passo dopo passo nell’appImpara passo dopo passo nell’app

Domande di esempio

Esempio 1Facile

Qual è la differenza principale tra un array statico e un array dinamico?

  1. AUn array statico permette un accesso per indice più lento
  2. BUn array dinamico può crescere spostandosi in un blocco di memoria più grande
  3. CUn array dinamico memorizza gli elementi in nodi collegati così può crescere un elemento alla volta
  4. DUn array statico può memorizzare solo numeri
Mostra i suggerimenti
  1. Le liste di Python e gli ArrayList di Java sono esempi di uno dei due.
  2. Ora due risposte sbagliate sono barrate. Una delle due rimaste è giusta.
Mostra la risposta e la spiegazione

Perché è questa la risposta

Un array statico ha dimensione fissa; un array dinamico, quando è pieno, alloca un array più grande e vi copia gli elementi.

Risposta

B · Un array dinamico può crescere spostandosi in un blocco di memoria più grande
Esempio 2Media

Come funziona extract-min in un min-heap binario?

  1. ASi rimuove l'ultimo elemento dell'array
  2. BSi sposta l'ultimo elemento nella radice e lo si fa scendere
  3. CSi rimuove la radice e si spostano tutti gli elementi di una posizione a sinistra
  4. DSi cercano in tutte le foglie il nuovo minimo
Mostra i suggerimenti
  1. Mantieni l'albero completo, poi sistema l'ordine.
  2. Ora due risposte sbagliate sono barrate. Una delle due rimaste è giusta.
Mostra la risposta e la spiegazione

Perché è questa la risposta

L'ultimo elemento riempie il vuoto nella radice e viene scambiato con il figlio minore finché la proprietà di heap non è soddisfatta, in O(log n).

Risposta

B · Si sposta l'ultimo elemento nella radice e lo si fa scendere
Esempio 3Difficile

Senza unione per rango né compressione dei cammini, qual è il costo nel caso peggiore di una singola find in una struttura union-find con n elementi?

  1. AO(1)
  2. BO(α(n))
  3. CO(log n)
  4. DO(n)
Mostra i suggerimenti
  1. Gli alberi possono degenerare.
  2. Ora due risposte sbagliate sono barrate. Una delle due rimaste è giusta.
Mostra la risposta e la spiegazione

Perché è questa la risposta

Le unioni ingenue possono collegare gli alberi in una lunga catena, quindi find può dover seguire n − 1 puntatori al genitore; le due euristiche la rendono quasi costante.

Risposta

D · O(n)

Domande e risposte

Strutture dati: di cosa si tratta?

Una struttura dati è un modo di organizzare i dati in memoria in modo che certe operazioni siano veloci: trovare un elemento, aggiungerne uno, rimuoverne uno.

Nessuna struttura è veloce in tutto. Sceglierne una significa scegliere quali operazioni devono costare poco. I loro costi si scrivono in notazione O grande, con n il numero di elementi.

Strutture dati: come si impara passo per passo?
  1. Che cos’è una struttura dati
  2. Pile e code
  3. Alberi, heap, tabelle hash e grafi
  4. Il metodo passo dopo passo
  5. Un esempio svolto
  6. Errori comuni
  7. Come sono fatte le domande d’esame
Strutture dati: che cosa si esercita?
  • Facile: termini e fatti chiave
  • Media: applicare i concetti
  • Difficile: casi e analisi

Ogni domanda ha quattro opzioni e solo una è corretta. Bloccato? Apri prima un piccolo suggerimento e la spiegazione completa solo quando ti serve.

Come funziona l’esercitazione

  • Ogni domanda ha quattro opzioni e solo una è corretta.
  • Bloccato? Apri prima un piccolo suggerimento e la spiegazione completa solo quando ti serve.
  • I tuoi progressi, i tuoi errori e gli esercizi salvati restano memorizzati, così puoi ripassare prima dell’esame.

Argomenti prima e dopo questo

Da studiare prima

Corsi con questo argomento

Altri argomenti di Informatica

Scheda di esercizi stampabile

Esercitati su Strutture dati gratisEsercitati su Strutture dati ora5 esercizi gratuiti ogni giorno. Nessuna carta richiesta.