Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Paolo Camurati
Dip. Automatica e Informatica
Politecnico di Torino
Il paradigma greedy
0 5 10 15
2 3
0 5 10 15
Key KEYgetStart(Item A) {
return A.start;
}
Key KEYgetSel(Item A) {
return A.selected;
}
KEYsetSel(&act[0]);
stop = KEYgetStop(act[0]);
MergeSort(act, n);
select(act, n);
Monetazione:
25, 10, 5, 1
Resto:
67
Passo Resto residuo Moneta scelta
0 17 2 x25
1 10 1 x10 soluzione
ottima!
2 7 1x5
3 2 2x1
A.A. 2019/20 10 Il paradigma greedy 29
Esempio
Monetazione:
soluzione ottima:
25, 10, 1 10,10,10
Resto:
30
Passo Resto residuo Moneta scelta
0 5 1x25
1 0 5x1 soluzione
non ottima!
jS vj xj = MAX
xj {0,1}
soluzione soluzione
non ottima! ottima!
jS vj xj = MAX
0 xj 1
soluzione
ottima!
Item.h
. . .
KEYsetF(&objects[i], res/KEYgetW(objects[i]));
stolen = stolen + KEYgetF(objects[i])*KEYgetV(objects[i]);
return stolen;
}
printf("Results: \n");
for(i = 0; i < n; i++)
ITEMstore(objects[i]);
printf("Total amount stolen: %.2f \n", stolen);
return 0;
}
A.A. 2019/20 10 Il paradigma greedy 42
Codici di Huffman (1950)
Codifica: 0 1
abfaac a
0 1
0101110000100
Decodifica: 0 1 0 1
0101110000100 c b d
a 0 1
f e
14 creazione dell’albero
0 1
dell’aggregato
f:5 e:9
14 d:16 25 a:45
0 1 0 1
inserimento nella
f:5 e:9 c:12 b:13 coda a priorità
A.A. 2019/20 10 Il paradigma greedy 57
estrazione
30 creazione dell’albero
0 1
dell’aggregato
14 d:16
0 1
f:5 e:9
25 30 a:45
0 1 0 1
c:12 b:13 14 d:16
0 1
f:5 e:9
passo 3
25 30 a:45
0 1 0 1
c:12 b:13 d:16
14
0 1
55
f:5 e:9 0 1
25 30
creazione dell’albero 0 1 0 1
dell’aggregato c:12 b:13 14 d:16
0 1
f:5 e:9
A.A. 2019/20 10 Il paradigma greedy 60
inserimento nella
coda a priorità
a:45 55
0 1
25 30
0 1 0 1
c:12 b:13 d:16
14
0 1
f:5 e:9
passo 4
a:45 55
0 1 100
0 1
25 30 a:45
0 1 0 1 55
0 1
c:12 b:13 d:16
14
0 1 25 30
0 1 0 1
f:5 e:9 c:12 b:13 14 d:16
0 1
creazione dell’albero
f:5 e:9
dell’aggregato
A.A. 2019/20 10 Il paradigma greedy 62
Implementazione
Quasi ADT Item per i dati (lettera e frequenza).
La chiave è la frequenza, ma è necessario poter
accedere alla lettera per visualizzarla
ADT I classe Tree (albero binario) di item con
funzioni non standard
ADT I classe PQ (coda a priorità) di alberi binari
client
PQ
Tree
Item
A.A. 2019/20 10 Il paradigma greedy 63
Tree item
l r
Item item
l r
item
X X
l(et) f(req)
item item
chiave X X X X
PQ
Item.h
#define MAXC 11
Item
l(et) f(req)
chiave
A.A. 2019/20 10 Il paradigma greedy 65
Item.c
. . .
void ITEMstore(Item val) {
printf("letter, frequency: %s %d\n", val.l, val.f);
}
Item ITEMscan() {
Item val;
printf("let, freq: "); scanf("%s %d", val.l, &(val.f));
return val;
} nuovo Item con
Item ITEMmerge(Item val1, Item val2) {
Item val; chiave somma
strcpy(val.l, "");
val.f = val1.f + val2.f;
return val;
}
int ITEMgt (Item val1, Item val2) {return (val1.f>val2.f);}
int ITEMlt (Item val1, Item val2) {return (val1.f<val2.f);}
Let LETget(Item *pval) {return (pval->let);}
Tree
Tree
TREErootCreate(Item val);
TREEjoin(Tree tL, Tree tR);
nuovo Tree fusione
Item TREEgetRootItem(Tree t); di 2 sottoalberi
void TREEdisplayCode(Tree t);
int TREEheight(Tree t);
void TREEfree(Tree t);
void TREEfree(Tree t) {
freeR(t->root);
free(t);
}
PQ PQinit(int maxN);
int PQempty(PQ pq);
void PQinsert(PQ pq, Tree t);
Tree PQextractMin(PQ pq);
Tree PQreadMin(PQ pq);
int PQsize(PQ pq);
void PQfree(PQ pq);
PQ PQinit(int maxN){
int i;
PQ pq;
pq = malloc(sizeof(*pq));
pq->array = (Tree *)malloc(maxN*sizeof(Tree));
for (i=0; i< maxN; i++)
pq->array[i] = NULL;
pq->heapsize = 0;
pq->maxN = maxN;
return pq;
}
if (argc < 2) {
printf("Error: missing argument\n");
printf("correct format:\n");
printf("%s maxN \n", argv[0]);
return 1;
}
maxN = atoi(argv[1]);
pq = PQinit(maxN);
t =PQextractMin(pq);
PQfree(pq);
return 0;
}
A.A. 2019/20 10 Il paradigma greedy 78
Complessità
Selezione di attività:
Cormen 17.1
Problema del ladro e dello zaino:
Cormen 17.2
Codici di Huffman
Cormen 17.3
9. Paradigma greedy
9.1 Activity selection
9.2 Codici di Huffman