Ho un certo numero di range-oggetti che ho bisogno di unire in modo che tutti gli intervalli sovrapposti scompaiono:Come unire funzionalmente sovrapposte numero-range da un elenco
case class Range(from:Int, to:Int)
val rangelist = List(Range(3, 40), Range(1, 45), Range(2, 50), etc)
Ecco l'gamme:
3 40
1 45
2 50
70 75
75 90
80 85
100 200
una volta finito otterremmo:
1 50
70 90
100 200
imperativo Algoritmo:
0.123.- Pop() il primo intervallo-oggetto e scorrere il resto dell'elenco confrontandolo con ciascuno degli altri intervalli.
- se è presente un elemento sovrapposto, unire insieme (questo produce una nuova istanza di intervallo) ed eliminare i 2 candidati di unione dall'elenco di origine.
- Alla fine dell'elenco aggiungere l'oggetto Range (che potrebbe essere stato modificato numerose volte mediante fusione) all'elenco dei risultati finali.
- Ripeti l'operazione con il prossimo degli articoli rimanenti.
- Una volta che l'elenco delle fonti è vuoto, abbiamo finito.
Per fare questo si deve imperativamente creare un sacco di variabili temporanee, cicli ecc indicizzati
Quindi mi chiedo se c'è un approccio più funzionale?
A prima vista la raccolta di origini deve essere in grado di comportarsi come una pila fornendo pop() PLUS dando la possibilità di eliminare elementi per indice mentre si esegue iterazione su di esso, ma in tal caso non sarebbe più funzionale.
Questo presuppone che 'rs' sia ordinato in base agli elementi iniziali dell'intervallo. Sarebbe meglio solo rendere 'x contiene y.from'. –
'unisci' ordina e passa a' collapse'. Se non lo fai in questo modo il tuo runtime è 'O (n^2)' invece di 'O (n log n)' come dovrebbe essere. –
Duh! Non ho notato che il metodo 'merge' ... –