Я прочитал несколько слайдов, например, одну последнюю страницу , где описывают алгоритм поиска. Однако у меня есть основной вопрос. Данные лежат в двумерном пространстве.
Сначала я создаю двоичное дерево поиска на основе значения x точек. Каждый внутренний узел содержит BST на основе значения y точек, лежащих в поддереве этого внутреннего узла.
Затем я думаю, что мне следует искать точки, которые лежат в запросе диапазона [x1, x2], а затем проверять, удовлетворяется ли для этих точек запрошенный запрос диапазона [y1, y2]. Однако алгоритм предполагает, что вы должны искать в BST на основе y внутреннего узла, если диапазон внутреннего узла находится внутри [x1, x2], но я этого не понимаю.
Если мы это сделаем, то в примере, который у меня есть, мы будем искать (без причины) базирующийся на y BST корня. Проверьте пример:
------ 0 ---------------------
| |
---- -3 ---- ---- 4 ------
| | | |
---- -4 - -2 --- 3 --- 5
| | / \ | | / \
-5 (-3,4) (-2,2)(0,7) 2 (4,-4) (5,3)(6,-1)
/ \ / \
(-5,6) (-4,0) (2,1) (3,6)
И запрос диапазона, который я хочу выполнить, это (-oo, 1) x (0, 5)*.
Если я смотрю на корень, он имеет значение 0, поэтому он заключен в (-oo, 1), поэтому, если я буду следовать алгоритму, я буду искать все дерево корня на основе y?
Это должно быть дерево, содержащее все точки, поэтому нет смысла продолжать поиск в дереве на основе x. Более того, это приведет к большему количеству посещаемых узлов, чем необходимо.
Я реализую это в c++ а>, если это имеет значение.
*Выполнение запроса диапазона для x в диапазоне [-inf, 1] и y в диапазоне [0, 5].
(-inf, 1)
координатой(x, y)
или(x_lo, x_hi)
? Я предполагаю, что это последнее. - person James Adkison   schedule 14.05.2016