Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Algoritmi di sorting veloci in C... con un twist!
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 17:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 21 Feb 2011 16:00    Oggetto: Algoritmi di sorting veloci in C... con un twist! Rispondi citando

Ciao a tutti,

sono sempre io, sto programma mi sta tirando scemo Sad.

Ho 5 array di circa 200,000 righe. Devo ordinarli (tutti) a seconda del valore di uno di essi. Intendo che l'ordine degli array 2, 3, 4 e 5 deve essere basato sul valore dell'array 1. Come fare in Excel sort data by column A, ma ordinare anche le colonne B, C, D, E.

Ho provato con gli ingenui "insertion sort" e "bubble sort", ma sono troppo lenti, ho bisogno di un fast sort di tipo NlogN.

Ci sono svariate implementazioni in c scaricabili da internet (heap sort è popolarissimo), purtroppo però restituiscono solo l'array ordinato... Io avrei bisogno che mi restituissero anche una MAPPA con i cambiamenti fatti (del tipo un array map[200,000], dove map[i]=la posizione originaria dell'elemento che ora sta in posizione i.

In questo modo, mando alla procedura l'array che contiene i numeri per l'ordine e, con la mappa, mi ordino gli altri 4 array.

Sapete di qualche cosa che funzioni così?

Grazie mille e a presto!
Top
Profilo Invia messaggio privato HomePage
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11806
Residenza: Tokelau

MessaggioInviato: 21 Feb 2011 16:35    Oggetto: Rispondi citando

banalmente mi verrebbe da suggerirti di cambiare i 5 array da 200mila elementi ognuno in un array solo, ma composto di strutture dove hai un membro per ognuno degli array iniziali (cioè 5).
Così potrai ordinare l'array di strutture secondo il membro che ti conviene mantenendo insieme i dati.
Top
Profilo Invia messaggio privato HomePage
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 17:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 21 Feb 2011 16:55    Oggetto: Rispondi citando

Ottima idea! Interessante... Sai cosa però? Se ogni volta che due numeri si scambiano lu deve smazzarsi lo scambio dell'intera struttura, non perdo velocità rispetto ad ordinarmi un solo array di interi e poi usare la mappa sugli altri, che è un'operazione O(N)?

Guarderò comunque a come fare la tua soluzione. Grazie mille!
Top
Profilo Invia messaggio privato HomePage
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11806
Residenza: Tokelau

MessaggioInviato: 21 Feb 2011 18:49    Oggetto: Rispondi citando

ZapoTeX ha scritto:
Se ogni volta che due numeri si scambiano lu deve smazzarsi lo scambio dell'intera struttura, non perdo velocità rispetto ad ordinarmi un solo array di interi e poi usare la mappa sugli altri, che è un'operazione O(N)?


Rimane comunque un'operazione O(N), solo che sposterà ogni volta un blocco più grande di memoria. Invece che fare 5 spostamenti di blocchi più piccoli, quindi alla fine secondo me sarà più veloce...
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 21 Feb 2011 18:58    Oggetto: Rispondi citando

Come algoritmo io penso ad un bel quicksort (magari senza ricorsione appoggiandoti ad un albero) e come dice SverX usare le strutture.
Però invece di usare degli array e basta penserei ai puntatori così ti ritrovi addirittura a scambiare gli indirizzi delle strutture così gli scambi sono su numeri interi.
In pratica usi un array di puntatori ognuno dei quali punta a una struttura (che contiene anche l'indice originale).
Gli elementi da scambiare sono i pointer.
Però hai veramente tanti elementi, io ribadisco che sarebbe ipotizzabile riformulare il problema e passare all'uso di altre strutture
Top
Profilo Invia messaggio privato
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 17:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 21 Feb 2011 21:36    Oggetto: Rispondi

Grazie mille!!!

Buona giornata!
Top
Profilo Invia messaggio privato HomePage
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi