хотят, чтобы создать структуру данных, которая может хранить угловые интервалы, например (a,b)
, где оба a
и b
представляют полярный угол из конечных точек сегмента A,B
против точки Q
структура данных для хранения угловых интервалов
Эта структура данных должна поддерживать две операции. Вставьте новые интервалы, а также скажите, была ли покрыта вся точка обзора точки Q
, другими словами, если объединение всех точек зрения, созданных сегментами, составляет 360 градусов.
Я попытался реализовать очень простое дерево интервалов, где процедура вставки следующая.
- Позвольте
(a,b)
интервал, который вы хотите вставить. - Начните с корневого узла, если
(a,b)
полностью покрыт интервалом, хранящимся в корневом узле, если это так, возвратитесь и ничего не сделайте. - В противном случае, возможно, какая-то часть покрыта корневым узлом, а часть не полностью покрыта. Не более двух частей не могут быть покрыты и в зависимости от каждого случая, рекурсия влево или/и в правое поддерево.
Я не использую дополненную структуру данных, в худшем случае, чтобы вставить интервал, вам придется делать O(n)
операций, что дает вам сложность O(n^2)
для вставки n
интервалов.
Вот и проблема. Когда вы работаете с углами, вам приходится иметь дело с циклами, полярный угол которых равен a
, а полярный угол равен b
. Поэтому, учитывая сегмент AB
, вы находите полярные углы конечных точек против Q
, но тогда как вы узнаете интервал, который вы будете хранить в своем дереве?
Можно сказать, ладно, ваш интервал может быть (min(angleAQ, angleBQ), max(angleAQ, angleBQ))
.
Это, однако, не будет работать в следующих случаях:
интервал будет определяться синим углом и зеленым углом, что значительно больше, чем фактическая точка зрения, которая определяется красный угол.
Из-за этого свойства цикла гораздо сложнее управлять такими интервалами угла.
Вопрос в том, может ли такое дерево интервалов существовать, и если да, то кто-то может дать мне некоторые подсказки для преодоления этих трудностей?
спасибо заранее
Важнейшая временная сложность важна (в отличие от амортизированной или рандомизированной/ожидаемой)? Сколько интервалов будет? (Логарифмически-временные операции имеют плохой постоянный коэффициент.) –
Нет Давид, худшая временная сложность не важна. – jsguy
Интервалы не превышают 'n', где' n' - общее количество сегментов. Это число не очень большое, около 1000. Но теперь моя задача - сделать что-то, что работает, а затем оптимизировать сложную временную сложность, чтобы мы могли поддерживать большее количество сегментов. – jsguy