Данного списка значений даты и времени начала/оконечного мне нужно проверить три вещи:Алгоритм проверка списка интервалов
- для каждого интервала, время начала до конца времени
- не перекрывается не существует между элементами списка, каждый пуск/конец диапазона должен представлять собой дискретный интервал в общем списке
- не может быть пробелов в серии, от самого раннего начала до самого последнего конца должен быть непрерывный охват.
Так что, учитывая:
((1970-01-01, 1970-12-31), (1971-01-01, 1971-12-31), (1972-01-01, 1972-12-31), (1973-01-01, 1973-12-31))
успешный результат дается.
Учитывая
((1970-12-31, 1970-01-01), (1970-10-01, 1971-12-31), (1972-01-01, 1972-12-31), (1973-01-01, 1973-12-31))
сообщение о том, что дата начала наступает после даты окончания в первом элементе обеспечивается.
Учитывая
((1970-01-01, 1970-12-31), (1970-10-01, 1971-12-31), (1972-01-01, 1972-12-31), (1973-01-01, 1973-12-31))
сообщение о том, что перекрытие существует между первым и вторым элементами обеспечивается.
Учитывая
((1970-01-01, 1970-12-31), (1971-10-01, 1971-12-31), (1973-01-01, 1973-12-31), (1974-01-01, 1974-12-31))
сообщение о том, что существует зазор между вторым и третьим элементами обеспечивается.
Первое требование - это просто, вопрос в том, как лучше всего перевести его на более широкую проверку.
Второе требование в некоторой степени соответствует приведенной ниже статье, но поскольку оно работает только на пару интервалов, я все равно пойму O (n^2), поскольку каждый элемент нужно будет сравнить с любым другим элементом, исправить ? Determine Whether Two Date Ranges Overlap
Эта статья - search for interval overlap in list of intervals? - лучше подходит для второго требования, а первая может быть перенесена в совокупность дерева интервалов.
Так что это оставляет третье требование. Можно ли определить промежутки в общем интервале с использованием дерева интервалов?
Упомянем, что это в Javascript, node.js. Тем не менее, было бы интересно проработать это в Haskell или другом функциональном языке ...
Спасибо!
г/Steve
Поскольку все 3 условия легко решаются с использованием * реальных интервалов, почему бы вам не «перевести» эти диапазоны дат на целые интервалы, запустить 3 алгоритма, а затем перевести их обратно в даты. легко найти функцию (дата) -> Целое число, которое будет 1-1 и включено (следовательно, обратимо). – alfasin