목록에서 번호-범위를 중복 병합하는 방법 :는 기능적으로 모든 중복 범위는 사라질 것을 내가 너무 병합해야 범위-개체의 번호가
3 40
1 45
2 50
70 75
75 90
80 85
100 200
: 여기
case class Range(from:Int, to:Int)
val rangelist = List(Range(3, 40), Range(1, 45), Range(2, 50), etc)
범위입니다
1 50
70 90
100 200
명령 적 알고리즘 :
일단 우리가 얻을 것 완료
- 첫 번째 range-obj를 Pop()하고 다른 나머지 범위와 비교하여 목록의 나머지 부분을 반복합니다.
- 겹치는 항목이있는 경우 을 병합하여 (새 Range 인스턴스를 생성 함) 원본 목록에서 2 개의 병합 후보를 삭제합니다.
- 목록 끝에 Range 개체 (병합을 통해 여러 번 변경되었을 수 있음)를 최종 결과 목록에 추가합니다.
- 다음 항목과 함께이 작업을 반복하십시오.
- 소스 목록이 비어 있으면 완료됩니다.
은 명령 적으로 하나가 더 기능적 접근이 있다면 그래서 내가 궁금하네요
등 임시 변수의 많은 색인 루프를 작성해야합니다 이렇게하려면?pop() PLUS 을 제공하면서 소스 컬렉션이 스택처럼 동작 할 수 있어야합니다. 인덱스를 반복하면서 인덱스별로 항목을 삭제할 수 있지만 더 이상 기능을 수행 할 수는 없습니다.
'rs '가 범위 초기 요소에 의해 정렬된다고 가정합니다. 'x contains y.from'를 만드는 것이 더 좋을 것입니다. –
'merge'가 정렬되어'collapse'됩니다. 이런 식으로하지 않으면 런타임은 'O (n log n)'대신'O (n^2)'이어야합니다. –
Duh! 그 병합 메소드를 알지 못했습니다 ... –