Newsgroup: it.comp.lang.vo-clipper
Titolo: Problema nella funzione ASORT()

Cari amici, mi sto rendendo conto che la funzione ASORT() del Clipper ha
un problema: se l'array da ordinare ha molti elementi e questi sono già
ordinati, la funzione impiega molto tempo per fare niente. Probabilmente
dipende dall'algoritmo utilizzato. Qualcuno può confermare questo
comportamento e magari consigliare un'alternativa più efficiente?
Ciao a tutti.
EMG

Enrico Maria Giordano ha scritto:

ho fatto una prova su un array di 3000 elementi, caricati prima in
disordine e poi in ordine.
Nel primo caso aSort impiega meno di un secondo, nel secondo caso
impiega 11 secondi.
Quindi confermo, mentre per l'alternativa non posso consigliarti
nulla, per ora.
ciao 

 nulla, per ora.
Mi sembrerebbe strano che Clipper non utilizzasse il miglior algoritmo
di sort possibile, quicksort probabilmente, quindi non vedo alternative,
in caso di punti critici del codice e riordinamenti frequenti, l'unica 
alternativa e' quella di mantenere una variabile di aggiornamento.
Ciao...
Claudio Driussi
http://www.swit.net/csoft
mailto:
cldr...@swit.net

 nulla, per ora.
Forse bisognerebbe riscrivere ASORT() in C. Qualcuno puņ consigliarmi un
buon algoritmo che non abbia quel problema e illustrarmelo brevemente?
EMG

 alternativa e' quella di mantenere una variabile di aggiornamento.
Puoi fare un esempio?
EMG

 Se vedi che č ordinato allora non ordinarlo.
Ci avevo pensato, ma temo che l'efficienza della funzione ASORT() non
crolli solamente se l'archivio č perfettamente ordinato ma anche se solo
si avvicina ad esserlo. E questo č molto piů difficile da controllare.
EMG

 Puoi fare un esempio?
dovresti spiegarci il problema, perche' altrimenti si puo' solo sparare
soluzioni a caso. Ad esempio potrebbe essere che devi fare il sort solo
quando carichi il programma, poi in caso di inserimenti e sostituzioni
potresti usare ains e adel. che in alcuni casi sono piu' veloci.
Ti do due spunti che forse non sono pertinenti:
Ti sei mai interessato alla teoria degli alberi binari non bilanciati e 
bilanciati? Usando gli array dinamici di clipper non dovrebbe essere
impossibile implementarli, certo devi avere tempo e voglia.
Hai dato un occhiata ai Dictionary che si trovano nei demo di Clipper 5.2?
implementa un sistema di ricerca Hash che puo' essere utile per memorizzare
binomi chiave/valore.


 ha scritto nel messaggio
news:39A4361D...@flashnet.it...


 binomi chiave/valore.
Non saprei come utilizzarli per ordinare, ad esempio, un array di nomi.
EMG

 Non saprei come utilizzarli per ordinare, ad esempio, un array di nomi.
in effetti non si puo', serve sono per memorizzare e recuperare dati.


 il sort...??
Spesso le idee più semplici sono le migliori. Su questa tua idea ne ho
adottata una variante: faccio un semplice "mischiaggio" degli elementi e
poi lancio ASORT(). Il risultato è ottimo. Grazie.
EMG

 i dati in un array multidimensionale con questa stuttura:
Ripeto: troppo complicato per una cosa così banale come l'ordinamento
degli elementi di un array. Certo, se tu hai qualcosa di già sviluppato
allora lo esaminerei volentieri...
EMG

 allora lo esaminerei volentieri...
Hai ragione, era solo una discussione teorica, non ho niente di pronto
percio' non se ne fa niente.
Comunque ritornando al problema originale, l'algoritmo di sort piu'
efficente e' sicuramente il quick sort, che pero' ha il difetto di
essere meno efficente con gli array gia' ordinati, ho trovato questa
pagina:
http://www.toolsofcomputing.com/SortAlgorithms.htm
che spiega gli algoritmi piu' diffusi, certo che se vuoi implementare
un sort per clipper devi come minimo lavorare in C se vuoi competere
con quello gia' implementato.


 con quello gia' implementato.
Da questo punto di vista non ci sarebbero problemi (uso il C e il C++
abitualmente).
EMG