Un blog creato da dariospy il 04/10/2008

Qui il Titolo

Vaneggiamenti di uno (ex)studente

 
 
 
 
 
 

AREA PERSONALE

 
 
 
 
 
 
 

TAG

 
 
 
 
 
 
 

ARCHIVIO MESSAGGI

 
 << Agosto 2024 >> 
 
LuMaMeGiVeSaDo
 
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
 
 
 
 
 
 
 
 
 
 
 
 
 
 

FACEBOOK

 
 
 
 
 
 
 
 

 

 
« L'ora di giocareConvolution!! »

L'efficienza della semplicità

Post n°7 pubblicato il 24 Dicembre 2008 da dariospy
 
Tag: studio

Ho sempre pensato che le cose semplici siano sempre le migliori, oggi ne ho avuto la conferma.

Oggi ho studiato il countingSort, un algoritmo di ordinamento non sul posto e (volendo) stabile.

Questo algoritmo ha il pregio di avere una complessità O(n), diversamente da tutti gli algoritmi che ho visto finora (mergesort, insertionsort, quicksort...) che hanno come lowerbound Omega(n lgn).

Questo algoritmo ha bisogno solo di una piccola informazione in più, bisogna sapere l'intervallo in cui cadono gli elementi da ordinare, riesce ad abbattere il lowerbound nlgn in quanto non usa confronti fra gli elementi. Viaggia "fuori dagli schemi".

In parole povere questo algoritmo assegna ad ogni elemento della sequenza in input A una posizione finale e la conserva in un array C di supporto, alla fine mediante un semplice for si assegnano a B (l'array finale) gli elementi di A posizionati secondo quanto dice C.


Pseudocodice
(originale del Cormen)
consta di 4 cicli:(supponiamo di avere una sequenza A (lunga n) da ordinare che contiene valori appartenenti a [0, k])

1)inizializza l'array C a 0(superfluo a mio modo di vedere, dipende dal linguaggio di programmazione utilizzato)
2)Calcola le occorrenze di ogni x appartenente a [0,k] scorrendo A, C[x] contiene le occorrenze di x
3)Accumula i valori di C in modo da ottenere che C[x] contenga il numero di elementi minori di x.
4)Assegna a B i valori di A ordinati secondo quanto dice C.


Migliorie

1)Si potrebbe eliminare il primo ciclo se si conosce bene il linguaggio di programmazione che si usa (in C, come in Java, ad esempio è superfluo questo lavoro)
2)Aggiungendo un ciclo lineare (che quindi non modifica la complessità) si può evitare di chiedere, a chi vuole usare questo algoritmo, di fornire l'intervallo dei numeri da ordinare (calcolando max e min).


Difetti
Se k risulta essere molto più grande di n allora questo algoritmo è sconveniente.
Matematicamente:
n+k<nlgn <=> k<nlgn-n<=> k<n(lgn-1)

Per chi volesse approfondire.

Un saluto
Dario

 
Commenta il Post:
* Tuo nome
Utente Libero? Effettua il Login
* Tua e-mail
La tua mail non verrà pubblicata
Tuo sito
Es. http://www.tuosito.it
 
* Testo
 
Sono consentiti i tag html: <a href="">, <b>, <i>, <p>, <br>
Il testo del messaggio non può superare i 30000 caratteri.
Ricorda che puoi inviare i commenti ai messaggi anche via SMS.
Invia al numero 3202023203 scrivendo prima del messaggio:
#numero_messaggio#nome_moblog

*campo obbligatorio

Copia qui:
 
 
 
 
 
 
 

CERCA IN QUESTO BLOG

  Trova
 
 
 
 
 
 
 

ULTIME VISITE AL BLOG

dariospydansil1981pazzomarcoCabriolonecoraggio_liber0agataelatempesta3AnimeMagichemessaggeria.normaledreamkeeperossimoraprosanctitatectfusion0dono.del.cieloravagesgabriele19721972
 
 
 
 
 
 
 

ULTIMI COMMENTI

 
 
 
 
 
 
 

CHI PUò SCRIVERE SUL BLOG

Solo l'autore può pubblicare messaggi in questo Blog e tutti possono pubblicare commenti.
 
 
 
 
 
 
 
RSS (Really simple syndication) Feed Atom
 
 
 
 
 
 
 
 
 
 
 
 

© Italiaonline S.p.A. 2024Direzione e coordinamento di Libero Acquisition S.á r.l.P. IVA 03970540963