ordinamento e ricerca in un vettore - SisInfLab

annuncio pubblicitario
9. Problemi ricorrenti:
ordinamento e ricerca
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Indice
• Problemi ricorrenti in informatica:
– Ordinamento di un vettore:
• Ordinamento per selezione:
– il metodo di selezione diretta (selection sort)
• Ordinamento per scambio:
– il metodo dell’affioramento(bubble sort)
– Il metodo dell’ordinamento non decrescente(quick sort)
• Ordinamento per fusione (merge-sort)
– Ricerca in un vettore:
• Ricerca sequenziale
• Ricerca dicotomica
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Il problema dell’ordinamento
• Il problema è quello di ordinare gli elementi di un
insieme secondo una prefissata relazione d’ordine, che
dipende dalla natura dei dati da ordinare
• I metodi di ordinamento si applicano ad
– insiemi di dati elementari (singoli numeri o lettere)
– dati rappresentati in forma complessa: in generale si fa
riferimento ad un insieme di strutture, delle quali si seleziona un
campo che viene usato come campo chiave per l’ordinamento;
il risultato dell’ordinamento sarà una ridisposizione dei record
secondo l’ordinamento introdotto nel campo considerato.
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Metodi di ordinamento
Classificazione:
• Inserzione: Si considerano gli elementi uno alla volta e ciascun
nuovo elemento viene collocato nella posizione che gli compete
all’interno dell’insieme di elementi considerati in precedenza.
• Selezione: Si scandisce l’insieme in modo da individuare l’elemento
più piccolo, che viene separato dal resto dell’insieme. Dell’insieme
rimasto viene ancora trovato il più piccolo elemento e lo si colloca di
seguito a quello trovato in precedenza. Questo procedimento si itera
fino a quando non si sono considerati tutti gli elementi.
• Scambio: Si scandisce tutto l’insieme, se due elementi vengono
trovati fuori posto si scambiano tra loro. Questo procedimento viene
ripetuto fino a quando non si hanno più cambiamenti.
• Fusione: Si sfrutta un’operazione più semplice dell’ordinamento,
chiamata fusione, che consiste nel formare un insieme ordinato a
partire da due insiemi già ordinati
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Prestazioni degli algoritmi di
ordinamento
• Misurate tramite due fattori:
– Numero di confronti necessari per determinare gli elementi fuori
posto
– Numero di spostamenti da effettuare per riportare gli elementi al
loro posto
• Algoritmi con valore basso per i due fattori sopra esposti
sono più efficienti: eseguono l’ordinamento in meno
passaggi, cioè impiegando meno tempo e spazio
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ipotesi di lavoro
Nel seguito:
• come insieme di dati da ordinare considereremo un vettore di
numeri interi V di dimensione N; V(i) indicherà l’i-esimo elemento
del vettore.
• La relazione d’ordine che si prenderà in considerazione è l’usuale
ordinamento numerico (basato sui concetti di minore e maggiore)
• Supporremo di realizzare un ordinamento crescente.
• Con l’istruzione V(i)
V(k) abbrevieremo il seguente blocco di
istruzioni di scambio:
– lavoro = V(i);
– V(i) = V(k);
– V(k)= lavoro;
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ordinamento per selezione
Selection Sort : Il metodo di selezione diretta:
• Il metodo fa uso di due indici di posizione :
– i: è l’indice dell’elemento del vettore che delimita l’inizio
dell’insieme dei valori presi in considerazione ad ogni singolo
passo
– j: è un cursore che ad ogni passo percorre l’insieme dei valori da
scandire
– k: è un indice che all’interno di ogni passo tiene traccia del
minimo progressivo dell’insieme da scandire
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ordinamento per selezione
Algoritmo di selezione diretta:
• Passo 0:
– All’inizio l’indice i viene posizionato sul primo elemento del vettore V; j
invece comincia a scandire dal secondo elemento
• Passo 1:
– Il primo elemento viene confrontato con i rimanenti (scanditi da j),
scambiando di posto il primo elemento e quello di valore minimo alla
fine della scansione(posizione k)
• Passo 2:
– Al secondo passo l’indice i viene portato alla seconda posizione, perché
il nuovo insieme dei valori da scandire non comprende il primo, che è
sicuramente il minimo
• Passi successivi:
– L’indice j percorre l’insieme dei valori da scandire, a partire
dall’elemento successivo a i; il processo riprende in maniera analoga al
passo precedente e viene iterato finché l’indice i non giunge all’ultima
posizione.
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
Esempio
DEE - Politecnico di Bari
25
8
8
8
8
37
37
25
25
25
41
41
41
27
27
27
27
27
41
37
8
25
37
37
41
• le colonne rappresentano i passi dell’algoritmo
• gli elementi evidenziati in azzurro rappresentano il sottoinsieme del
vettore da scandire per l’ordinamento ad ogni passo
• il cerchio rosso rappresenta l’elemento minimo di ognuno dei
sottoinsiemi
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Prestazioni dell’algoritmo
• Il metodo di selezione diretta presenta un numero di
confronti proporzionale ad N2:
– al primo passaggio si effettuano N-1 confronti, al secondo N-2 e
così via, fino ad arrivare all’ultimo confronto; si ha pertanto:
(N-1) + (N-2) + (N-3) + ….. +1 = N(N-1)/2
• Per quanto riguarda il numero di spostamenti essi sono
al più N-1.
• La prestazione del metodo per quanto riguarda il numero
di confronti non è influenzata dalla configurazione
iniziale dei dati(se sono ordinati o meno)
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
Selezione diretta: flow-chart
DEE - Politecnico di Bari
inizio
i =1
• Le istruzioni di scambio si trovano nel ciclo
scandito dalla i, per cui vengono eseguite N-1
volte AL PIU’ (solo se K!=i)
falso
i<N
vero
k=i
•I confronti vengono effettuati N-1 volte per
ognuno degli N cicli scanditi dalla i, perché si
trovano in un’istruzione di controllo all’interno
dei due cicli
j = i+1
falso
j<=N
vero
vero
V(k)>V(j)
k=j
falso
j++
fine
k != i
falso
vero
V(i)
V(k)
i++
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Codice Sorgente
N=input('Inserire la dimensione del vettore');
for i=1:N
V(i)=input('Inserire un numero');
end
for i=1:N
k=i;
for j=i+1:N
if V(k) >V(j)
k=j;
end
end
if k~=i
lavoro = V(i);
V(i) = V(k);
V(k)= lavoro;
end
end
disp(V);
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ordinamento per scambio
Il procedimento tipico di qualsiasi algoritmo di scambio è il
seguente:
• si considerano i primi due elementi dell’insieme; se il
primo elemento della coppia è maggiore del secondo i
due elementi vengono scambiati di posto tra di loro;
• si considera ora una nuova coppia formata dal secondo
e dal terzo elemento dell’insieme, si confrontano e si
scambiano le posizioni se necessario;
• questo procedimento si ripete, considerando coppie di
elementi consecutivi, fino a quando non si è esaurito
tutto l’insieme
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ordinamento per scambio
Il metodo dell’affioramento (Bubble Sort)
• Gli elementi più “pesanti” tendono ad andare verso il
basso e quelli più leggeri verso l’alto:
– ad ogni passo (step) dell’algoritmo l’elemento in assoluto più
pesante sarà collocato nella posizione finale, che al passo
successivo non verrà più scandita
• Il numero massimo di passi è N-1 , ma dato che ad ogni
passo più elementi potrebbero essere “a posto”, i passi
potrebbero anche di meno
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
Esempio
DEE - Politecnico di Bari
25
25
25
25
8
37
37
27
8
25
41
27
8
27
27
27
8
37
41
37
8
41
41
37
41
• le colonne rappresentano i passi dell’algoritmo
• gli elementi evidenziati in azzurro rappresentano il sottoinsieme del
vettore da scandire per l’ordinamento ad ogni passo
• il cerchio rosso rappresenta l’elemento massimo di ognuno dei
sottoinsiemi
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
Bubble Sort: Flow-chart
DEE - Politecnico di Bari
inizio
• La variabile più importante
usata nel procedimento è:
step = 1, scambi=1
falso
step < N
&& scambi == 1
vero
scambi = 0
fine
j=1
falso
j <= N - step
vero
– scambi: viene inizializzata a 0
ad ogni passo e serve per
controllare se ci sono stati scambi
ad un certo passo: se non ce ne
sono il resto di vettore è ordinato
vero
V(j)>V(j+1)
falso
V(j)
V(j+1)
scambi = 1
j=j+1
step = step + 1
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Codice Sorgente
N=input('Inserire la dimensione del vettore');
for i=1:N
V(i)=input('Inserire un numero');
end
step=1;
scambi=1;
while step<N && scambi==1
scambi=0;
for j=1:N-step
if V(j)>V(j+1)
lavoro = V(j);
V(j) = V(j+1);
V(j+1)= lavoro;
scambi=1;
end
end
step=step+1;
end
disp(V);
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Prestazioni
• Numero di confronti:
– l’analisi del caso peggiore porta a concludere che il metodo è di ordine
N2 ; il caso peggiore si ha quando l’insieme è ordinato in modo
decrescente e da vita ad un numero complessivo di confronti pari a
(N-1) + (N-2) + (N-3) + ….. +1 = N(N-1)/2
– Si può dimostrare che questa valutazione è vera anche nella media dei
casi
– Nel caso in cui in qualche passo vada a posto più di un elemento il
numero di confronti complessivi da operare sarà inferiore
• Numero di spostamenti:
– Si segue un ragionamento analogo (nel caso peggiore sono N(N-1)/2).
La prestazione del metodo è pertanto influenzata
dalla configurazione iniziale dei dati
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Il problema della ricerca
• Il problema è quello di cercare un elemento in un vettore
• I metodi di ricerca si applicano ad
– insiemi di dati elementari (singoli numeri o lettere)
– dati rappresentati in forma complessa: in generale si fa
riferimento ad un insieme di record, dei quali si cercano uno o
più campi che vengono usati come campi chiave per la
ricerca.
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Metodi di ricerca
• Metodi basati sul confronto di chiavi: si confrontano
gli elementi del vettore con l’elemento (chiave) che si
vuole ricercare:
– Ricerca lineare: si confronta ripetutamente la chiave con
ciascuno degli elementi del vettore finché eventualmente non si
trova la chiave
– Ricerca dicotomica: Si confronta la chiave con l’elemento che
si trova a metà del vettore (supposto ordinato). Se l’elemento
individuato non è uguale a quello cercato si prosegue la ricerca
nel semivettore inferiore o superiore a seconda che la chiave sia
più piccola o più grande dell’elemento che si trova a metà.
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ipotesi di lavoro
• Elementi utilizzati nell’analisi:
–
–
–
–
–
Vettore V di dimensione N
Chiave di ricerca K
Indice i per scorrere il vettore
t = indice che punta all’inizio del vettore in cui ricercare
u= indice che punta alla fine del vettore in cui ricercare
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ricerca lineare
• Principio risolutivo:
Si confronta ripetutamente la chiave K con ciascuno degli elementi del
vettore finché non si trova V(i) = K (ricerca con successo) oppure finché
non sono stati considerati tutti gli elementi del vettore senza trovarne
nessuno uguale a K (ricerca senza successo).
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
Ricerca lineare: flow-chart
DEE - Politecnico di Bari
start
i=1
K ≠ V (i)
and
i <= N
no
si
i = i+1
no
si
i <=N
Elemento
Non trovato
Elemento
Trovato con indice i
end
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Codice Sorgente
N=input('Inserire la dimensione del vettore');
for i=1:N
V(i)=input('Inserire un numero');
end
K=input('Inserire elemento da cercare');
i=1;
while i<=N&& K~=V(i)
i=i+1;
end
if i<=N
fprintf('Elemento trovato con indice %d\n',i);
else disp('Elemento non trovato');
end
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
RICERCA LINEARE: Numero Confronti
Due valutazioni diverse a seconda dell’esito della ricerca:
• ricerca con successo:
si fa riferimento al numero medio di
confronti, che si ottiene dividendo il
numero totale di confronti necessari per ricercare tutti gli elementi per il
numero degli elementi stessi. Siccome per individuare il primo elemento si
effettua un confronto, per il secondo due e così via, il numero totale di
confronti è :
1+2+3+4+5+….. N = (N+1)/2
Il numero medio di confronti risulta (N+1)/2
• ricerca senza successo:
l’algoritmo esamina sempre tutto il vettore, quindi il numero di confronti è
sempre N
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ricerca in vettori ordinati
Vantaggio:
Il numero di confronti in caso di ricerca senza successo è lo
stesso che nella ricerca con successo (N+1)/2, perché si
procede alla scansione del vettore finché K ≤ V(i). A questo
punto o K= V(i), e la ricerca è con successo, oppure si
possono interrompere i confronti, e la ricerca risulta senza
successo. Pertanto si determina il numero medio di confronti
come in caso di successo
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
RICERCA BINARIA
(detta dicotomica o logaritmica)
•
•
•
•
•
Si applica su vettori ordinati
Si confronta la chiave K con l’elemento che si trova a metà del vettore. Se
l’elemento individuato non è uguale a quello cercato si prosegue la ricerca
nel semivettore inferiore o superiore a seconda che la chiave K sia più
piccola o più grande dell’elemento che si trova a metà.
Il procedimento continua iterativamente in modo da suddividere le
sottotabelle via via individuate.
La ricerca termina con successo quando l’elemento V(i) considerato ad un
certo passo è proprio uguale a K.
La ricerca termina con insuccesso quando la parte di vettore considerata è
costituita da un solo elemento.
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ricerca dicotomica: flow-chart
start
t=1
u=N
no
t <= u &&
K ~=V (i)
si
i = ceil((t+u)/2)
no
K > V (i)
u=i-1
si
t=i+1
no
si
K ~=V (i)
Elemento
trovato
posizione i
Elemento
Non trovato
end
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ricerca dicotomica: codice (1/2)
Versione iterativa
//Ricerca dicotomica di una chiave K in un vettore V
N=input('Inserire la dimensione del vettore');
for i=1:N
V(i)=input('Inserire un numero');
end
%Ordinamento
for i=1:N
k=i;
for j=i+1:N
if V(k) >V(j)
k=j;
end
end
if k~=i
lavoro = V(i);
V(i) = V(k);
V(k)= lavoro;
end
end
disp (V);
%Ricerca
K=input('Inserire elemento da cercare');
t=1;
u=N;
while t<=u && K~=V(i)
i=ceil((t+u)/2);
if K>V(i)
t=i+1;
else u=i-1;
end
end
if K~=V(i) disp('Elemento non trovato');
else fprintf('Elemento trovato in posizione%d\n',i);
end
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
Ricerca dicotomica: codice (2/2)
Versione ricorsiva
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Sistemi Informativi
DEE - Politecnico di Bari
RICERCA DICOTOMICA:
Numero Confronti
• L’algoritmo è il più veloce tra quelli di ricerca basati sul
confronto di chiavi.
• In un vettore di dimensione
N = 2h -1
l’algoritmo deve compiere
h=log2(N+1)
passi(e quindi confronti) per la ricerca senza successo,
mentre i confronti possono essere di meno per la ricerca
con successo.
Informatica per l’Ingegneria- CDL in Ingegneria Informatica- A.A. 2016-2017
Scarica