Проблема с бесконечной рекурсией KDTree buildBalancedTreeC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Проблема с бесконечной рекурсией KDTree buildBalancedTree

Сообщение Anonymous »

Я пытался ускорить свое дерево KD, реализовав балансирующие и ограничивающие рамки, но теперь оно даже не может построить дерево, и я не понимаю, почему.
Пример ввода
Вот как я предоставляю ввод:

Код: Выделить всё

n and dim = {3, 2} points: {0, 0} {3, 3} {3, 0}
Проблема
Когда я пытаюсь построить дерево, кажется, что функция переходит в бесконечную рекурсию, и программа зависает. Я подозреваю, что проблема кроется в моей функции buildBalancedTree.
Код
Вот реализация функции buildBalancedTree:

Код: Выделить всё

std::unique_ptr KDTree::buildBalancedTree(
std::vector
& points,
int depth,
std::vector min_bound,
std::vector max_bound) {

if (points.empty()) {
return nullptr;
}

int axis = depth % points[0].point.size();

std::sort(points.begin(), points.end(), [axis](const Point& a, const Point& b) {
return a.point[axis] < b.point[axis];
});

size_t medianIndex = points.size() / 2;
Point medianPoint = points[medianIndex];

// Update bounds for left and right subtrees
std::vector left_max = max_bound;
left_max[axis] = medianPoint.point[axis];

std::vector right_min = min_bound;
right_min[axis] = medianPoint.point[axis];

auto node = std::make_unique(std::move(medianPoint), min_bound, max_bound);

node->left = buildBalancedTree(
points, depth + 1, min_bound, left_max
);
node->right = buildBalancedTree(
points, depth + 1, right_min, max_bound
);

return node;
Мои мысли
Я считаю, что бесконечная рекурсия возникает потому, что я передаю один и тот же вектор точек как для левого, так и для правого поддерева. Однако я не уверен, как правильно разбить вектор точек для поддеревьев.
Как решить эту проблему? При необходимости могу предоставить полный код моей программы.

Подробнее здесь: https://stackoverflow.com/questions/792 ... sion-issue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»