Algoritmi e strutture dati: pacchetto last-minute

Formulari, i passaggi chiave del metodo per ogni argomento e 6 esercizi, con le soluzioni complete in fondo.

Nuovi eserciziTorna al corso

Nella finestra di stampa scegli “Salva come PDF” per conservarne una copia sul tuo dispositivo.

1Formule e metodi

Teoria dei grafi

Lemma delle strette di mano
Σ deg(v) = 2|E|
Grafi completi
|E(Kn)| = n(n − 1)/2, |E(Km,n)| = m·n
Grafo regolare
|E| = n·k/2
Albero e foresta
|E| = n − 1, |E| = n − c
Foglie di un albero
L = 2 + Σ (deg(v) − 2) over deg(v) ≥ 3
Eulero
circuito: tutti i gradi pari; cammino: esattamente 2 gradi dispari
Cicli hamiltoniani in Kn
(n − 1)!/2
Aggiornamento di Dijkstra
d(v) = min(d(v), d(u) + w(u, v))
Cammini di lunghezza L
(Mᴸ)ij

Metodo

  1. Scrivi il grado di ogni vertice; la somma dei gradi è il doppio del numero di lati.
  2. Nelle domande su Eulero, verifica che il grafo sia connesso e conta i vertici di grado dispari.
  3. Per gli alberi, usa n − 1 lati e il lemma delle strette di mano.
  4. Per Dijkstra, tieni una tabella delle distanze provvisorie e a ogni passo fissa il vertice non ancora fissato con la distanza minima.
  5. Per un albero di copertura minimo, ordina i lati per peso e salta ogni lato che chiude un ciclo (Kruskal), oppure fai crescere un solo albero a partire da un vertice iniziale (Prim).

2Esercizi

1.Algoritmi e complessitàMedia

La programmazione dinamica è utile quando un problema presenta:

  1. AUn unico ciclo
  2. BSottoproblemi sovrapposti e sottostruttura ottima
  3. CSolo input casuali
  4. DNessun sottoproblema, quindi si risolve in un solo passo
2.Algoritmi e complessitàDifficile

Per dimostrare che un nuovo problema X è NP-difficile, che cosa devi fare?

  1. ARidurre in tempo polinomiale un problema NP-difficile noto a X
  2. BDimostrare che X si può verificare in tempo polinomiale
  3. CRidurre in tempo polinomiale X a un problema NP-difficile noto
  4. DDimostrare che X non ha un algoritmo polinomiale per input piccoli
3.Strutture datiMedia

Una coda è implementata con due pile: push su una pila «in» e pop da una pila «out», che viene riempita da «in» quando è vuota. Qual è il costo ammortizzato per operazione?

  1. AO(n²)
  2. BO(n)
  3. CO(log n)
  4. DO(1)
4.Strutture datiDifficile

Qual è il tempo di esecuzione della visita in ampiezza (BFS) su un grafo con V vertici memorizzato come matrice di adiacenza?

  1. AO(E log V)
  2. BO(V)
  3. CO(V + E)
  4. DO(V²)
5.Teoria dei grafiMedia

Un albero ha 2 vertici di grado 4, 3 vertici di grado 5, e tutti gli altri suoi vertici sono foglie (grado 1). Quante foglie L ha?

2 × deg 43 × deg 5
L =
6.Teoria dei grafiDifficile
612131368210ABCDEF

Usa l’algoritmo di Dijkstra per trovare la lunghezza d(D) del cammino minimo da A a D nel grafo pesato.

partenza: Aarrivo: D
d(D) =

3Soluzioni

1.Algoritmi e complessità

Risposta: B · Sottoproblemi sovrapposti e sottostruttura ottima

Perché è questa la risposta

Memorizzare i risultati dei sottoproblemi sovrapposti (memoizzazione o tabulazione) evita lavoro ripetuto, trasformando algoritmi esponenziali in polinomiali.

Risposta

B · Sottoproblemi sovrapposti e sottostruttura ottima
2.Algoritmi e complessità

Risposta: A · Ridurre in tempo polinomiale un problema NP-difficile noto a X

Perché è questa la risposta

Se un problema difficile noto può essere trasformato efficientemente in X, un algoritmo veloce per X risolverebbe anche il problema noto.

Risposta

A · Ridurre in tempo polinomiale un problema NP-difficile noto a X
3.Strutture dati

Risposta: D · O(1)

Perché è questa la risposta

Ogni elemento subisce in totale al massimo due push e due pop, quindi anche se un singolo riempimento può costare O(n), la media su una sequenza è O(1).

Risposta

D · O(1)
4.Strutture dati

Risposta: D · O(V²)

Perché è questa la risposta

Ognuno dei V vertici scorre una riga di V elementi, per un totale di O(V²); con le liste di adiacenza la BFS è O(V + E).

Risposta

D · O(V²)
5.Teoria dei grafi

Risposta: L = 15

Eulero, Hamilton e alberi: un grafo connesso ha un circuito euleriano (ogni lato una volta, di nuovo al punto di partenza) quando ogni vertice ha grado pari, e un cammino euleriano che non è un circuito quando esattamente due vertici hanno grado dispari; il cammino va allora da un vertice dispari all’altro. Un ciclo hamiltoniano visita ogni vertice una volta; Kn ne ha (n − 1)!/2. Un albero con n vertici ha n − 1 lati, e un grafo connesso con m lati mantiene un albero di copertura dopo aver tolto m − n + 1 lati.

Lemma delle strette di mano per un albero

L + 23 = 2(L + 5) − 2
L = 15

Risposta

L = 15

Scorciatoia: L = 2 + Σ (d − 2) sui vertici di grado d ≥ 3.

6.Teoria dei grafi

Risposta: d(D) = 19

Cammini minimi e alberi di copertura: l’algoritmo di Dijkstra fissa un vertice per passo: il vertice non fissato con la distanza provvisoria minima. La sua distanza è allora definitiva, e ogni vertice adiacente v riceve d(v) = min(d(v), d(u) + w(u, v)). L’algoritmo di Kruskal costruisce un albero di copertura minimo prendendo i lati dal più leggero al più pesante e saltando ogni lato che chiuderebbe un ciclo; l’algoritmo di Prim fa crescere un solo albero da un vertice iniziale aggiungendo sempre il lato più leggero che ne esce. Un albero di copertura di n vertici ha n − 1 lati.

Dijkstra passo per passo

Ogni riga: il vertice fissato, la sua distanza definitiva e i vertici adiacenti la cui distanza migliora.

A (0): B: 6, C: 12
B (6): D: 19, E: 16
C (12)
E (16): F: 18
F (18)
D (19)

Cammino minimo

A → B → D
d(D) = 19

Risposta

d(D) = 19

ExamProblems · examproblems.com/courses/data-structures-and-algorithms