Куча или Красно-Черное дерево?

Я готов использовать структуру данных как буфер переполнения постоянного пространства. Я хочу иметь эффективную вставку, но самое важное - эффективное удаление элемента min. Я думал использовать кучу, так как у меня есть O (log (n)) find_min() и log (n) вставка и удаление. С другой стороны, я знаю, что не понимаю преимущества по сравнению с красно-черным деревом, так как у него также есть O (log (n)) insert и delete, но O (1) find min/max. И преимущество сортированного вывода (меня это не волнует).

Вопрос связан с: Является ли красно-черным деревом идеальная структура данных?

Так как у меня есть обе структуры, доступные из std:: map и из boost:: heap, почему я предпочитаю использовать кучу вместо красно-черного дерева? Наконец, используя красно-черное дерево, у меня также есть O (log (n)) время поиска для записи, а для кучи время O (n), что важно, поскольку существуют дубликаты.

Ответ 1

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

  • Двоичные кучи - это очень быстрые структуры данных для вставки значений и получения минимального значения. Однако они не поддерживают эффективный поиск или удаление случайных значений.

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

Если вам нужно только вставить, найти-минимум и удалить-минимум, двоичная куча, вероятно, является лучшим выбором, потому что накладные расходы ниже, а время выполнения должно быть быстрее. Если вам нужно вставлять и удалять произвольные значения или искать произвольные значения, лучше всего выбрать красное/черное дерево. Как и во всех технических разработках, выбор правильной структуры данных связан с компромиссами.

Также обратите внимание, что вы можете использовать std::priority_queue, если вам нужна двоичная куча; вам не нужно использовать Boost. Также не гарантировано, что std::map является красным/черным деревом; это, вероятно, какой-то сбалансированный BST, но он может быть сбалансирован с использованием какого-то другого алгоритма.

Надеюсь, это поможет!

Ответ 2

Куча легко реализуется в смежной памяти, то есть в массиве. Красно-черное дерево обычно построено с отдельным распределением кучи для каждого node. Красно-черное дерево заканчивается доступом к памяти по всей куче для каждого обхода дерева. Это худшее поведение кэша. Несмотря на то, что алгоритмическая сложность некоторых операций одинакова для обеих структур, постоянные накладные расходы для красно-черного дерева намного выше.