Spazio delle soluzioni Flashcards

1
Q

Quali strutture dati si utilizzano tipicamente per le funzioni di calcolo combinatorio?

A

typedef struct l { int *scelte; int n_scelte; } Livello;

int *val; oppure Livello *val;
int *mark;
int *sol;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Principio di moltiplicazione: esempio

A

poké: 3 di una, 2 dell’altro, ecc.

32

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Principio di moltiplicazione: codice

A

int princ_molt(int pos, Livello *val, int *sol, int n, int cnt){
int i;
if(pos >= n){
for(i = 0; i < n; i++) printf(“%d”, sol[i]);
return cnt+1;
}
for(i = 0; i < val[pos].n_scelte; i++){
sol[pos] = val[pos].scelte[i];
cnt = princ_molt(pos+1, val, sol, n, cnt);
}
return cnt;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Disposizioni semplici: esempio

A

Raggruppamento k a k, senza ripetizione
n!/(n-k)!

per esempio: quanti numeri di due cifre distinte si possono formare con 4 cifre totali?

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Disposizioni semplici: codice

A

int dispiace_semplici(int pos, int val, intsol, int *mark, int k, int n, int cnt){ int i;
if(pos >= k){
// stampa sol
return cnt+1;
}
for (i = 0; i < n; i++){
if (mark[I] == 0){
mark[i] = 1;
sol[pos] = val[I];
cnt = disp_sempl(pos + 1, val, sol, mark, k, n, cnt);
mark[i] = 0;
}
}
return cnt;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Disposizioni con ripetizione: esempio

A

elementi k a k, non distinti

n^k;

esempio: quanti sono i numeri binari su 4 bit?
2^4

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Disposizioni con ripetizione: codice

A

int disp_rip(int pos, int * val, int *sol, int n, int k, int cnt){
if (pos>=k){
//stampa sol
return cnt+1;
}

for(i = 0; i < n; i++){
sol[pos] = val[I];
cnt = disp_rip(pos+1, val, sol, n, k, cnt);
}
return cnt;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Permutazioni semplici: esempio

A

n!

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Permutazioni con ripetizione: esempio

A

n!/a!B!…

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Permutazioni semplici: codice

A

int permutazioni_semplici(int pos, int val, intsol, int * mark, int n, int cnt){
if (pos>=n){ // stampa return cnt+1;}

for (int i = 0; i < n; i++){
if (mark[I] == 0){
mark[i] = 1;
sol[pos] = val[I];
cnt = permutazioni_semplici(pos +1, val, sol, mark, n, cnt);
mark[i] = 0;
}
}
return cnt;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Permutazioni con ripetizione: codice

A

int perm_r(int pos, int *dist_val, int n_dist, int *sol, int *mark, int n, int cnt){
if (pos >= n) {
// stampa
return cnt+1;
}

for(int i = 0; i < n_dist; i++){
if(mark[I] > 0){
mark[i]–;
sol[pos] = dist_val[i];
cnt = perm_r(pos+1, dist_val, n_dist, sol, mark, n, cnt);
mark[i]++;
}
}
return cnt;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Combinazioni semplici: esempio

A

in quanti modi si possono stringere la mano 20 persone?

binomiale (20 2)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Combinazioni semplici: codice

A

int comb_s(int pos, int *val, int *sol, int n, int k, int start, int cnt){
if (pos >= k) {…}

for(int i = start; i < n; i ++){
sol[pos] = val[I];
cnt = comb_s(pos+1, val, sol, n, k, I+1, cnt);
}
return cnt;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Combinazioni con ripetizione: esempio

A

Date 5 gocce bianche e 5 nere, quanti colori diversi si possono formare mischiando tra loro 5 gocce prese dai due colori?

binomiale (n+k-1)/k

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Combinazioni con ripetizione: codice

A

int comb_r(int pos, int *val, int *sol, int n, int k, int start, int cnt){
if (pos >= k) {…}

for(i = start; I < n; i++){
sol[pos] = val[I];
cnt = comb_r(pos+1, val, sol, n, k, start, cnt);
}
return cnt;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Dato un insieme I, quando i blocchi in cui è diviso sono una sua partizione?

A

Dato un insieme I e S_i sottoinsiemi ciascuno di k_i elementi, essi sono una partizione di I se:
- ogni blocco non è vuoto
- e sono tutti disgiunti
- e la loro somma dà l’insieme I

17
Q

Data la partizione di un insieme, l’ordine dei blocchi e degli elementi in essi conta?

18
Q

Dato un insieme I, quale può essere il numero complessivo di partizioni?

A

Il numero complessivo di partizioni è definito dai numeri di Bell: 1, 1, 2, 5, 15, 52

19
Q

Quali modelli ci sono per calcolare l’insieme delle parti?

A
  1. paradigma divide et impera
  2. disposizioni ripetute
  3. combinazioni semplici
20
Q

Insieme delle parti con paradigma divide et impera, caratteristiche

A

per k = 0 viene ritornato l’insieme vuoto, per k > 0 l’insieme delle parti per k elementi è l’insieme delle parti per k-1 elementi a cui decido se aggiungere o meno il kesimo elemento -> due rami ricorsivi distinti

21
Q

Insieme delle parti con disposizioni ripetute, caratteristiche

A
  • in sol gli elementi sono o 0 o 1 p
  • bisogna scegliere se prendere il k-esimo elemento (sol[pos] = 1) oppure no (sol[pos] = 0) e per questo ci sono due rami ricorsivi distinti
22
Q

Insieme delle parti con combinazioni semplici, caratteristiche

A

c’è una funzione wrapper che chiama la funzione ricorsiva con k diverso ogni volta (k: numero degli elementi)

23
Q

Come si possono rappresentare le partizioni di un insieme?

A
  • per ogni elemento si indica il blocco a cui appartiene
  • dato ogni blocco se ne elencano gli elementi
24
Q

Numero casuale di partizioni con disposizioni ripetute

25
algoritmo di Er
appunti
26
Quali sono le possibilità per chiudere le ritorsioni quando si vuole una sola soluzione?
1) flag come variabile globale o come parametro by reference 2) funzione ricorsiva che ritorna una valore di successo o fallimento che viene testato
27
cosa si intende per pruning?
è la riduzione dello spazio di ricerca che non porta alla perdita di informazioni o di completezza, ma che scarta a priori i riami dell'albero delle soluzioni che sicuramente falliranno, seguendo vincoli he permettano di non perdere soluzioni
28
metodologie di anticipazione dei vincoli
non c'è una metodologia generale. tipicamente i casi sono: - filtro statico sulle scelte: condizioni che dipendono dal problema e non dalle scelte precedenti - filtro dinamico: dipendono da entrambe le cose - speranza