Tôi có cùng một câu hỏi khi viết một chương trình để trộn (một phần chồng chéo) các mẫu âm thanh.
Điều tôi đã làm là thêm "sự kiện bắt đầu" và "sự kiện dừng" (cho mỗi mục) vào danh sách, sắp xếp danh sách theo thời gian và sau đó xử lý theo thứ tự. Bạn có thể làm tương tự, ngoại trừ sử dụng một điểm nguyên thay vì một thời gian, và thay vì trộn âm thanh, bạn sẽ thêm các biểu tượng cho tập hợp tương ứng với một phạm vi. Cho dù bạn tạo ra các khoảng trống hoặc chỉ bỏ qua chúng sẽ là tùy chọn.
Edit
Có lẽ một số mã ...
# input = list of (start, stop, symbol) tuples
points = [] # list of (offset, plus/minus, symbol) tuples
for start,stop,symbol in input:
points.append((start,'+',symbol))
points.append((stop,'-',symbol))
points.sort()
ranges = [] # output list of (start, stop, symbol_set) tuples
current_set = set()
last_start = None
for offset,pm,symbol in points:
if pm == '+':
if last_start is not None:
#TODO avoid outputting empty or trivial ranges
ranges.append((last_start,offset-1,current_set))
current_set.add(symbol)
last_start = offset
elif pm == '-':
# Getting a minus without a last_start is unpossible here, so not handled
ranges.append((last_start,offset-1,current_set))
current_set.remove(symbol)
last_start = offset
# Finish off
if last_start is not None:
ranges.append((last_start,offset-1,current_set))
Hoàn toàn chưa được kiểm tra, rõ ràng.
Đây là bản sao của http://stackoverflow.com/questions/149577/need-an-algorithm-for-collapsing-netblock-ranges-into-lists-of-superset-ranges/149829#149829 (giữ lại thông tin là tầm thường) – Camille