Готовы ли двоичные деревья разделов перед добавлением точек в узлы?

1

Я пытаюсь реализовать этот алгоритм в Python, но из-за недостатка понимания древовидных структур я запутался в процессе создания дерева разделов.

Краткое объяснение:

Алгоритм, который был связан, предназначен для разделения многомерного пространства объектов на внутренние и конечные узлы, чтобы можно было быстро выполнить запрос.

Он делит большое пространство с помощью специального случайного теста - гиперплоскости, которая разделяет одну большую ячейку на две.

Этот ответ объясняет все гораздо более точно.

Изображение 174551

(взято по ссылке выше)

Фрагменты кода:

def random_test(self, main_point):  # Main point is np.ndarray instance
    dimension = main_point.ravel().size
    random_coefficients = self.random_coefficients(dimension)
    scale_values = np.array(sorted([np.inner(random_coefficients, point.ravel())
                                    for point in self.points]))
    percentile = random.choice([np.percentile(scale_values, 100 * self.ratio),  # Just as described on Section 3.1
                                np.percentile(scale_values, 100 * (1 - self.ratio))])
    main_term = np.inner(main_point.ravel(), random_coefficients)
    if self.is_leaf():
        return 0  # Next node is the center leaf child
    else:
        if (main_term - percentile) >= 0:  # Hyper-plane equation defined in the document
            return -1  # Next node is the left child
        else:
            return 1  # Next node is the right child

self.ratio как упомянуто в алгоритме, связанном выше, определяет, насколько сбалансированным и неглубоким будет дерево, при 1/2 оно должно генерировать наиболее сбалансированное и неглубокое дерево.

Затем мы переходим к итерационной части, где дерево продолжает делить пространство все дальше и дальше, пока не достигнет конечного узла (обратите внимание, что ключевое слово достигает), проблема в том, что оно никогда не достигнет конечного узла.

Поскольку определение конечного узла в документе, связанном выше, таково:

def is_leaf(self):
    return (self.capacity * self.ratio) <= self.cell_count() <= self.capacity

где self.cell_count() - количество точек в ячейке, self.capacity - максимальное количество точек, которое может иметь ячейка, а self.ratio - коэффициент разделения.

Мой полный код должен делить пространство функций путем создания новых узлов на начальной итерации, пока не будет создан конечный узел (но конечный узел никогда не создается). Смотрите фрагмент, который содержит процесс деления.

Изображение 174551

(взято из документа, указанного выше)

ТЛ; др:

Готовы ли двоичные деревья разделов (заполненные пустыми узлами), прежде чем мы добавим к ним какие-либо точки? Если так, разве мы не должны определять уровень (глубину) дерева?

Если нет, создаются ли двоичные деревья разделов при добавлении к ним точек? Если так, то как первая точка (из первой итерации) добавляется в дерево?

  • 1
    Похоже , что вы пытаетесь сделать это .
  • 0
    @user3386109 user3386109 Я уже видел это, но не смог найти ответ на свой вопрос. Алгоритм связанного aboce был описан довольно неявно, но я думаю, что начинаю его понимать. Я считаю, что точки не должны быть сброшены на дерево отдельно на разных уровнях, вместо этого все точки в родительском узле должны быть отброшены на каждом уровне дерева. Я попробую это, возможно, это правильный подход.
Теги:
numpy
algorithm
search
kdtree

1 ответ

0

Они построены, как вы идете вместе. Первый узел находится справа или слева от строки 1. Затем следующий уровень спрашивает справа или слева от строки 2... На рисунке это показано с нумерацией линий, ассоциирующихся с выбором, представленным на узле.

Конечно же, справа или слева неточно. Некоторые линии обрезаются горизонтально. Но созданные пространства являются двоичными.

  • 0
    Мои извинения за поздний ответ, я попробовал этот метод, как указано в комментариях, и он работал отлично. В любом случае я сделаю новый ответ, объяснив, как, если кто-то этого требует.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню