La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)

Presentazioni simili


Presentazione sul tema: "QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)"— Transcript della presentazione:

1 QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)

2 Algoritmo QuickSort E un algoritmo di ordinamento sul posto La sua complessità è O(n 2 ) nel caso peggiore O(n log n) nel caso medio Nonostante le cattive prestazioni nel caso peggiore, QuickSort è il miglior algoritmo di ordinamento in media

3 Struttura di QuickSort È un algoritmo ricorsivo basato sul Divide et Impera: Divide: si partiziona il vettore A[s…d] (spostando elementi) in due sottovettori A[s…q-1] e A[q+1…d], separati da un elemento pivot A[q] Impera: si ordinano ricorsivamente i due sottovettori A[s…q] e A[q+1…d] con QuickSort Combina: si concatenano banalmente i sottovettori (sono già reciprocamente ordinati!) ogni elemento di A[s…q-1] è A[q] ogni elemento di A[q+1…d] è > A[q]

4 Pseudocodice di QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q+1,d) Indice mediano q è lindice che divide il vettore A in due in modo che gli elementi con indice q siano minori o uguali a quelli con indice > q

5 Pseudocodice di QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) Ordinamento dei due sottoarray Poiché il primo sottovettore ha elementi tutti minori o uguali a quelli del secondo sottovettore, basta ordinare separatamente i due sottovettori per risolvere lintero problema

6 Pseudocodice di QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) passo Divide Partiziona è la chiave dellalgoritmo !

7 Partiziona Si partiziona il vettore A[s…d] in due sottovettori A[s…q-1] e A[q+1…d] tali che ogni elemento di A[s…q-1] sia A[q] e ogni elemento di A[q+1…d] sia > A[q] - si sceglie un elemento del vettore, detto pivot (perno), che farà da spartiacque - si spostano gli elementi maggiori del pivot verso destra e gli elementi minori verso sinistra Lindice mediano q dipende dallelemento pivot: è il numero di elementi minori o uguali al pivot

8 Partiziona Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i+1 Chiaro? Mah… Discutiamolo in termini di invarianti di ciclo!

9 Partiziona: invariante di ciclo Partiziona mantiene questo invariante di ciclo: A[d] = x: lelemento pivot x è in posizione terminale il vettore A contiene un sottovettore A[s…i] i cui elementi sono tutti x un sottovettore A[i+1…j-1] i cui elementi sono tutti > x Gli stati ammissibili sono quelli in cui vale linvariante La distanza dallo stato finale è misurata da j Linvariante si impone con i = s-1 e j = s (sottovettori vuoti)

10 Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i+1 Partiziona Stabilire linvariante - Lelemento pivot è in fondo al vettore - I due sottovettori sono vuoti

11 Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i+1 Partiziona La misura di distanza è il numero di elementi esterni ai due sottovettori: cala ad ogni passo Misurare i progressi

12 Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i+1 Partiziona Ogni passo aggiunge un nuovo elemento in fondo Se esso è destinato al primo sottovettore, va scambiato Mantenere linvariante

13 Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i+1 Partiziona Al termine, lelemento pivot deve trovarsi fra i due sottovettori Condizioni di uscita

14 Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i+1 Esempio : partiziona(A,1,12) ij x A[s…i] = [] A[i+1…j-1] = []

15 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij x A[s…i] = [20] A[i+1…j-1] = []

16 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij x A[s…i] = [20 14] A[i+1…j-1] = []

17 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij x A[s…i] = [20 14] A[i+1…j-1] = [28]

18 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij x A[s…i] = [20 14] A[i+1…j-1] = [28 34]

19 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij A[s…i] = [ ] A[i+1…j-1] = [34 28] x

20 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij A[s…i] = [ ] A[i+1…j-1] = [ ] x

21 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij A[s…i] = [ ] A[i+1…j-1] = [ ] x

22 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij A[s…i] = [ ] A[i+1…j-1] = [ ] x

23 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij A[s…i] = [ ] A[i+1…j-1] = [ ] x

24 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij A[s…i] = [ ] A[i+1…j-1] = [ ] x

25 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij A[s…i] = [ ] A[i+1…j-1] = [ ] x

26 Esempio : partiziona(A,1,12) Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij A[s…i] = [ ] A[i+1…j-1] = [ ] x

27 Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i+1 Partiziona: un caso limite ij x Se un solo elemento è pivot,...

28 Partiziona: un caso limite Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij Se un solo elemento è pivot, il THEN non viene mai eseguito x

29 Partiziona: un caso limite Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i ij Se un solo elemento è pivot, la dimensione del sottovettore sinistro è 1, quella del sottovettore destro è n-1 x

30 Partiziona(A,s,d) x = A[d] i = s - 1 j = s WHILE j < d DO IF A[j] x THEN i=i+1 scambia A[i] con A[j] j = j+1 scambia A[i+1] con A[d] RETURN i+1 Partiziona: analisi di complessità

31 QuickSort: un esempio sd Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q) Quick-Sort(A,q + 1,d)

32 QuickSort: un esempio sd q Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)

33 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

34 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

35 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

36 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

37 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

38 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

39 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

40 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

41 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

42 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

43 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

44 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

45 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

46 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

47 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

48 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

49 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

50 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

51 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

52 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q) Quick-Sort(A,q + 1,d) sd

53 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q) Quick-Sort(A,q + 1,d) sd q

54 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q) Quick-Sort(A,q + 1,d) sd

55 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

56 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

57 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

58 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

59 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

60 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

61 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

62 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

63 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

64 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

65 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

66 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

67 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

68 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

69 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

70 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd q

71 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) sd

72 QuickSort: un esempio Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) Il vettore A ora è ordinato!

73 QuickSort: analisi di complessità Il tempo di esecuzione di QuickSort dipende dal bilanciamento fra i sottovettori costruiti da Partiziona Il caso migliore si verifica quando i sottovettori sono perfettamente bilanciati, entrambi di dimensione n/2 Il caso peggiore si verifica quando un sottovettore è sempre di dimensione 1 (laltro è quindi di dimensione n - 1)

74 QuickSort: caso migliore Se i sottovettori sono di uguale dimensione: T(n) = 2T(n/2) + (n) per il caso 2 del teorema principale: T(n) = (n log n) Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) Quando si verifica il caso migliore?

75 QuickSort: caso peggiore Il sottovettore sinistro ha dimensione 1, quello destro dimensione n - 1: T(n) = T(1) + T(n - 1) + (n) Poiché T(1) = 1 otteniamo T(n) = T(n - 1) + (n) Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d) Quando si verifica il caso peggiore?

76 QuickSort: caso peggiore q s d Pivot = 12 q s d Pivot = 11 q s d Pivot = …

77 QuickSort: caso peggiore Lequazione di ricorrenza può essere risolta facilmente col metodo iterativo T(n) = T(n - 1) + (n) = = (n 2 )

78 QuickSort: caso medio? La complessità di QuickSort nel caso medio è molto vicina a quella del caso migliore Per averne unintuitizione, supponiamo che ad ogni passo Partiziona dia due sottovettori molto sbilanciati, ma con un rapporto fisso n 1 = 99/100 nn 2 = n/100 Allora T(n) = T(99n/100) + T(n/100) + (n) = (n log n) (basta applicare il metodo iterativo…)

79 QuickSort: caso medio? La stessa cosa vale per qualsiasi rapporto fisso fra le dimensioni dei sottovettori Se n 1 = (1- ) n e n 2 = n, allora T(n) = (n log n) Ma non si può garantire un comportamento così regolare! Occorre invece unipotesi sulla distribuzione di probabilità delle diverse istanze, ad esempio che ogni permutazione sia equiprobabile Per ogni istanza, la partizione sarà buona in alcuni livelli, cattiva in altri

80 QuickSort: caso medio? Facciamo unaltra ipotesi intuitiva: Partiziona genera una suddivisione cattiva e una buona, alternate n 1 n-1 (n-1)/2 n = (n) (1) (n-1) ((n-1)/2) T(n) = (n) + (1) + (n-1) + 2T((n-1)/2)

81 QuickSort: caso medio? Facciamo unaltra ipotesi intuitiva: Partiziona genera una suddivisione cattiva e una buona, alternate n 1 (n-1)/2 n = (n) + (n-1) (1) ((n-1)/2) T(n) = (n) + (1) + (n-1) + 2T((n-1)/2) E la stessa complessità di una partizione bilanciata! Ma non si può garantire un comportamento così regolare!

82 QuickSort: caso medio? Per ottenere un comportamento del tutto casuale, si sceglie un elemento pivot casuale anziché lultimo del vettore A RandomPartiziona(A,s,d) p = random(s,d) scambia A[p] e A[d] Partiziona(A,s,d) Questo rende improbabile che la partizione sia sempre sbilanciata, anche per le istanze quasi ordinate

83 QuickSort randomizzata: analisi Consideriamo tutto lalbero delle chiamate di QuickSort Ogni chiamata comporta alcune operazioni O(1) una chiamata a Partiziona, che a sua volta comporta – altre operazioni O(1) – un ciclo di confronti fra gli elementi del sottovettore e il pivot; Ogni chiamata ha un pivot diverso: avvengono al più n chiamate La complessità è O(n) + la complessità dei cicli di confronti

84 QuickSort randomizzata: analisi Quanti confronti fra A[j] e x avvengono? Sia a i li-esimo numero in ordine crescente e p ij la probabilità complessiva che durante lalgoritmo si confrontino a i e a j Inizialmente, a i e a j fanno parte del vettore corrente. Se in qualsiasi momento viene scelto come pivot un elemento intermedio, a i e a j finiscono in sottovettori diversi e non verranno mai confrontati Se viene scelto come pivot uno dei due, a i e a j vengono confrontati esattamente una volta

85 QuickSort randomizzata: analisi Quindi ogni confronto è diverso, perché cambia uno dei due elementi Il numero di confronti totale è in media i

86 QuickSort randomizzata: analisi i


Scaricare ppt "QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)"

Presentazioni simili


Annunci Google