Documente Academic
Documente Profesional
Documente Cultură
Sortare Shell.
Metoda Greedy
Algoritmi și tehnici de
programare
Sortarea rapidă
Algoritm
pentru fiecare pas din secvență
pentru fiecare i=pas..n-1
aux=v[i]; j=i-pas
cât timp j>=0 și v[j]>aux
v[j+pas] v[j]
j-=pas
v[j+pas]=aux;
Sortarea Shell
Exemplu
indici 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
n=15 Initial: 38 13 85 98 5 70 45 44 68 71 40 44 9 10 3
Dupa pasul 7: 3 13 71 40 5 9 10 38 68 85 98 44 70 45 44
Dupa pasul 3: 3 5 9 10 13 44 40 38 44 70 45 68 85 98 71
Dupa pasul 1: 3 5 9 10 13 38 40 44 44 45 68 70 71 85 98
Selecție
Inserare
Shell
Interclasare -
Heap
Rapidă (Quick)
Numărare – -
vector particular
Cupe– vector -
particular
Rădăcini– vector -
Spațiul soluțiilor
În multe probleme soluțiile pot fi descrise ca vectori cu n elemente
unde
spațiul soluțiilor
Exemple
În implementare - în ipoteza în care pentru , finită,
, și pe este definită o relație de ordine totală
funcție de validare
◦ La fiecare pas se alege cea mai bună cale în contextul local, ignorînd
contextul general
Este folosită atunci când găsirea celei mai bune soluții este prea
costisitoare
Greedy – metoda optimului local
Soluție de tip
greedy
11 1, 3, 6, 2, 5, 9, 11 -> 124
5 15
2
1, 4, 8, 11 -> 45
22 44
33
32 26 7
9
47
88 Soluție
(optim global)
55 66
77 20
12
41 10
10
99 21
18
5
11
11
Greedy – metoda optimului local
Caracteristici ale problemelor rezolvate prin metoda Greedy
Operații uzuale
◦ Alegerea unui element candidat din mulțimea (
◦ Verificarea acceptabilității elementului ales: adăugarea
elementului la soluția parțială construită o menține acceptabilă
sau o face inacceptabilă?
este acceptabilă?
Cum se verifică
Algoritm general
acceptabilitatea elementului
Cum se alege un element candidat? candidat?
◦ se primește mulțimea cu elemente
◦ se inițializează soluția ca mulțime vidă
◦ repetă de (maxim) ori
alege un element candidat din mulțimea Variantă:
prelucrare
verifică dacă este soluție parțială acceptabilă inițială a mulțimii
A (sortare)
dacă da, adaugă la mulțimea :
qr=q;
for(i=0; i<n && qr>0; i++)
if(qr>=c[i])
{ x[i]=1;
qr-=c[i]; //qr-=c[i]*x[i]
}
else
{ x[i]=qr/c[i];
qr=0; //qr-=c[i]*x[i]
for(j=i+1;j<n;j++)
x[j]=0;
}
}