2014-09-01 2 views
0

Я реализую двоичное дерево поиска в C++ 11. Я хочу добавить функцию, которая позволяет отмечать разные версии структуры данных с постоянной временной сложностью.Способ копирования и хранения всех записей в сбалансированном двоичном дереве поиска с помощью O (1)

Что я думал о добавлении другого свойства в корневой узел под названием «имя», «ключ» или «отметка» - таким образом, доступ к O (1). Но, чтобы сохранить версию дерева я бы

  1. создать копию корня (я думал о создании нового экземпляра двоичного дерева поиска и просто присвоить дерево, я хочу, чтобы скопировать этот новый экземпляр)
  2. хранить скопированный корень в массиве

достаточно, если эти сохраненные корни для чтения доступ только. Но теперь мой вопрос: могу ли я выполнить эти 2 шага без добавления временной сложности?

Ниже представлен небольшой эскиз, иллюстрирующий процесс.

enter image description here

Большое спасибо за вашу помощь.

FunkyPeanut

+0

Я не слежу за этим. Если вы создаете новую версию дерева, зачем вам копировать все корни старых версий? Можете ли вы добавить диаграмму или что-то еще, показывая, каковы ваши намерения? –

+0

Эй. Я добавил немного эскиза. Я надеюсь, что это помогает! – FunkyPeanut

+0

Ahh Я понимаю, что вы имеете в виду. Я не хотел писать «каждый корень» ... Я думаю, что я хотел сказать «корень каждого дерева, которое вы хотите скопировать». Я исправлю проблему. Сожалею. – FunkyPeanut

ответ

1

Я думаю, что вы после этого является persistent BST. Это позволяет «копировать» в O (1) время (просто скопировать указатель), выполняя все другие операции BST с теми же большими значениями времени, что и ванильный BST. Основное различие заключается в том, что операции, которые используются для вывода O (1), теперь занимают пространство O (lg n), по крайней мере, когда старая версия дерева была где-то сохранена.

(Вы можете реализовать постоянные структуры данных в C++ довольно легко с shared_ptr.)

+0

Хм ... это довольно интересная структура данных, которую вы представили. Не могли бы вы подробнее рассказать о том, почему сложность времени возрастает при сохранении старой версии? Это просто потому, что есть время поиска для рассмотрения? Даже если он вставлен в массив, где поиск выполняется в O (1)? – FunkyPeanut

+1

@FunkyPeanut: * пространство * сложность меняется. Это потому, что вам нужно перестроить часть дерева отдельно от старой структуры. Обычно вы отбрасываете часть старого дерева (и вы можете настроить его для этого только с постоянным дополнительным пространством), но когда вы храните указатель на старое дерево где-то, все это должно оставаться в памяти. –

+0

Хорошо. Конечно, это имеет смысл. Спасибо, форт. – FunkyPeanut

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