bir Listesi'nden sayı-aralıkları örtüşen birleştirmek için:işlevsel tüm örtüşen aralıkları kaybolur o ben çok birleştirmek için gereken menzil-nesnelerin bir dizi var
3 40
1 45
2 50
70 75
75 90
80 85
100 200
: Burada
case class Range(from:Int, to:Int)
val rangelist = List(Range(3, 40), Range(1, 45), Range(2, 50), etc)
aralıkları olduğunu
1 50
70 90
100 200
Zorunlu Algoritma:
kez biz alacağı bitmiş
- İlk aralıktaki nesneyi Pop() ve diğer tüm aralıklar ile karşılaştırarak listenin geri kalanı boyunca yineleyin.
- Üst üste binen bir öğe varsa, bunları birleştirir (Bu yeni bir Aralık örneği verir) ve kaynak listeden 2 birleştirme adayını siler.
- Listenin sonunda Range nesnesini (birleştirme yoluyla sayısız kez değişmiş olabilir) son sonuç listesine ekleyin.
- Bunu, kalan öğelerin bir sonraki kısmı ile tekrarlayın.
- Kaynak listesi boşaltıldıktan sonra işimiz bitti.
imperatively bir daha işlevsel bir yaklaşım olup olmadığını Yani, merak ediyorum
vb geçici değişkenlerin bir sürü endeksli döngüler oluşturmalısınız Bunu yapmak için?İlk bakışta kaynak koleksiyonunun, pop() PLUS sağlamada bir Yığın gibi davranabilmesi gerekir; bu, öğeleri yineleme sırasında indeksle silme yeteneğini verir, ancak daha sonra bu artık işlevsel olmaz.
Bu, 'rs' menzil başlangıç öğelerine göre sıralı olduğunu varsayar. Sadece x'in y.from'u içermesi daha iyi olur. –
"birleştirme", "daraltma" durumuna geçer ve geçer. Bunu yapmazsanız, çalışma zamanınız "O (n log n)' yerine "O (n^2)' dir. Olması gerektiği gibi. –
Duh! 'Birleştirme' yöntemini fark etmedim ... –