1

Тема: Декартово дерево

Здраствуйте, уважаемые форумчане! Мне нужна помощь. Я не очень разбераюсь в ссылках, указателях... Вообщем, я хотел реализовать этот мощный алгоритм и у меня появиломь много вопросов.  smile  Можно ли реализовать ЕГО с массивами. И вообще кто может немного по подробнее о ссылках, указателях объяснить. Вот мой код: http://pastebin.com/dVnDKEZm

2

Re: Декартово дерево

С массивами реализация намного сложнее чем с ссылками, ссылки и указатели указывают на определенную ячейку в памяти.

3

Re: Декартово дерево

Да, с массивами теоретически можно делать (т.е. везде вместо указателей использовать индексы в массиве). Но вот без ссылок - заметно более громоздко получится.

Компактная реализация сильно использует хитрости массивов/указателей, поэтому без их понимания разобраться в реализации будет непросто.

  • item - это структура данных, представляющая собой одну вершину дерева.

  • pitem - это указатель на структуру item. Такие указатели мы используем, чтобы хранить связи между вершинами: т.е. левый и правый сын каждой вершины - это указатели, указывающие на некоторые другие вершины (или NULL, если не указывает никуда). Да и корень дерева root - тоже указатель, он указывает на вершину-корень. В общем, всё дерево написано на указателях

  • Что вообще такое ссылка в C++. Упрощенное понимание такое: если у функции какой-то параметр является ссылкой, то внутри функции мы можем присваивать этому параметру какое-нибудь значение, и это значение запишется в передаваемую переменную.

  • pitem & - это ссылка на указатель. Это самый сложный для понимания момент. Давайте посмотрим на одно из мест, где это используется: функция split(). Этой функции передаётся дерево t, ключ key, по которому надо разрезать дерево t, а результат этой функции кладётся в параметры l и r. Соответственно, для чего параметры l и r сделаны ссылками на pitem? Например, чтобы мы могли вызвать эту функцию с аргументом l равным t.r, аргументом r равным чему-нибудь ещё, и результат разрезания записался бы в t.r.

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

4

Re: Декартово дерево

Вот мой код, реализующий декартово дерево по неявному ключу с массивом и номерами элементов массива вместо указателей. Думаю, с указателями решение будет всё-таки лучше, но мне такое решение интуитивно более понятно.
http://pastebin.com/HKSBNqZP

Этот код является решением задачи о переворотах детей в ряду и их сумме роста на интервале.