mam szereg piecyk obiektów, które muszę połączyć tak, że wszystkie zachodzące na siebie zakresy zniknąć:Jak funkcjonalnie połączyć nakładających numer waha się od listy
case class Range(from:Int, to:Int)
val rangelist = List(Range(3, 40), Range(1, 45), Range(2, 50), etc)
Oto zakresy:
3 40
1 45
2 50
70 75
75 90
80 85
100 200
Po zakończeniu dostaniemy:
1 50
70 90
100 200
Imperatyw algorytmu:
- Pop() pierwszy zakres-obj i iteracja przez resztę listy, porównując go z każdym z pozostałych zakresów.
- jeśli występuje nakładający się element, scal je razem (To daje nową instancję zasięgu) i usuń 2 kandydatów scalających z listy źródłowej.
- Na końcu listy dodaj obiekt Range (który mógł się wiele razy zmienić poprzez scalenie) do listy końcowych wyników.
- Powtórz to z następną z pozostałych pozycji.
- Gdy lista źródeł jest pusta, skończyliśmy.
Aby to zrobić koniecznie trzeba stworzyć wiele zmiennych tymczasowych, indeksowane pętle itd
Więc zastanawiam się, czy jest podejście bardziej funkcjonalne?
Na pierwszy rzut oka, kolekcja źródłowa musi być w stanie działać jak Stack w dostarczaniu pop() PLUS dając możliwość usuwania elementów poprzez indeks podczas iteracji nad nim, ale wtedy to nie byłoby już funkcjonalne.
To zakłada, że 'rs' jest uporządkowany według początkowych elementów zakresu. Lepiej byłoby po prostu, aby 'x zawierało y.od". –
'scalić' sortuje i przechodzi do' zwinięcia'. Jeśli nie zrobisz tego w ten sposób, twoim środowiskiem wykonawczym jest 'O (n^2)' zamiast 'O (n log n)' tak jak powinno być. –
Duh! Nie zauważyłem, że metoda "scalania" ... –