Capitolo 6: Divide et Impera
Divide et impera
Il termine divide et impera si basa su una massima antica dei tiranni, enunciata
anche da Machiavelli a proposito della politica dell’antico senato romano:
“ Per regnare, occorre tenere disuniti nemici e trarne vantaggio.”
Tuttora è la tecnica alla base della risoluzione di numerosi algoritmi e consiste
nel partizionare un problema in più sottoproblemi più piccoli dello stesso tipo.
Una volta risolti i singoli sottoproblemi, con poco sforzo, si ricombinano i
risultati parziali per ottenere la soluzione al problema originale.
Lo schema di una procedura ricorsiva DivideEtImpera
problema P
per risolvere un
di dimensione n è il seguente, dove k è una costante intera
prefissata:
procedure DIVIDEETIMPERA (P,n)
begin
if n ≤ k then
{ risolvi P direttamente }
else begin
{ dividi P in h sottoproblemi P1,…,Ph di dimensione
n1,…,nh };
for i := 1 to h do DIVIDEETIMPERA(Pi , n);
{ combina I risultati di P1,…,Pn per ottenere quello di P}
end
end
end;
56
Capitolo 6: Divide et Impera
Quicksort
Un tipico esempio della tecnica divide et impera è l’algoritmo del quicksort
inventato da Hoare nel 1962. Esso è l’algoritmo di ordinamento più veloce e
infatti il termine quick significa appunto svelto. La tecnica consiste nel
selezionare un elemento, detto perno, all’interno del vettore e nel spostare tutti
gli elementi minori dl perno alla sua sinistra e tutti quelli maggiori alla sua
destra. Lo stesso algoritmo va poi applicato alle due porzioni di elementi
maggiori e minori del perno.
La seguente procedura implementata in Pascal mostra un esempio dell’algoritmo
di quicksort.
procedure QuickSort(var A: vettore; iLo, iHi: integer);
var Lo, Hi, Pivot, T: Integer;
begin
Lo := iLo; Hi := iHi;
Pivot := A[Hi]; {Scelta del perno}
repeat
while A[Lo] < Pivot do Inc(Lo);
while A[Hi] > Pivot do Dec(Hi);
if Lo <= Hi then begin
T := A[Lo];
A[Lo] := A[Hi];
A[Hi] := T;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort(A, iLo, Hi); {Ordinamento parte minore del
perno}
if Lo< iHi then QuickSort(A,Lo,iHi); {Ordinamento parte maggiore del
perno}
end;
La chiamata nel programma principale sarà:
QuickSort(v, 1, n); dove v è il vettore da ordinare.
57
Capitolo 6: Divide et Impera
Bibliografia
- Alan Bertossi, Algoritmi e strutture di dati
Casa editrice UTET Libreria 2004
- http://www.wikipedia.org
58