이 정확한 문제는 algorithmist에 있습니다.
욕심 많은 sweep line 스타일 알고리즘 알고리즘이 문제를 최적으로 해결합니다.
첫 번째 제한 조건에서 가능한 한 비 분리 영역을 최대한 처리하고 두 번째로 첫 번째 제약 조건을 사용한다고 가정하면이 알고리즘은 O (n^2) 시간 동안 문제를 해결합니다.
기본 아이디어는 위에서 아래로 순서대로 진행하고 '누드'상태 일 때만 섹션을 가져 오는 것입니다. 즉, 해당 섹션을 다루지 않았습니다. 섹션을 강요 당할 때 가장 중요한 부분을 '미래'로 간주하십시오. 이 구현은 O (n^2)이지만, Cands를 조금 더 잘 관리하면 O (n log (n))로 만들 수 있습니다.
#!/usr/bin/python
START_EVENT, END_EVENT = 0, 1 # handle starts before ends at same point
def max_future(cands):
return max(cands, key=lambda c: (c[1], c)[1])
def cover_max_segment_min(intervals):
events = []
for interval in intervals:
events.append((interval[0], START_EVENT, interval))
events.append((interval[1], END_EVENT, interval))
cands = []
outputs = []
alive = None
# Handle events by
# event time,
# starts before ends,
# longer endings before shorter endings
events.sort(key=lambda x: (x[0], x[1], -x[2][1]))
for k, event_type, interval in events:
if event_type == START_EVENT:
cands.append(interval)
if event_type == END_EVENT:
cands.remove(interval)
if interval is alive:
alive = None
if not alive and cands:
outputs.append(max_future(cands))
alive = outputs[-1]
return outputs
assert cover_max_segment_min([(0, 3), (1, 4), (3, 5)]) == \
[(0, 3), (3, 5)]
assert cover_max_segment_min([(0, 3), (3, 5), (1, 4)]) == \
[(0, 3), (3, 5)]
assert cover_max_segment_min([(0, 3)]) == [(0, 3)]
assert cover_max_segment_min([]) == []
assert cover_max_segment_min([(-10, 10), (1, 2), (3, 5)]) == [(-10, 10)]
assert cover_max_segment_min([(1, 2), (2, 3), (3, 4)]) == \
[(1, 2), (2, 3), (3, 4)]
assert cover_max_segment_min([(1, 4), (1, 2), (3, 3)]) == \
[(1, 4)]
@Tim, 자른 섹션을 모두 겹치게 만들거나 고유합니까? – Kiril
그들은 확실히 겹칠 것입니다. 사실, 중복되는 부분이 많아 지므로 사용되는 섹션의 수를 최소화하려는 것이 중요한 이유입니다. – Tim
@Tim, 멋지다, 탐욕스런 접근법을 취하고 가장 겹치는 부분을 잘라낸 섹션을 가져가도 괜찮습니까? – Kiril