• Non ci sono risultati.

Ordinamento

N/A
N/A
Protected

Academic year: 2021

Condividi "Ordinamento"

Copied!
74
0
0

Testo completo

(1)

Dati e Algoritmi 1: A. Pietracaprina

Ordinamento

(2)

Introduzione

L’ordinamento di dati `

e una

primitiva fondamentale

utilizzata

praticamente ovunque, in applicazioni scientifiche e

commerciali.

La sua importanza ha motivato un’intensa attivit`

a di ricerca

per pi`

u di mezzo secolo che ne ha studiato a fondo gli aspetti

computazionali sviluppando un gran numero di soluzioni

algoritmiche efficienti in contesti generali e non.

Noi vedremo:

1 Algoritmi basati su confronti: MergeSort,QuickSort(design pattern divide-and-conquer),InsertionSort, e un lower bound che si applica a qualsiasi algoritmo basato su confronti.

2 Algoritmi non-basati su confronti: BucketSort,RadixSort.

(3)

Ordinamento

basato su confronti

(4)

Specifica Input-Output

Input: sequenza

S = S [0]S [1] . . . S [n − 1]

di

n ≥ 0 chiavi

da

un universo ordinato

Output: sequenza

S

ordinata in senso crescente

Definizione

Algoritmo di ordinamento basato su confronti (comparison-based):

Per ogni istanza di input

S

l’ordinamento delle chiavi `

e determinato

ESCLUSIVAMENTE da confronti tra coppie di chiavi

S [i ]

e

S [j ]

.

N.B.: RappresentiamoS come array, assumendo di avere accesso diretto a ciascunS [i ]. Gli algoritmi che presenteremo possono anche essere implementati su liste, ma risulterebbero meno efficienti in pratica.

(5)

Design Pattern: Divide-and-conquer

Un algoritmo divide-and-conquer per un problema computazionaleΠ`e un algoritmo ricorsivo che risolve ogni istanzai diΠdi taglianin3 fasi:

1 Divide:

• Sen ≤ n0⇒risolvii direttamente (CASO BASE)

• Sen > n0⇒suddividii in 2 o pi`u istanze diΠ,i1, i2, . . ., ciascuna taglia< n

2 Recur: Risolvi ricorsivamente ciascuna istanzaij, conj ≥ 1

3 Conquer: Determina la soluzione dii combinando opportunamente le soluzioni delle istanze ij, conj ≥ 1.

Nota: La locuzione divide-and-conquer (o divide-et-impera in latino) fa riferimeno alla tecnica politica di frammentare l’opposizione per tenerla sotto controllo. L’uso della locuzione pare risalire a Filippo il Macedone (382-336 a.C.).

(6)

MergeSort

Strategia Divide-and-Conquer: caso base

n

0

= 1

1

Divide:

• S1←sottosequenza con la prima met`a di S

• S2←sottosequenza con la seconda met`a di S

2

Recur: ordinamento ricorsivo delle due sottosequenze

• MergeSort(S1)

• MergeSort(S2)

3

Conquer:

S ←

“fusione” di

S1

e

S2

ordinate

(7)

MergeSort

Algoritmo MergeSort(S)

Input: come da specifica generale Output: come da specifica generale ifn ≤ 1 then returnS;

/* Divide */

S1, S2←sequenze vuote;

fori ← 0todn/2e − 1do S1[i ] ← S [i ];

fori ← dn/2e ton − 1do S2[i − dn/2e] ← S [i ];

/* Recur */ MergeSort(S1); MergeSort(S2); /* Conquer */ Merge(S1,S2,S); returnS;

Osservazione: Merge(S1,S2,S) fondeS1eS2in un’unica sequenza ordinataS che usa lo stesso spazio dalla sequenza di input, dato che le chiavi sono state copiate inS1eS2.

(8)

Esempio ([GTG14, Figura 13.1])

Albero della ricorsione per una sequenza din = 8 chiavi: (a) input delle invocazioni riscorsive; (b) output delle invocazioni ricorsive.

(9)

Merge

Algoritmo Merge(S1,S2,S)

Input: sequenzeS1,S2 ordinate in senso crescente, sequenza vuotaS Output: sequenzaS = S1∪ S2ordinata in senso crescente

i ← 0;j ← 0; k ← 0;

while ((i < S1.size()) and (j < S2.size())) do if S1[i ] ≤ S2[j ]then S [k + +] ← S1[i + +]; elseS [k + +] ← S2[j + +];

while (i < S1.size()) doS [k + +] ← S1[i + +]; while (j < S2.size()) do S [k + +] ← S2[j + +]; Correttezza: esercizio

Osservazione: L’algoritmo funziona correttamente anche seS1eS2 hanno lunghezze diverse.

(10)

Esempio: generica iterazione del I while di Merge

(a):

inizio iterazione

(b):

fine iterazione

(11)

Analisi di Merge

Proposizione

La complessit`a di Merge(S1,S2,S) `eΘ (n), doven`e il numero di chiavi in

S1pi`u il numero di chiavi in S2.

(12)
(13)

Analisi di MergeSort

Utilizziamo l’albero della ricorsione

Distinguiamo

2 casi

Caso 1: n = 2d per un qualche interod ≥ 0.

Caso 2: 2d < n < 2d +1, per un qualche interod ≥ 0.

(14)

Analisi di MergeSort. Caso 1:

n = 2

d

Generalizzando l’esempio del Lucido 8 si vede facilmente che per una qualsiasi istanza di taglianl’albero della ricorsione ha la seguente struttura:

(15)

Analisi di MergeSort. Caso 1:

n = 2

d

(16)
(17)

Analisi di MergeSort. Caso 2:

2

d

< n < 2

d +1

Esempio: albero della ricorsione di MergeSort relativo a un’istanza

di taglia

n = 23

(per ogni istanza `

e indicata la taglia).

(18)

Analisi di MergeSort. Caso 2:

2

d

< n < 2

d +1

Esercizio

Si consideri l’esecuzione di MergeSort su un’istanza di taglia

2d < n < 2d +1, per un qualche interod ≥ 0. Dimostrare che:

1 Per0 ≤ i ≤ d, il livelloi dell’albero della ricorsione ha2i nodi

corrispondenti a invocazioni dell’algoritmo su istanze con taglia in

[2d/2i, 2d +1/2i]. (Suggerimento: induzione sui)

2 Il livellod + 1hax ≤ nnodi corrispondenti a invocazioni dell’algoritmo su istanze di taglia 1.

(19)

Analisi di MergeSort: conclusione

Proposizione

La complessit`a di MergeSort(S) `eΘ (n log n), doven ≥ 1`e il numero di chiavi inS.

(20)

Esercizio

Siak = 2d, per un qualche interod > 0, e sianoS1, S2, . . . , Sk sequenze ordinate di tagliamciascuna. Si vuole progettare un algoritmo efficiente per fondere le sequenze in un’unica sequenza ordinata di taglian = k · m.

1 Analizzare la complessit`a dell’algoritmo banale che fondeS1conS2, poiS1∪ S2conS3, poiS1∪ S2∪ S3conS4ecc.

2 Progettare e analizzare un algoritmo pi`u efficiente di quello banale.

(21)
(22)
(23)
(24)

Esercizio

Siano

S

1

= S

1

[0]S

1

[1] . . . S

1

[n

1

− 1]

e

S

2

= S

2

[0]S

2

[1] . . . S

2

[n

2

− 1]

due sequenze ordinate di chiavi intere. In ogni sequenza le chiavi

sono distinte, ma una stessa chiave pu`

o comparire sia in

S

1

che in

S

2

. Progettare una modifica dell’algoritmo Merge che restituisca il

numero di chiavi in

S1

∩ S

2

. L’algoritmo deve usare spazio

aggiuntivo costante oltre alle due sequenze di input.

Esercizio C-13.42 [GTG14]

Sia

S

una sequenza di

n

elementi sui quali `

e definito un ordine

totale. Si ricordi che una inversione in

S

`

e una coppia di elementi

S [i ], S [j ]

tali che

j < i

ma

S [j ] > S [i ]

. Descrivere un algoritmo che

determina il numero di inversioni in

S

in tempo

O (n log n)

.

(Suggerimento: adattare MergeSort.)

(25)

QuickSort

Strategia Divide-and-Conquer: caso base

n

0

= 1

1

Divide:

p ← S [n − 1]

(pivot)

L

← {chiavi < p in S}

E

← {chiavi = p in S}

G

← {chiavi > p in S}

2

Recur: ordinamento ricorsivo delle due sottosequenze

• QuickSort(L)

• QuickSort(G)

3

Conquer:

S ← L ◦ E ◦ G

, dove

◦ =

“concatenazione”.

(26)

Implementazione in-place di QuickSort

Algoritmo QuickSortInPlace(S , a, b)

Input: sequenzaS di nchiavi, indici0 ≤ a, b < n

Output: sequenzaS ordinata in senso crescente tra S [a]eS [b]

ifa ≥ b then returnS; /* Divide */ ` ←Partition(S , a, b); /* Recur */ QuickSortInPlace(S , a, ` − 1); QuickSortInPlace(S , ` + 1, b); /* Conquer */ returnS; Si osservi che:

• Partition(S , a, b) riorganizza le chiavi inS [a ÷ b]intorno a un pivotp, separando quelle≤ p da quelle≥ p, e restituendo la posizione finale`del pivot.

• QuickSortInPlace(S , 0, n − 1) ordina tutta la sequenza.

(27)

Partition

Algoritmo Partition(S , a, b)

Input: sequenzaS di nchiavi, indici0 ≤ a < b < n

Output: sequenzaS riorganizzata tra aeb, e indice` ∈ [a, b]tale cheS [i ] ≤ S [`] ≤ S [j ]per ognii , j cona ≤ i ≤ ` ≤ j ≤ b p ← S [b]; /* Scelta del pivot */

` ← a;r ← b − 1; while (` ≤ r) do while ((` ≤ r) AND (S [`] ≤ p)) do` ← ` + 1; while ((` ≤ r) AND (S [r ] ≥ p)) dor ← r − 1; if (` < r) then swap(S [`], S [r ]); swap(S [`], S [b]); return` 27

(28)

Esempio (Partition)

` = a

r

b

85

24

63

45

17

31

96

50

`

r

85

24

63

45

17

31

96

50

`

r

31

24

63

45

17

85

96

50

`

r

31

24

63

45

17

85

96

50

`

r

31

24

17

45

63

85

96

50

r

`

31

24

17

45

63

85

96

50

r

`

31

24

17

45

50

85

96

63

28

(29)

Correttezza di QuickSortInPlace

(30)
(31)

Complessit`

a di Partition

Proposizione

La complessit`

a di Partition

(S , a, b)

`

e

Θ (b − a + 1)

, ovvero

lineare nel numero di chiavi presenti tra gli indici

a

e

b

.

(32)
(33)

Complessit`

a di QuickSortInPlace: esempio

Albero della ricorsione per l’esecuzione di QuickSortInPlace

su

S = 1, 4, 2, 3, 9, 8, 7, 5, 10, 6

.

(34)

Complessit`

a di QuickSortInPlace: esempio

Albero della ricorsione per l’esecuzione di QuickSortInPlace

su

S = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

.

(35)

Complessit`

a di QuickSortInPlace

Proposizione

La complessit`a di QuickSortInPlace(S , 0, n − 1)`eΘ n2

.

(36)
(37)

Osservazione su QuickSortInPlace

L’algoritmo `

e

in-place

(spazio aggiuntivo costante oltre a quello

per l’input)

se si ignora la gestione della ricorsione

.

In ogni istante durante l’esecuzione dell’algoritmo, sulla STACK

sono memorizzati i

record di attivazione

relativi alle invocazioni

ricorsive aperte e non ancora terminate.

Per ciascuna di tali invocazioni (che possono essere in numero

proporzionale a

n

)

nel record di attivazione sono memorizzati i

valori di a, b, ` ed r

.

(38)

Esercizio

Progettare un algoritmo che ordini una sequenza dinbit

S = S [0]S [1] . . . S [n − 1]in tempoΘ (n). L’algoritmo deve essere in-place e utilizzare un solo ciclo.

(39)
(40)

Randomized QuickSort

Randomized QuickSort

: variante di QuickSortInPlace che

Evita il caso pessimo probabilisticamente

Sostituisce l’istruzione

p ← S [b]

con le seguenti tre istruzioni

i ← intero random in [a, b];

swap(S [i ], S [b]);

p ← S [b]

Osservazione: Per ogni istanza

S

esistono molte esecuzioni

possibili e quindi molti diversi tempi di esecuzione, funzione delle

scelte probabilistiche (scelta del pivot) fatte dall’algoritmo.

(41)

Algoritmi Deterministici vs Algoritmi Probabilistici

Definizione

Un algoritmo si dicedeterministicose per ogni istanza di input esiste una sola possibile esecuzione e quindi una sola sequenza di operazioni eseguite.

Tutti gli algoritmi visti sin’ora (tranne Randomized QuickSort) sono deterministici.

Di un algoritmo deterministicoAsi analizza di solito lacomplessit`a al caso pessimorappresentata da una funzionetA(n)che per ogni ntaglia dell’istanza restituisce il massimo numero di operazioni eseguite daAsu istanze di taglian.

(42)

Algoritmi Deterministici vs Algoritmi Probabilistici

Definizione

Un algoritmo si diceprobabilistico (randomized)se per ogni istanza di input esistono diverse possibili esecuzioni, che dipendono dalle scelte casuali fatte dall’algoritmo, e quindi diverse sequenze di operazioni. SiaAun algoritmo probabilistico che risolve un problema Π, e sia tA,i il numero di operazioni eseguite daAper risolvere l’istanzai diΠ.

• tA,i `e unvariabile aleatoria.

• L’analisi probabilistica diAmira a stimare, per un’arbitraria istanza

i di taglian, la media ditA,i o la probabilit`a chetA,i ∈ O (f (n)), per una qualche funzionef (n).

N.B.: L’obiettivo di un algoritmo probabilistico `e diconfinare il caso pessimo a una frazione trascurabile di esecuzioni per ogni istanza

(43)

Analisi di Randomized QuickSort

Randomized QuickSort `e un algoritmo probabilistico in quanto esistono diverse possibili esecuzioni per ogni istanza, che sono determinate dalle scelte dei pivot.

Siati ,RQS la variabile aleatoria che rappresenta il numero di operazioni eseguite da Randomized QuickSort per risolvere l’istanzai.

Proposizione (senza prova)

Per ogni istanzai di tagliansi ha che

E[ti ,RQS] ∈ Θ (n log n) (complessit`a in media)

Pr(ti ,RQS ∈ O (n log n)) ≥ 1 − 1

n (complessit`a in alta probabilit`a)

La proposizione rende quantitativamente evidente il fatto che, in pratica, la performance di Randomized QuickSort per una qualsiasi istanza di input `e paragonabile a quella di MergeSort e dei miglior algoritmi basati su confronti.

(44)

Esercizio

Svolgere i seguenti punti:

1 Dire per quali istanze QuickSortInPlace esegue fedelmente la strategia L-E-G descritta all’inizio.

2 Dire come si comporta QuickSortInPlace su un’istanza con tutte chiavi uguali.

3 Modificare QuickSortInPlace in modo che implementi fedelmente la strategia L-E-G per tutte le possibili istanze, e dire come si comporta la modifica su un’istanza con tutte chiavi uguali.

Esercizio C-13.48 [GTG14]

Sia dato un insiemeAdi nviti e un insiemeB dindadi. Ogni vite va bene per un solo dado. Progettare e analizzare un algoritmo per trovare tutte le coppie (vite,dado) giuste avendo a disposizione una primitiva che data una viteae un dadob decide in tempo costante sea`e piccola, giusta, o grande perb.

(45)

InsertionSort

Algoritmo InsertionSort(

S

)

Input: sequenza

S

di

n

chiavi

Output: sequenza

S

ordinata in senso crescente

for

i ← 1

to

n − 1

do

curr ← S [i ]

;

j ← i − 1

;

while ((

j ≥ 0

) AND (

S [j ] > curr

)) do

S [j + 1] ← S [j ]

;

j ← j − 1

;

S [j + 1] ← curr

;

return

S

Osservazione: InsertionSort `

e un algoritmo

in-place

(46)

Complessit`

a di InsertionSort

Analisi standard:

Complessit`

a

O n

2



. Nell’iterazione

i

del for il ciclo while

esegue al pi`

u

i

iterazioni di costo

Θ (1)

ciascuna. La

complessit`

a totale risulta quindi essere

O

n−1

X

i =1

i

!

= O n

2

.

Complessit`

a

Ω n

2



. Per l’istanza costituita da chiavi distinte

inizialmente ordinate in senso decrescente si ha che

nell’iterazione

i

del for il ciclo while esegue esattamente

i

iterazioni di costo

Θ (1)

ciascuna.

(47)

Complessit`

a di InsertionSort

Analisi pi`u fine:

Definizione

Data una sequenza dinchiaviS, unainversione`e una coppia di indici

(i , j )con0 ≤ i 6= j < n tale chej < i eS [j ] > S [i ].

Osservazione: SiaK il numero di inversioni in una sequenzaS di n

chiavi. `E immediato vedere che

0 ≤ K ≤n 2 

= n(n − 1)/2.

Goal: analisi della complessit`a di InsertionSort in funzione della taglia e del numero di inversionidella sequenzaS.

(48)

Complessit`

a di InsertionSort

Proposizione

La complessit`a di InsertionSort(S) `eΘ (n + K ), doven`e il numero di chiavi eK il numero di inversioni inS.

Osservazioni:

• L’analisi non contraddice quella standard, dato che si pu`o avere

K = Θ n2

, ma evidenzia il fatto che InsertionSort `e molto efficiente quando la sequenza di input `e quasi ordinata (ovvero, ha poche inversioni)

• L’introduzione diK permette una partizione pi`u fine delle istanze e quindi una pi`u precisa analisi della complessit`a.

(49)

Dimostrazione della Proposizione

(50)

Lower Bound per Algoritmi Basati su Confronti

Teorema

Per istanze di taglian, un algoritmo di ordinamentoAbasato su confronti esegueΩ (n log n)confronti al caso pessimo. Tale lower bound vale anche per il numero di confronti eseguiti in alta probabilit`a o in media nel casoAsia probabilistico.

Dato che MergeSort, HeapSort, (Randomized) QuickSort e InsertionSort sono basati su confronti, dal lower bound consegue che

• MergeSort, HeapSort e Randomized QuickSorthanno complessit`a asintoticamente ottima.

• QuickSort (deterministico) e InsertionSortnon hanno complessit`a asintoticamente ottima ma per InsertionSort si pu`o definire una famiglia abbastanza ampia di istanze per cui esso risulta molto efficiente.

(51)

Prova del teorema (cenni)

(52)

Prova del teorema (cenni)

(53)

Ordinamento

non basato su confronti

(54)

Assumiamo ora che la sequenza

S

da ordinare sia costituita dal

n ≥ 0 entry

e che l’ordinamento debba produrre in putput la

sequenza di entry ordinate per chiave (in senso crescente).

Gli algoritmi non basati su confronti che vedremo sono:

BucketSort

(chiavi in

[0, N − 1]

): crea

N

code (

bucket

)

associate alle chiavi ed esegue

2 scansioni

della sequenza

S

• I scansione: memorizza le entry nei bucket in base al valore della chiave

• II scansione: estrae le entry dai bucket ordinate.

RadixtSort

(chiavi composte da

d

cifre in

[0, N − 1]

): esegue

d

volte BucketSort. `

E una generalizzazione di BucketSort.

(55)

BucketSort

Algoritmo BucketSort(S)

Input: sequenzaS di nentry con chiavi intere in[0, N − 1]

Output: sequenzaS con le entry ordinate per chiave crescente Crea un arrayB diN codeB[0], B[1], . . . , B[N − 1];

fori ← 0ton − 1do

k ← S [i ].getKey();

B[k].enqueue(S [i ]);

i ← 0;

fork ← 0toN − 1do

while !(B[k].isEmpty()) doS [i ++] ← B[k].dequeue(); Correttezza: banale.

Oss.: i bucket sono implementati con politica FIFO(non serve per la correttezza di BucketSort ma servir`a per la correttezza di RadixSort)

(56)

Esempio

S =

(3, A)(7, D)(4, E )(3, K )(3, P)(8, J)(4, H)

.

(57)

Complessit`

a di BucketSort

Proposizione

La complessit`a di BacketSort(S )`eΘ (n + N), doven`e il numero di entry inS e[0, N − 1]`e il range delle chiavi.

(58)
(59)

Ordinamento stabile

Definizione

Un algoritmo di ordinamento per sequenze di entry si dicestabile(stable sorting) se coppie di entry con la stessa chiave mantengono in output lo stesso ordine relativo che avevano in input

Proposizione

BucketSort `e stabile

Dimostrazione

Conseguenza immediata della politica FIFO di accesso ai bucket.

(60)

RadixSort

Generalizzazione di BucketSort (estende il range di linearit`

a)

Molto usato in applicazioni scientifiche

Input:

n

entry con chiavi costituite da

d

cifre in

[0, N − 1]

, da

ordinare lessicograficamente.

N.B.: Le chiavi possono essere visti come interi in

[0, N

d

− 1]

,

rappresentati in base

N

Idea:

d fasi

Ogni fase:

ordinamento stabile

su una cifra diversa

L’ordine in cui vengono scelte le cifre `

e importante!

Qual `

e l’ordine giusto?

(61)

Esempio

(62)
(63)

RadixSort

Algoritmo RadixSort(

S

)

Input: sequenza

S

di

n

entry con chiavi:

(c

d −1

, c

d −2

, . . . , c

1

, c

0

)

, dove

c

i

∈ [0, N − 1], ∀i

Output: sequenza

S

con le entry ordinate lessicograficamente

per chiave

for

i ← 0

to

d − 1

do ordina

S

in modo stabile rispetto a

c

i

;

(64)

Esercizio

SiaS una sequenza di 5 entry con le seguenti chiavi:

513, 116, 273, 506, 018. Far vedere l’ordine in cui compaiono le chiavi dopo ogni iterazione del ciclo for di RadixSort. Sfruttando l’intuizione ottenuta, dire, nel caso generale, che ordinamento sussiste tra le entry alla fine della Iterazionei del for

(65)
(66)

Correttezza di RadixSort

La correttezza di RadixSort pu`

o essere dimostrata tramite il

seguente

invariante che vale alla fine dell’iterazione i ≥ −1 del for

:

le entry di

S

sono ordinate in base ai valori definiti dalle

i + 1

cifre meno significative delle chiavi:

(c

i

, . . . , c

1

, c

0

)

(67)
(68)

Complessit`

a di RadixSort

Supponendo di usare BucketSort per ordinare

S

in ciascuna

iterazione del for, la prova della seguente proposizione risulta

immediata.

Proposizione

La complessit`

a di RadixSort

(S )

`

e

Θ (d (n + N))

, dove

n

`

e il

numero di entry in

S

e le chiavi sono costituite da

d

cifre in

[0, N − 1]

.

Osservazione:

d = O (1)

e

N = O (n)

complessit`

a

Θ (n)

(69)

Esempio

Stimiamo le complessit`

a relative di MergeSort e RadixSort per

ordinare tutti i cittadini italiani per codice fiscale

Numero di cittadini

n ' 6 · 10

7

' 2

26

Codice Fiscale: stringa di 16 caratteri da un alfabeto di 36

(che associamo con gli interi in

[0, 35]

)

MergeSort:

' 26 · n

RadixSort: Vediamo il CF composto da

d

cifre in

[0, N − 1]

.

Consideriamo due casi:

1

d = 16

,

N = 36

: la complessit`

a `

e

' 16 · (n + N) ' 16 · n

2

d = 4

,

N = 36

4

: la complessit`

a diventa

' d · (n + N) < 5 · n

IN OGNI CASO VINCE RADIXSORT!

(70)

Esercizio C-13.39 [GTG14]

Dato un arrayAdi ninteri nell’intervallo[0, n2− 1], descrivere un metodo semplice per ordinareAin tempoO (n).

(71)
(72)
(73)

Esercizio

Si supponga di utilizzare RadixSort per ordinare un arrayAdininteri nell’intervallo[0, M − 1], conM > n, vedendo ciascun intero

rappresentanto in baseN. Determinare la complessit`a in funzione dei parametrin,M, eN, e dire qual `e la scelta migliore perN.

Esercizio C-13.40 [GTG14]

SianoS1, S2, . . . , Sk k sequenze non vuote di entry con chiavi nel range

[0, N − 1], per un qualcheN ≥ 2. Descrivere un algoritmo che ordini separatamente tutte le sequenze in tempoO (n + N), doven`e la somma delle taglie delle sequenze. (In output le sequenze devono rimanere distinte e quindi l’esercizio non chiede di ordinare l’unione delle sequenze, che sarebbe banale.)

(74)

Riepilogo

Algoritmi di ordinamento basati su confronti

• Paradigma Divide-and-Conquer

• MergeSort: specifica, complessit`a con albero della ricorsione

• QuickSort deterministico: specifica (quasi) in-place, complessit`a con albero della ricorsione

• InsertionSort: specifica, complessit`a in funzione del numero di chiavi e del numero di inversioni

• Algoritmi deterministici vs algoritmi probabilistici

• Randomized QuickSort: specifica, complessit`a in alta probabilit`a e in media

• Lower bound per algoritmi di ordinamento basati su confronti

Algoritmi di ordinamento non basati su confronti

• BucketSort

• Ordinamento Stabile

• RadixSort

Riferimenti

Documenti correlati

Progetto Lauree Scientifiche.

PREDICTIVE ANALYSES ACCORDING TO SIDEDNESS AND PRESSING PANEL. Morano et al, J Clin

• Third line with ipilimumab following a-PD-1 mono could be considered. Ipilimumab BRAFi

Si pu` o dimostrare che da ogni base di Gr¨ obner si pu` o estrarre una ba- se di Gr¨ obner ridotta e la base di Gr¨ obner ridotta `e unica (per un fissato ordinamento).. Seguendo

Nascono i sistemi a chiave asimmetrica, composti da una chiave pubblica, nota a tutti ed usata per la cifratura, e da una chiave privata,.. nota ad una sola persona ed usata per

Irroratela quindi con un quarto di litro di vino e con altrettanto fumetto di pesce, poi passatela nel forno a 150 gradi per 45 minuti circa, unendo, a metà cottura, i

Vogliamo dimostrare che la matrice simmetrica A ha abbastanza autodimensione, cio` e vogliamo usare il Teorema fondamentale della diagonalizzazione.. Allora assumiamo il contrario,

 Se nessuna variabile artificiale è ancora in base, ho una base fatta da sole colonne del problema originario e posso partire con Fase 2 su esso.  Se ho ancora variabili