Какая хорошая и стабильная реализация дерева С++?

Мне интересно, может ли кто-нибудь рекомендовать хорошую реализацию дерева С++, надеюсь, тот, который stl совместим, если это возможно.

Для записи я уже много раз писал алгоритмы дерева, и я знаю, что это может быть интересно, но я хочу быть прагматичным и ленивым, если это вообще возможно. Таким образом, фактическая ссылка на рабочее решение является целью здесь.

Примечание. Я ищу родовое дерево, а не сбалансированное дерево или карту/набор, сама структура и связность дерева важны в этом случае не только внутри. Поэтому каждая ветвь должна иметь возможность хранить произвольные объемы данных, и каждая ветвь должна быть отдельно итерационной.

Ответ 1

Я не знаю о ваших требованиях, но не лучше ли вам с графиком (например, реализация в Boost Graph) если вы заинтересованы в основном в структуре и не столько в преимуществах дерева, сколько скорости за счет балансировки? Вы можете "эмулировать" дерево через график, и, возможно, он будет (концептуально) ближе к тому, что вы ищете.

Ответ 2

Посмотрите это.

Библиотека tree.hh для С++ предоставляет STL-подобный контейнерный класс для n-арных деревьев, шаблонизированный над данными, хранящимися в узлах. Предоставляются различные типы итераторов (пост-порядок, предварительный заказ и т.д.). По возможности методы доступа совместимы с STL или доступны альтернативные алгоритмы.

НТН

Ответ 3

Я собираюсь предложить использовать std:: map вместо дерева.

Характеристики сложности дерева:

Вставка:       О (п (п))
Удаление:   O (п (п))
Найти:         O (п (п))

Это те же характеристики, что и гарантии std:: map.
Таким образом, в большинстве реализаций std:: map используется дерево (Red-Black Tree) под обложками (хотя технически это не требуется).

Ответ 4

Хорошо, я нашел еще одну , но еще не пробовал ее

Ответ 5

Если у вас нет пары (ключ, значение), а просто клавиши, используйте std:: set. Это использует одно и то же дерево Red-Black как std:: map.

Ответ 6

Предположим, что вопрос о сбалансированных (в некотором роде, в основном красном черном дереве) бинарных деревьях, даже если это не так.

Сбалансированные двоичные деревья, такие как вектор, позволяют управлять некоторым упорядочением элементов без необходимости ключа (например, вставляя элементы в любом месте вектора), но:

  • С оптимальным O (log (n)) или лучшей сложностью для всех модификаций одного элемента (добавьте/удалите в начале, конце и до и после любого итератора)
  • С стойкостью итераторов через любые модификации, кроме прямого уничтожения элемента, указанного итератором.

Опционально можно поддерживать доступ по индексу, как в векторе (с стоимостью одного size_t по элементу), с сложностью O (log (n)). Если используется, итераторы будут случайными.

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

На практике сбалансированное двоичное дерево имеет интерфейс вектора, списка, двойного связанного списка, карты, multimap, deque, queue, priority_queue... с достижением теоретической оптимальной сложности O (log (n)) для всех операций с одним элементом.

<sarcastic> это, вероятно, почему С++ stl не предлагает его </sarcastic>

Индивидуумы могут не реализовывать общее сбалансированное дерево самостоятельно, из-за трудностей для правильного управления балансировкой, особенно при извлечении элементов.

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