Azzurra IRC Network Forum

[C o derivati] Ordinamento di una lista in base a somme di valori precedenti

edoardo1985 · 29/01/2007 17:29 · #1
Ciao a tutti,
il mio problema è il seguente: ho una struttura dati dinamica costituita da una lista in cui ogni voce è una coppia di valori (dato che mi interessa solo l'algoritmo e NON il codice la si può considerare anche come un array bidimensionale).
Per intenderci, chiamo PESO il primo valore e RESISTENZA il secondo, ad esempio:

PESO     RESISTENZA

80       90
1        91
11       3
3        1
90       2
Quello che devo ottenere è un'altra lista, costruita a partire dagli elementi di questa, nella quale il valore RESISTENZA di ogni voce sia >= della somma dei pesi delle voci precedenti.
Qualora non siano utilizzabili tutte le voci della lista (perchè a un certo punto la somma dei pesi supera la resistenza della voce ennesima) è necessario eliminare solo le voci "giuste" e combinare le restanti affinchè la lista sia la più lunga possibile.

In questo caso la lista risultante sarebbe:

PESO     RESISTENZA   (Somma pesi precedenti)

3        1            (0)
11       3            (3)
1        91           (14)
80       90           (15)
E' un problema apparentemente semplice ma che presenta diversi casi particolari.
Ci ho ragionato molto sopra ma senza riuscire a concepire nessun algoritmo abbastanza efficace... forse sarebbe opportuno organizzare la lista di partenza in un albero o qualche altra struttura dati prima di sottoporla all'algoritmo.
Voi che ne dite? Mi farebbe piacere sentire anche semplicemente una vostra opinione, per cercare di esplorare altri modi per risolvere il problema.
Grazie!
Vins · 07/04/2007 08:02 · #2
per l'ordinamento sia che usi un algoritmo di ordinamento mergesort (ordinamento nella fusione), sia che usi un algoritmo quicksort (ordinamento nella divisione), in ogni caso dovrai per forza strutturare il tutto ad albero, inevitabilmente. L'unica differenza che potrebbe passare tra il primo caso e il secondo è una leggera diversità di complessità, il merge in termini di tempo può essere al più nlogn complesso, mentre il quicksort nel caso peggiore può avere complessità quadratica.
Se non conosci gli algoritmi di ordinamento citati puoi fare una ricerca rapida su google e trovi quel che ti serve icon_smile.gif
Se hai ancora problemi chiedi pure icon_smile_wink.gif