2015-07-23 4 views
2

У меня есть интервалы в форме (a1, b1), (a2, b2), ...., (an, bn).
Я хотел бы поддержать следующие операцииПоиск всех интервалов, которые не пересекаются с точкой

  1. Добавление нового интервала.
  2. Удаление существующего интервала.
  3. Учитывая точку, найдите все интервалы, которые не пересекаются с точкой.

Дерево интервалов - это простое решение, если мы хотим найти интервалы, которые пересекаются с точкой. Как насчет случая, когда мы хотим найти непересекающиеся интервалы?

+0

Что означают «добавить» и «удалить»? Если добавление '(2,4)' к '(1,3)' производит '(1,3), (2,4)' или '(1,4)'? – Oriol

+0

@Oriol - думаю, что это должно быть '(1,3), (2,4)' –

+0

Вы можете вставить в дерево дополнительные интервалы: вместо [a, b] вставить [-inf, a] и [Ь, + инф]. Обязательно сохраняйте идентичность исходных интервалов. –

ответ

3

У всех узлов на двух деревьях одновременно. Дерево A удерживает их ключом ai, а дерево B удерживает их ключом bi.
Вставка и удаление, очевидно, O(log n).
Для требования 3 напечатайте узлы в B от наименьшего до самого большого и остановитесь, когда bi все еще меньше, чем точка. То же самое, но в обратном направлении, в А.

Пример:
Учитывая (1,10), (5,18), (13,20) и точку 12.
Интервал (ы) в A, где ai больше, чем 12 - (13,20), а в B - меньший интервал (ы), (1,10).

+0

Не могли бы вы привести пример? – KodeWarrior

+0

@ KodeWarrior - см. Отредактированный ответ –

+0

Gotcha. Но какова сложность требования 3 в этом случае? – KodeWarrior

Смежные вопросы