Могу ли я реализовать итератор в двоичном дереве поиска без стека? - PullRequest
1 голос
/ 16 июня 2020

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

Есть ли эффективный способ реализовать итератор без использования стека или очереди?

Под эффективным я подразумеваю возможность найти следующий элемент в сложности O (1).

Ответы [ 2 ]

3 голосов
/ 17 июня 2020

Представьте себе идеальное дерево высотой h . Когда итератор находится на первом узле (крайнем левом листе), ему нужно будет каким-то образом запомнить, с помощью каких внутренних узлов он прибыл в этот узел, потому что на одном из следующих шагов ему нужно будет получить значения в этих узлах (и их правые поддеревья). Поскольку указатели на родительские узлы отсутствуют, эта информация недоступна и должна где-то храниться.

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

Как отмечено в комментариях ниже, для сохранения только направлений потребуется снова пройти по пути от root на каждом этапе итерации. В качестве альтернативы вы можете запомнить последнее посещенное значение и использовать двоичный поиск, чтобы найти следующий узел. Если все значения в дереве уникальны, тогда размер памяти фактических значений будет иметь, по крайней мере, тот же порядок величины, что и компактное представление пути (побитовое лево-лево-лево ...), так что в любом случае (сохранение пути , или последнее посещенное значение) требования к хранилищу аналогичны.

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

Поскольку количество атомов в наблюдаемой Вселенной оценивается в 2 250 , вы можете работать и с этим, и вместо этого использовать 256-битное целое число без знака (два длинных). Компьютерная память никогда не сможет сохранить идеальное дерево такой высоты.

1 голос
/ 16 июня 2020

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

В этом случае ответ должен быть нет , исходя из принципа «голубятни». Проблема в том, что до тех пор, пока вы не обработаете последний узел, невозможно предсказать, сколько узлов останется и как они связаны. Существует буквально бесконечное количество вариантов, но напрямую доступная информация ограничена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...