Вы можете разбить эту проблему сначала на вложенные интервалы, а затем разбираться с каждым вложением отдельно.Под вложенностью я подразумеваю интервалы, которые разделяют хотя бы одну точку.Для приведенного вами примера:
{{1,5}, {3,10}, {5,11}, {15,18}, {16,20}}
существует две вложенности:
{1,5}, {3,10}, {5,11}
и
{15,18}, {16,20}
В общем, для определения вложений вы можете отсортироватьинтервалы, основанные на левой конечной точке (как в вашем примере), затем пробегают и запускают новое вложение всякий раз, когда вы видите {x,y}, {x',y'}
с y < x'
.
Для вложения формируются «элементарные интервалы»по отсортированной последовательности (без повторов) значений.В этом примере вложенности дают
(1,3,5,10,11) -> {1,3}, {3,5}, {5,10}, {10,11}
и
(15,16,18,20) -> {15,16}, {16,18}, {18,20}
Таким образом, общий алгоритм может выглядеть следующим образом:
- Сортировать интервалы на основелевая конечная точка
- Выполнять через интервалы до
{x,y}, {x',y'}
с y < x'
- От начала до
{x,y}
, составить отсортированный список конечных точек (без повторов), скажем a0,a1,...,ak
- Добавить элементарные интервалы
{ai,a(i+1)}
для i = 0...k-1
- Удалить интервалы до
{x,y}
и продолжить с шага 2