La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Gli algoritmi di ordinamento non basati sul confronto Zotti Paolo 62SI December 2001

Presentazioni simili


Presentazione sul tema: "Gli algoritmi di ordinamento non basati sul confronto Zotti Paolo 62SI December 2001"— Transcript della presentazione:

1 Gli algoritmi di ordinamento non basati sul confronto Zotti Paolo 62SI December 2001 email: zody@freepass.it

2 Struttura del Progetto IL PROGETTO E DIVISO IN 2 PARTI IL PROGETTO E DIVISO IN 2 PARTI : RELAZIONE SOFTWARE - Linguaggio C++

3 Struttura della relazione ARGOMENTI ATTINENTI ALLORDINAMENTO ARGOMENTI ATTINENTI ALLORDINAMENTO Introduzione allordinamento Complessità degli algoritmi di ordinamento I numeri casuali Le liste concatenate (semplici e doppie) STUDIO DI 3 ALGORITMI DI ORDINAMENTO NON BASATI SUL CONFRONTO E LO SCAMBIO STUDIO DI 3 ALGORITMI DI ORDINAMENTO NON BASATI SUL CONFRONTO E LO SCAMBIO Counting Sort Radix Sort Bucket Sort TESTING DEGLI ALGORITMI TESTING DEGLI ALGORITMI Test sugli algoritmi di ordinamento Test sulla generazione di numeri casuali

4 Input: Insieme di dati disordinato Ordinamento effettuato con: Counting Sort o Radix Sort o Bucket Sort Cosa fa il software creato Output: Insieme di dati ordinato Calcolo del tempo

5 Struttura del software Scenario Diagrams Scenario Diagrams Class Rand State Diagrams State Diagrams Class Bucket Sort Component Diagrams Component Diagrams Class Liste Use Case Diagrams Use Case Diagrams Class Counting Sort State Diagrams State Diagrams Class Radix Sort Il listato principale, Main, coordina tutto il programma Main

6 Introduzione Buon giorno sono il sign. Cormen, il mago degli algoritmi. Vi aiuterò a capire meglio il contenuto di questa relazione. Cominciamo subito con alcune definizioni basilari

7 Il tempo di calcolo T ( n ) Il tempo occorrente ad ordinare un insieme di dati, si puo rappresentare attraverso una funzione. La funzione T(n). n Tempo Quantità dei dati Esatto! Il tempo di calcolo di una procedura è il costo complessivo delle operazioni elementari in funzione della dimensione n dei dati in ingresso. Nel valutare il tempo di calcolo T(n), è difficile quantificare con esattezza il numero di operazioni elementari eseguite. Questa difficoltà viene aggirata valutando il numero di operazioni in ordine di grandezza, cioè esprimendole come limitazioni della funzione T(n) al tendere allinfinito della dimensione n dei dati in ingresso.

8 La limitazione può essere: O Limitazione superiore Caso Peggiore 2 Limitazione sup. e inf. equivalente S Limitazione inferiore Caso Migliore Il costo delle operazioni é valutato principalmente nel caso peggiore, perché presenta il vantaggio di garantire che lalgoritmo non richiederà mai per nessun dato in ingresso di dimensione n, un tempo maggiore.

9 Input Output ALGORITMO Cosa è un algoritmo??? Qualsiasi procedura computazionale ben definita che prende alcuni valori, come input e produce alcuni valori, come output é chiamata algoritmo. Un algoritmo é quindi una sequenza di passi computazionali che trasformano l'input nell'output.

10 Insieme di dati disordinato ALGORITMO Di ordinamento Cosa è lordinamento? L'ordinamento, consiste nel disporre un gruppo di informazioni in ordine crescente o decrescente utilizzando un algoritmo di ordinamento. Insieme di dati ordinato

11 Chiave dellordinamento Occupazione Hobby Residenza Religione Nome l Cognome Data nascita Chiave Struttura di dati In genere, quando si esegue un ordinamento, come chiave dell'ordinamento, cioè l'oggetto con cui si fa il confronto, viene utilizzata solo una parte delle informazioni disponibili. La chiave é quella parte dei dati che determina la posizione relativa dei vari elementi. Pertanto nel confronto fra gli elementi, viene utilizzata solo la chiave ma, nello scambio dei dati, viene trasferita l'intera struttura.

12 Ora vi spiegherò gli algoritmi di ordinamento trattati in questa relazione. Sono tutti algoritmi che non basano il proprio funzionamento sul confronto e lo scambio di dati. Passiamo allo studio del primo algoritmo di ordinamento: Counting Sort

13 Counting Sort: idea di base Counting Sort, si basa sullipotesi che ognuno degli n elementi in input sia un intero nellintervallo da 1 a k ove k è un numero non troppo grande. Si determina, per ogni elemento x in input, il numero di elementi minori di x. Questa informazione può essere usata per porre lelemento x, direttamente nella sua esatta posizione nellarray di output. Per es., se vi sono 10 elementi minori di x, x va messo in undicesima posizione nellarray di output. Lalgoritmo deve gestire situazioni in cui alcuni elementi abbiano lo stesso valore, infatti non si vuole metterli tutti nella stessa posizione nellarray di output.

14 Counting Sort: proprietà E veloce perché fa delle ipotesi sullinput, infatti, assume che linput, consista di numeri interi in un piccolo intervallo. E veloce perché fa delle ipotesi sullinput, infatti, assume che linput, consista di numeri interi in un piccolo intervallo. Stabile Stabile Risorse occorrenti: 3 array Risorse occorrenti: 3 array array A: array di dimensione n, contenente gli n numeri da ordinare: array B: array di dimensione n, contenente la sequenza degli n numeri ordinata Array C: array di dimensione k, temporaneo di lavoro, dove k é il massimo numero trovato in A

15 Cosa significa stabile??? Un algoritmo è stabile quando elementi con lo stesso valore, compaiono nellarray di input, nello stesso ordine in cui compaiono in quello di output. Cioè, lo spareggio tra due elementi con lo stesso valore avviene secondo la regola per cui qualunque numero compaia per primo nellarray di input, appare per primo nellarray di output.

16 Counting Sort : esempio 3 6 14 1 C 4 3 4 0 1 000 0 0 A 234 5 87 6 1234 56 s Esecuzione di Counting Sort su un array di input A[ 8 ], dove ogni elemento di A é un intero positivo non più grande di k=6. Temporaneo di lavoro 0 0 00 00 0 0 1 B 234 5 87 6 inputoutput Si dimensiona larray C, con il massimo numero k in A

17 Counting Sort : prima fase 3 6 14 44 3 4 1 A 234 5 87 6 input Scorrendo tutto larray partendo da A [ 1 ] fino ad arrivare ad A [ 8 ]; se il valore di un elemento in input é i, si incrementa C[ i ]. Così, alla fine C[ i ] contiene il numero di elementi di input uguali ad i per ciascun intero i=1,2,…,k. C 0010 0 0 1234 56 C 0010 1 0 1234 56 C 0110 1 0 1234 56 C 1110 1 0 1234 56 C 1120 1 0 1234 56 C 1220 1 0 1234 56 C 1320 1 0 1234 56 C 1420 1 0 1234 56

18 Seconda fase: somma cumulata Si determina per ciascun i = 1,2,…,k, quanti elementi dell'input sono minori o uguali ad i. Questo viene fatto determinando la somma cumulata degli elementi dell'array C[ ]. Si determina per ciascun i = 1,2,…,k, quanti elementi dell'input sono minori o uguali ad i. Questo viene fatto determinando la somma cumulata degli elementi dell'array C[ ]. For x = 2 to 6 For x = 2 to 6 C [ i ] = C [ i ] + C [ i-1 ] C [ i ] = C [ i ] + C [ i-1 ] C 1420 1 0 1234 56 prima C 1737 8 1 1234 56 dopo

19 Terza fase: sistemazione in B 0 0 00 00 0 0 B 1234 5 87 6 input 3 6 14 14 3 4 1 A 234 5 87 6 output C 1737 8 1 1234 56

20 Counting Sort: terza fase, prima iterazione Partendo dallultima posizione di A, si prende il numero contenuto in A [ 8 ] = 4. Guardiamo cosa è contenuto in C [ 4 ] = 7. Sistemiamo il 4 in B [ 7 ] 0 0 00 40 0 0 B 1234 5 87 6 3 6 14 44 3 4 1 A 234 5 87 6 O C 1737 8 1 1234 56

21 Counting Sort: seconda iterazione 0 0 00 40 0 0 B 1234 5 87 6 3 6 14 44 3 4 1 A 234 5 87 6 O C 1737 8 1 1234 56 Qualcosa non funziona, così facendo perdiamo un dato.

22 Attenzione! Dobbiamo gestire il caso in cui gli elementi contenuti in A, non siano tutti distinti. 3 6 14 44 3 4 1 A 234 5 87 6 O O

23 Ripartiamo dallinizio 0 0 00 40 0 0 B C 1637 8 1 1234 5 87 6 123 564 Prima Dopo Per questo, decrementiamo C[4], in modo che alla prossima iterazione, nel caso di elementi non distinti, il numero si inserisca nellarray di output, nella sua corretta posizione. 3 6 14 44 3 4 1 A 234 5 87 6 O C 1737 8 1 1234 56

24 Counting Sort: terza fase, prima iterazione Partendo dallultima posizione di A, si prende il numero contenuto in A [ 8 ] = 4. Guardiamo cosa è contenuto in C [ 4 ] = 7. Sistemiamo il 4 in B [ 7 ] Decrementiamo C [ 4 ] 0 0 00 40 0 0 B 1234 5 87 6 3 6 14 44 3 4 1 A 234 5 87 6 O C 1737 8 1 1234 56 C 1637 8 1 123 564 Dopo

25 Counting Sort: terza fase, seconda iterazione 0 0 00 40 0 4 B 1234 5 87 6 3 6 14 44 3 4 1 A 234 5 87 6 O C 1637 8 1 1234 56 C 1537 8 1 123 564

26 Counting Sort: terza fase, terza iterazione 0 0 00 40 4 4 B 1234 5 87 6 3 6 14 44 3 4 1 A 234 5 87 6 O C 1537 8 1 1234 56 C 1437 8 1 123 564 Dopo

27 Situzione finale: array ordinato 1 1 33 46 4 4 B 1234 5 87 6 Continuando con queste iterazioni, alla fine otterremo unarray ordinato.

28 Tempo impiegato da Counting Sort T= 2 ( k+n ) Abbiamo calcolato attraverso formule matematiche, che il tempo è lineare e quindi che Il limite superiore e inferiore si equivalgono cioè che il tempo impiegato nel caso peggiore (array ordinato in modo decrescente) equivale al tempo impiegato nel caso migliore (array ordinato in modo crescente). Questa è una caratteristica degli algoritmi di ordinamento non basati sul confronto. Ora dobbiamo verificare con dei test se il tempo calcolato equivale al tempo realmente impiegato dallalgoritmo. n Tempo

29 La limitazione può essere: O Limitazione superiore Caso Peggiore 2 Limitazione sup. e inf. equivalente S Limitazione inferiore Caso Migliore

30 Test Counting Sort

31 Scopo del test, verificare e dimostrare 2 ipotesi, la prima: Scopo del test, verificare e dimostrare 2 ipotesi, la prima: dato che questo algoritmo di ordinamento é basato sulla distribuzione e usa metodi, per ordinare l'insieme dei dati, non basati sul confronto e lo scambio, l'ordine dei numeri in input non dovrebbe influire sulle prestazioni dell'algoritmo;

32 Prima ipotesi dimostrata CASUALE DECRESCENTE CRESCENTE Quantità numeri 4500 2500 500 100015003000 4000 3500 2000 5000 Inf. Ordine dei numeri time Lordine dei numeri non influisce sulle prestazioni dellalgoritmo.

33 Test Counting Sort La seconda ipotesi da dimostrare è la seguente: La seconda ipotesi da dimostrare è la seguente: il tempo necessario all'ordinamento cresca in modo lineare al crescere di n, dove n rappresenta la quantità dei numeri da ordinare.

34 Verifica della linearità CASUALE DECRESCENTE CRESCENTE Quantità numeri 4500 2500 500 100015003000 4000 3500 2000 5000 Inf. Ordine dei numeri time Il tempo cresce in modo lineare, allaumentare della dimensione n dei dati in ingresso.

35 Passiamo allo studio del prossimo algoritmo di ordinamento: Radix Sort

36 Radix Sort IDEA DI BASE IDEA DI BASE Lidea, consiste nell'utilizzare un qualsiasi algoritmo di ordinamento, che ordini l'array usando come chiave di ordinamento la cifra meno significativa. Quando l'intero array è ordinato sulla cifra meno significativa, lo si ordina sulla seconda cifra meno significativa utilizzando un algoritmo stabile. Il processo continua finché i numeri sono stati ordinati su tutte le d cifre. A quel punto, i numeri sono completamente ordinati.

37 Radix Sort Ossia: For X = 1 to N Usa un ordinamento stabile per ordinare lintero array sulla cifra X

38 Proprietà, particolarità e risorse utilizzate Risorse hardware occorrenti: Risorse hardware occorrenti: Quelle utilizzate dallalgoritmo di ordinamento intermedio Particolarità: Particolarità: Radix Sort, ordina i numeri in modo contro intuitivo, cioè non naturale, ordinando prima sulla cifra meno significativa, poi sulla seconda cifra meno significativa, e così via fino alla cifra più significativa. Proprietà: Stabilità: Se l'algoritmo utilizzato per l'ordinamento intermedio é stabile, cioè, ha la proprietà che numeri con lo stesso valore appaiono nell'array di output nello stesso ordine di ingresso, avremo alla fine un array ordinato. La stabilità dellalgoritmo di ordinamento intermedio è indispensabile.

39 Radix Sort : esempio 329 ARRAY ORIGINALE s Esecuzione di Radix Sort su un array di input A [ 7 ], dove ogni elemento di A é un intero positivo. 457 657 839 436 720 355

40 Radix Sort La prima operazione che deve eseguire RadixSort, é quella di effettuare l'ordine, usando come chiave di ordinamento, la cifra meno significativa dei numeri stessi. La prima operazione che deve eseguire RadixSort, é quella di effettuare l'ordine, usando come chiave di ordinamento, la cifra meno significativa dei numeri stessi. Logicamente, ad ogni ordinamento sulla chiave (cifra meno significativa), deve corrispondere uno spostamento di tutta la struttura (il numero in esame). Per questo, é importante che l'ordine intermedio venga eseguito da un algoritmo di ordinamento stabile. Logicamente, ad ogni ordinamento sulla chiave (cifra meno significativa), deve corrispondere uno spostamento di tutta la struttura (il numero in esame). Per questo, é importante che l'ordine intermedio venga eseguito da un algoritmo di ordinamento stabile. 720 355 436 457 657 329 839 Larray al primo passaggio: i numeri risultano parzialmente ordinati. Larray al primo passaggio: i numeri risultano parzialmente ordinati. 329 457 657 839 436 720 355 O

41 Radix Sort la seconda operazione che deve eseguire RadixSort é quella di effettuare l'ordine, usando come chiave di ordinamento, la seconda cifra meno significativa la seconda operazione che deve eseguire RadixSort é quella di effettuare l'ordine, usando come chiave di ordinamento, la seconda cifra meno significativa 720 329 436 839 355 457 657 Larray al secondo passaggio: i numeri risultano parzialmente ordinati. Larray al secondo passaggio: i numeri risultano parzialmente ordinati. 720 355 436 457 657 329 839 O

42 Radix Sort la terza operazione che deve eseguire RadixSort é quella di effettuare l'ordine, usando come chiave di ordinamento, la terza cifra meno significativa la terza operazione che deve eseguire RadixSort é quella di effettuare l'ordine, usando come chiave di ordinamento, la terza cifra meno significativa 720 329 436 839 355 457 657 Larray al terzo passaggio: i numeri risultano ordinati. Larray al terzo passaggio: i numeri risultano ordinati. 329 355 436 457 657 720 839 O

43 Possiamo calcolare in anticipo i cicli da effettuare??? Importante: in questo caso, dato che i numeri interi presi in analisi, sono composti da 3 cifre ciascuno, sono sufficienti 3 passaggi per ottenere un ordine definitivo. Importante: in questo caso, dato che i numeri interi presi in analisi, sono composti da 3 cifre ciascuno, sono sufficienti 3 passaggi per ottenere un ordine definitivo. Quindi, in un array contenente n numeri interi composti ognuno di d cifre, occorrono d passaggi per ordinare completamente il vettore. Quindi, in un array contenente n numeri interi composti ognuno di d cifre, occorrono d passaggi per ordinare completamente il vettore.

44 Tempo impiegato da Radix Sort IL TEMPO E LINEARE. Il limite superiore e inferiore si equivalgono. n Tempo 2 ( d x n )

45 Test Radix Sort

46 Scopo del test, verificare e dimostrare 2 ipotesi, la prima: Scopo del test, verificare e dimostrare 2 ipotesi, la prima: dato che questo algoritmo di ordinamento é basato sulla distribuzione e usa metodi, per ordinare l'insieme dei dati, non basati sul confronto e lo scambio, l'ordine dei numeri in input non dovrebbe influire sulle prestazioni dell'algoritmo;

47 Lordine dei numeri non influisce sul tempo CASUALE DECRESCENTE CRESCENTE Quantità numeri 4500 2500 500 100015003000 4000 3500 2000 5000 Inf. Ordine dei numeri time Lordine dei numeri non influisce sulle prestazioni dellalgoritmo.

48 Test Radix Sort Seconda ipotesi da dimostrare: Seconda ipotesi da dimostrare: il tempo necessario all'ordinamento cresca in modo lineare al crescere di n, dove n rappresenta la quantità dei numeri da ordinare.

49 Verifica della linearità CASUALE DECRESCENTE CRESCENTE Quantità numeri 4500 2500 500 100015003000 4000 3500 2000 5000 Inf. Ordine dei numeri time Il tempo cresce in modo lineare, allaumentare della dimensione n dei dati in ingresso.

50 Passiamo allo studio dellultimo algoritmo di ordinamento, cioè Bucket Sort

51 Bucket Sort IDEA DI BASE (1) IDEA DI BASE (1) L'idea generale di Bucket Sort é quella di dividere un intervallo prefissato in n sotto intervalli di uguale dimensione, detti bucket (cestini), e quindi distribuire gli n elementi da ordinare nei rispettivi bucket.

52 Esempio: ordine delle carte da ramino Cuori fiori picche quadri 5 Il bucket cuori conterrà le carte di cuori Il bucket quadri conterrà le carte di quadri Il bucket fiori conterrà le carte di fiori 8 8 5 7 5 Il bucket picche conterrà le carte di picche

53 Bucket Sort IDEA DI BASE IDEA DI BASE L'idea generale di Bucket Sort é quella di dividere un intervallo prefissato in n sotto intervalli di uguale dimensione, detti bucket (cestini), e quindi distribuire gli n elementi da ordinare nei rispettivi bucket. Sotto l'assunzione che gli elementi dell'input siano uniformemente distribuiti nell'intervallo specificato, non ci si aspetta che molti numeri cadano nello stesso bucket. Per produrre l'output, si ordinano semplicemente i numeri di ogni bucket, con un algoritmo di ordinamento e quindi, si elencano gli elementi di ogni bucket prendendoli in ordine.

54 Bucket Sort Cioè: 1) For X = 1 to N (N= quantità numeri in input) trova in quale bucket va inserito lelemento array[x] e inseriscicelo trova in quale bucket va inserito lelemento array[x] e inseriscicelo 2) For X = 1 to numero bucket ordina il bucket [X] con un algoritmo di ordinamento ordina il bucket [X] con un algoritmo di ordinamento 3) Concatena insieme i bucket [1]…bucket [2]… ……bucket [numero dei bucket] ……bucket [numero dei bucket]

55 Bucket Sort Risorse hardware occorrenti: Risorse hardware occorrenti: Il codice richiede un array, liste [ bucket ], di liste a doppio concatenamento, dove ogni elemento di liste [ bucket ] rappresenta un bucket. Proprietà: Proprietà: BucketSort assume che l'input sia generato da un processo casuale che distribuisce gli elementi in modo uniforme sull'intervallo designato.

56 Bucket Sort: esempio s Esecuzione di Bucket Sort su un array di input A [ 8 ], dove ogni elemento di A é un double positivo. Supponiamo di dividere l'intervallo [0…1], in 10 sotto intervalli di uguale dimensione, e quindi distribuire gli n elementi da ordinare nei bucket. A 0.780.170.350.260.720.940.210.12 Situazione iniziale

57 Prima operazione: distribuire I numeri Bucket 0 A 0.78 0.17 0.35 0.26 0.72 0.94 0.21 0.12 Bucket 1 0.12 0.17 Bucket 2 0.26 0.21 Bucket 3 0.35 Bucket 4 Bucket 5 Bucket 6 Bucket 7 0.78 0.72 Bucket 9 0.94

58 Bucket Sort Secondo passaggio La seconda operazione che deve eseguire Bucket Sort é quella di ordinare i numeri di ogni bucket, con un algoritmo di ordinamento adatto, in questo caso, visto che l'insieme numerico in input é composto da tipi double, si può utilizzare lalgoritmo di ordinamento Insert Sort.

59 Ordinare I numeri 0.17 0.26 0.78 0.12 0.21 Bucket 0 Bucket 1 Bucket 2 Bucket 3 Bucket 4 Bucket 5 Bucket 6 Bucket 7 Bucket 8 Bucket 9 0.94 0.72 0.35

60 Risultato dellordinamento in ogni bucket Bucket 0 Bucket 1 0.12 0.17 Bucket 2 0.21 0.26 Bucket 3 0.35 Bucket 4 Bucket 5 Bucket 6 Bucket 7 0.72 0.78 Bucket 9 0.94

61 Secondo passaggio: ordinare ogni Bucket con un algoritmo di ordinamento basato sul confronto 0.12 0.21 0.72 0.17 0.26 Bucket 0 Bucket 1 Bucket 2 Bucket 3 Bucket 4 Bucket 5 Bucket 6 Bucket 7 Bucket 8 Bucket 9 0.94 0.78 0.35

62 Bucket Sort: terzo passaggio La terza ed ultima operazione da eseguire, é quella di concatenare insieme le liste (bucket) liste[0], liste[1],..., liste[n-1] in quest'ordine copiando gli elementi nell'array originale ordinati[ ], ottenendo il seguente risultato: Array ordinato B 0.120.170.210.260.350.720.780.94

63 Seconda operazione: ordinare I numeri in ogni bucket Bucket 1 0.12 0.17 Bucket 2 0.21 0.26 Bucket 3 0.35 Bucket 7 0.72 0.78 Bucket 9 0.94 B 0.120.170.210.260.350.720.780.94

64 Test Bucket Sort

65 Precisazioni Per non uscire dallargomento della relazione, cioè, gli algoritmi non basati sul confronto e lo scambio, e per sperimentare il comportamento di Bucket Sort con un algoritmo di ordinamento non basato sul confronto, ho deciso di usare come algoritmo di ordinamento intermedio, Radix Sort. Il range dei numeri in input è [0…(2^31)-1] Questo intervallo è stato diviso in 214.748 bucket

66 Verificare e dimostrare che: dato che questo algoritmo di ordinamento é basato sulla distribuzione e usa metodi, per ordinare l'insieme dei dati, non basati sul confronto e lo scambio, l'ordine dei numeri in input non dovrebbe influire sulle prestazioni dell'algoritmo;

67 Lordine dei numeri non influisce sul tempo CASUALE DECRESCENTE CRESCENTE Quantità numeri 4500 2500 500 100015003000 4000 3500 2000 5000 Inf. Ordine dei numeri time Lordine dei numeri non influisce sulle prestazioni dellalgoritmo.

68 Era ovvio!!! Se l'algoritmo usato per l'ordinamento intermedio non è influenzato dallordine dei numeri in input, é ovvio che anche Bucket Sort non ne viene influenzato semplicemente perché questo algoritmo, non fa altro che ordinare ogni bucket con lalgoritmo di ordinamento intermedio Radix Sort.

69 Verificare e dimostrare che: il tempo necessario all'ordinamento cresca in modo lineare al crescere di n, dove n rappresenta la quantità dei numeri da ordinare.

70 IL TEMPO E LINEARE CASUALE DECRESCENTE CRESCENTE Quantità numeri 4500 2500 500 100015003000 4000 3500 2000 5000 Inf. Ordine dei numeri time Il tempo cresce in modo lineare, allaumentare della dimensione n dei dati in ingresso.

71 LOGICO! Il risultato era quello che ci si aspettava, infatti Bucket Sort non fa altro che ordinare i numeri presenti in ogni bucket, usando l'algoritmo Radix Sort che ha un tempo di ordinamento lineare. Da notare, il notevole incremento temporale rispetto a Radix Sort, causato dalla gestione delle liste che rappresentano i bucket.

72 Differenza con Radix Sort

73 Secondo Test Bucket Sort

74 Premessa Si consideri il comportamento di un qualsiasi algoritmo di ordinamento basato sul confronto. Il tempo impiegato da questo algoritmo dipende pesantemente dall'ordine con cui i numeri sono memorizzati nei cestini e dalla quantità numerica presente in ognuno di essi. Si consideri il comportamento di un qualsiasi algoritmo di ordinamento basato sul confronto. Il tempo impiegato da questo algoritmo dipende pesantemente dall'ordine con cui i numeri sono memorizzati nei cestini e dalla quantità numerica presente in ognuno di essi. Nel caso peggiore (ordine inverso), assumendo che ci siano n elementi nel bucket dobbiamo scorrere n-1 elementi. Per ogni elemento occorre esaminare e spostare altri n-1 elementi, per cui risulta una complessità O(n^2), cioè il tempo non cresce in modo lineare ma esponenziale. Nel caso peggiore (ordine inverso), assumendo che ci siano n elementi nel bucket dobbiamo scorrere n-1 elementi. Per ogni elemento occorre esaminare e spostare altri n-1 elementi, per cui risulta una complessità O(n^2), cioè il tempo non cresce in modo lineare ma esponenziale. Con una tale complessità, é conveniente che la presenza numerica in ogni cestino sia la più bassa possibile quindi maggiore è Con una tale complessità, é conveniente che la presenza numerica in ogni cestino sia la più bassa possibile quindi maggiore è Il numero dei cestini minore sarà la presenza numerica in ognuno di essi e di conseguenza minore sarà il tempo di calcolo. Questo è lo scopo della distribuzione di Bucket Sort

75 Insert Sort casuali

76 SCOPERTA Visto che Radix Sort ha un tempo lineare la distribuzione diventa assurda perché non ci interessa più che la distribuzione numerica in ogni cestino sia la più bassa possibile Il tempo è e resterà sempre lineare. La conseguenza di questa affermazione é che Bucket Sort, in questo caso, deve essere implementato con 1 solo cestino. A questo punto é solo una perdita di tempo sistemare i numeri nel cestino per poi ordinarli con Radix Sort, é più intelligente farli ordinare direttamente da Radix Sort.

77 Verificare e dimostrare che: implementare l'algoritmo Bucket Sort usando per l'ordinamento intermedio un algoritmo non basato sul confronto è assurdo. Nessun testo analizzato, contiene spiegazioni riguardo alla fondamentale importanza di usare per lordinamento intermedio un algoritmo basato sul confronto e al contrario, dellassurdità di usarne uno non basato sul confronto Lesperimento consiste nellordinare le stesse quantità numeriche, prima utilizzando un solo bucket e poi utilizzandoli tutti, osservando se il tempo è lo stesso.

78 Invece usando Radix Sort Quantità numeri 4500 2500 500 100015003000 4000 3500 2000 5000 Inf. time Il notevole incremento temporale è causato dalla gestione delle liste( bucket).

79 Il tempo è sprecato in questa fase Bucket 0 Bucket 1 0.12 0.17 Bucket 2 0.21 0.26 Bucket 3 0.35 Bucket 4 Bucket 5 Bucket 6 Bucket 7 0.72 0.78 Bucket 9 0.94

80 Analisi teorica Escludendo il tempo utilizzato nella gestione delle liste e nella distribuzione degli n numeri nei cestini, le prestazioni devono essere equivalenti sia nel caso che si utilizzi 1 solo cestino, sia che si utilizzino tutti i cestini. Lipotesi è dimostrata.

81 Importante Note: Note: Questo non significa che Bucket Sort è inutile, infatti é nato per ordinare sequenze numeriche in virgola mobile. Usando questo tipo di dati, non é possibile implementare per l'ordinamento intermedio, algoritmi come Counting Sort o Radix Sort, ma diventa necessario rivolgersi ad algoritmi che basano il loro funzionamento sul confronto e lo scambio. Infatti, implementando Bucket Sort con un algoritmo di questo tipo, il numero dei cestini influisce in maniera determinante sul tempo di calcolo perché maggiore é il numero dei cestini, minore sarà la distribuzione numerica in ognuno di essi e di conseguenza, minore sarà il tempo di calcolo.

82 Test Bucket Sort A titolo di curiosità si osservi il prossimo grafico, che presenta Bucket Sort implementato con l'algoritmo di ordinamento intermedio Insert Sort. Per l'ordinamento di un insieme di numeri fino a circa 1 milione i tempi sono molto vicini allo zero, ma superando il milione di elementi il tempo di calcolo esplode. Infatti, quando la quantità di numeri é relativamente bassa, la distribuzione numerica in ogni cestino é di conseguenza molto bassa e Insert Sort deve eseguire un numero bassissimo di confronti e scambi. A titolo di curiosità si osservi il prossimo grafico, che presenta Bucket Sort implementato con l'algoritmo di ordinamento intermedio Insert Sort. Per l'ordinamento di un insieme di numeri fino a circa 1 milione i tempi sono molto vicini allo zero, ma superando il milione di elementi il tempo di calcolo esplode. Infatti, quando la quantità di numeri é relativamente bassa, la distribuzione numerica in ogni cestino é di conseguenza molto bassa e Insert Sort deve eseguire un numero bassissimo di confronti e scambi. Quando la quantità di numeri presenti in ogni cestino comincia ad aumentare notevolmente, il tempo occorrente all'ordinamento cresce in modo esponenziale. Quando la quantità di numeri presenti in ogni cestino comincia ad aumentare notevolmente, il tempo occorrente all'ordinamento cresce in modo esponenziale.

83 Grafico

84 I numeri casuali Il prossimo test viene effettuato per dimostrare che le sequenze numeriche create dal generatore di numeri casuali, siano effettivamente…..casuali. (forse!!!)

85 Numeri casuali Scopo del test, verificare e dimostrare che: Scopo del test, verificare e dimostrare che: Il primo esperimento, é stato eseguito per verificare che il generatore di numeri casuali crei un insieme di numeri interi, effettivamente distribuiti nell'intervallo [0..2 ^(31-1)] Il generatore crea 20.000.000 di numeri e li riversa nei 214.748 bucket che utilizza lalgoritmo BucketSort; viene contata la quantità di numeri presente in ogni cestino. l'operazione viene ripetuta altre 2 volte. viene calcolata la media in ogni cestino, riportata sul grafico. Se il generatore di numeri casuali, crea numeri interi uniformemente distribuiti nell'intervallo prefissato, nei cestini dovremmo trovare quantità piu o meno uguali di numeri.

86 Grafico

87 Bucket SortInsert sortQuick Sort Un algoritmo "efficiente" deve svolgere il suo compito in un tempo accettabile utilizzando le risorse a disposizione senza sprechi. Radix Sort Counting Sort Quindi uso intelligente delle risorse Conclusioni

88 Architetture e algoritmi Intel 286 Radix Sort Insert Sort Algoritmi ideati per risolvere lo stesso problema, spesso differiscono vistosamente per quanto riguarda la loro efficienza e queste differenze possono essere più significative della differenza tra un calcolatore molto lento e un supercomputer. Algoritmi ideati per risolvere lo stesso problema, spesso differiscono vistosamente per quanto riguarda la loro efficienza e queste differenze possono essere più significative della differenza tra un calcolatore molto lento e un supercomputer. Infatti, se proviamo ad ordinare 10.000.000 di numeri ordinati in modo decrescente, con Radix Sort, su un computer dotato di processore intel 286, otterremo un tempo di ordinamento estremamente basso, rispetto ad un ordinamento della stessa sequenza numerica, effettuato sul computer dellInterprise, usando Insert Sort. Infatti, se proviamo ad ordinare 10.000.000 di numeri ordinati in modo decrescente, con Radix Sort, su un computer dotato di processore intel 286, otterremo un tempo di ordinamento estremamente basso, rispetto ad un ordinamento della stessa sequenza numerica, effettuato sul computer dellInterprise, usando Insert Sort. Galaxy 10086 Questo non significa che Insert Sort, è un algoritmo di scarsa utilità. Infatti con questo algoritmo si possono ordinare i numeri in virgola mobile, cosa non possibile con gli algoritmi analizzati in questa relazione. Ogni algoritmo ha il suo campo di applicazione

89 Algoritmi efficienti e hardware veloce L'esempio precedente vuole dimostrare che: progettare algoritmi efficienti é importante quanto progettare sistemi hardware sempre più veloci; usare algoritmi specifici in base al problema da risolvere significa usare in modo intelligente le risorse e abbassare notevolmente i tempi di calcolo. Sono due tessere dello stesso mosaico Efficienza Miglior efficienza

90 The Best Quale algoritmo di ordinamento si é dimostrato il più efficiente in termini di utilizzo: delle risorse ? …e del tempo ?

91 Sono tutti ottimi Tutti gli algoritmi analizzati in questa ricerca sono degli ottimi "algoritmi di ordinamento", progettati in modo intelligente. Ognuno di questi è ottimo se usato in modo specifico. Bucket Sort Radix Sort Counting Sort Radix Sort Counting Sort Bucket Sort

92 Uso Intelligente degli algoritmi Counting Sort La scelta dellalgoritmo dipende dal lavoro che si deve eseguire. Sono il più veloce, ma la mia limitazione di range mi penalizza pesantemente, quindi usatemi quando dovete ordinare numeri appartenenti ad un intervallo limitato, per es 0…2^10 Sono un po meno veloce di Counting Sort ma lavoro in qualsiasi Range Radix Sort IDEA: Avere a disposizione unampia varietà di algoritmi da usare in modo appropriato a seconda del problema da risolvere Io devo lavorare solo con elementi in virgola mobile Bucket Sort

93 THEEND


Scaricare ppt "Gli algoritmi di ordinamento non basati sul confronto Zotti Paolo 62SI December 2001"

Presentazioni simili


Annunci Google