2016-09-17 2 views
2

Я обнаружил, как описано в этой статье on HackerEarth, что дерево отрезков могут быть реализованы с использованием массивов, где дочерние элементы узла, расположенного в массиве индекса п находятся на индексы 2n и 2n + 1.Сегмент требование дерева пространство

Также в нем говорится, что для хранения п элементов в моем дереве сегмента, мне нужно 2n + 1 узлы.

Еще недавно, когда я решил несколько проблем, связанных с деревьями сегментов, иногда мой код дал ошибку времени выполнения, которая была решена, когда я изменил размер массива для хранения дерева сегментов до 4 x (размер массива, который будет храниться в дереве сегментов). Как я могу быть уверенным, что для дерева сегментов требуется 4-мерный массив для n элементов.

+0

Обратите внимание, что «левый ребенок (N) = 2N; система right child (N) = 2N + 1' работает для простого двоичного дерева, но только при запуске с N = 1, а не при N = 0. Вы можете исправить это, так что это работает от N = 0, но это несколько разные формулы (LC (N) = 2N + 1; RC (N) = 2N + 2). Я не понимаю, зачем вам нужно 2N + 1 узлов для хранения дерева с N элементами; N достаточно, если вы можете выделить так, чтобы первый элемент был проиндексирован в 1, и N + 1 является достаточным, если вы выделяете из 0, но используете только 1. Из него не раздувается в 2 раза. _ [... продолжение ...] _ –

+0

_ [... продолжение ...] _ В статье могут быть причины - это хранение диапазонов, и если каждый диапазон занимает две ячейки, вам нужно удвоить; но статья длинная, и ваш вопрос не очень хорошо подходит для SO. Вы должны продемонстрировать, почему вам нужно использовать 4N с некоторым кодом, и мы можем проверить его. Или что-то. –

+0

Это подходит для любого другого форума StackExchange? – brijs

ответ

2

Если вы разбираетесь в России, прочитайте эту статью: http://e-maxx.ru/algo/segment_tree

Если нет, то я буду описывать, что он говорит о себе: Мы должны заметить, что размер массива вы содержите (где левым ребенком i является 2i, а правый ребенок - 2i+1), будет не 2n, но 4n. Дело в том, что это перечисление не работает полностью, когда n не является силой 2 - в этом случае мы получаем «пропущенные» числа, которые не привязаны ни к каким вершинам дерева (они означают «узлы»). Фактически, он работает так, как если бы мы округлили n до ближайшей мощности 2. Это не усложняет реализацию, но заставляет нас увеличить размер массива до 4n.

2

2N + 1 узлы работают с заданным способом поиска детей, если N меньше, чем 2 (или если дерево сбалансировано, а недостающие листовые узлы находятся справа от нижней части строка, аналогичная первой диаграмме дерева в статье). В противном случае удвоение индекса узла для получения его детей пройдет мимо границ массива. Посмотрите на среднюю диаграмму из статьи (дерево с «36» в верхнем узле). У узла «16» будет индекс 6, поэтому его дети будут в узлах 12 и 13. У узла «5» нет детей (которые должны быть в узлах 10 и 11). Эти недостающие узлы все равно должны иметь для них слоты в массиве.

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