Использование красных черных деревьев для сортировки

наихудшее время выполнения вставки на red-black tree is O(lg n) и если я делаю in-order walk на дереве я по существу посещаю каждый узел, поэтому общая наихудшая среда выполнения для печати отсортированной коллекции будет O (n lg n)

мне любопытно, почему red-black trees не рекомендуется для сортировки по quick sort (чье среднее время работы в случае O(n lg n).

Я вижу, что может быть, потому что red-black trees не сортируйте на месте, но я не уверен, поэтому, возможно, кто-то может помочь.

6 ответов


знание того, какой алгоритм сортировки работает лучше, действительно зависит от ваших данных и ситуации.

Если вы говорите в общих / практических терминах,

Quicksort (тот, где вы выбираете ось случайным образом/просто выберите один фиксированный, что делает худший случай Omega (n^2)) может быть лучше, чем красно-черные деревья, потому что (не обязательно в порядке важности)

  • Quicksort на месте. Держит низкий след памяти. Скажите, что эта процедура quicksort была часть программы, которая имеет дело с большим количеством данных. Если вы продолжаете использовать большой объем памяти, ваша ОС может начать замену памяти процесса и мусор perf.

  • доступ к памяти Quicksort локализован. Это хорошо играет с кэшированием / обменом.

  • Quicksort можно легко распараллелить (вероятно, более актуально в эти дни).

  • Если вы попытаетесь оптимизировать сортировку двоичного дерева (используя двоичное дерево без балансировка) используя массив вместо этого, вы в конечном итоге сделаете что-то вроде Quicksort!

  • красно-черные деревья имеют накладные расходы памяти. Вы должны выделить узлы, возможно, несколько раз, требования к памяти с деревьев удваивает/втройне, что с помощью массивов.

  • после сортировки, скажем, вы хотели 1045-й (скажем) элемент, вам нужно будет поддерживать статистику порядка в дереве (дополнительная стоимость памяти из-за этого), и у вас будет доступ O(logn) время!

  • красно-черные деревья имеют накладные расходы только для доступа к следующему элементу (поиск указателя)

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

  • вращение в красно-черных деревьях увеличит постоянный коэффициент в O (nlogn).

  • возможно, самая важная причина (но не действительна, если у вас есть lib и т. д.), Quicksort очень простой для понимания и реализации. Даже школьник может это понять!

Я бы сказал, что вы пытаетесь измерить оба варианта и посмотреть, что происходит!

кроме того, Боб Седжвик сделал диссертацию по quicksort! Может, стоит почитать.


существует множество алгоритмов сортировки, которые в худшем случае O(n log n) - например, сортировка слиянием. Причина, по которой quicksort предпочтительнее, заключается в том, что он быстрее на практике, хотя алгоритмически он может быть не так хорош, как некоторые другие алгоритмы.

часто встроенные сорта используют комбинацию различных методов в зависимости от значений n.


есть много случаев, когда красные деревья не плохи для сортировки. Мое тестирование показало, по сравнению с естественным слиянием, что красно-черные деревья превосходят где:

деревья лучше для Dups: Все тесты, где дубликатов необходимо отменить, алгоритм дерева лучше. Это не удивительно, так как дерево может быть очень маленьким с самого начала, в результате чего алгоритмы, предназначенные для сортировки встроенного массива, могут проходить вокруг больших сегментов дольше время.

деревья лучше для случайным: Все тесты со случайным, древовидным алгоритмом лучше. Это также не удивительно, так как в дереве расстояние между элементами короче и смещение не требуется. Поэтому многократная вставка в дерево может потребовать меньше усилий, чем сортировка массива.

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

Гист с тесты здесь.

С. п.: Следует отметить, что использование деревьев для сортировки-задача нетривиальная. Нужно не только предоставить процедуру вставки, но и процедуру, которая может линеаризовать дерево обратно в массив. В настоящее время мы используем get_last и процедуру предшественника, которая не нуждается в стеке. Но эти процедуры не являются O (1), поскольку они содержат циклы.


меры сложности времени Big-O обычно не учитывают скалярные факторы, например, O(2n) и O(4n) обычно просто сводятся к O(n). Анализ сложности времени основан на операционных шагах на алгоритмическом уровне, а не на строгом программном уровне, т. е. без исходного кода или собственных соображений машинной инструкции.

Quicksort обычно быстрее, чем сортировка на основе дерева, так как (1) методы имеют одинаковую алгоритмическую сложность среднего времени и (2) поиск и операции замены требуют меньше программных команд и доступа к данным при работе с простыми массивами, чем с красно-черными деревьями, даже если дерево использует базовую реализацию на основе массива. Поддержание ограничений красно-черного дерева требует дополнительных рабочих шагов, хранения/доступа к значениям полей данных (цвета узлов) и т. д., чем простые шаги обмена разделами массива quicksort.

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

некоторые другие практические соображения, связанные с архитектурой кратко обсуждаются в разделе статья Quicksort в Википедии


Как правило, представления алгоритмов O(nlgn) могут быть расширены до A*nlgn + B, где A и B являются константами. Существует много алгоритмических доказательств, которые показывают, что коэффициенты для quicksort меньше, чем у других алгоритмов. Это в лучшем случае (быстрая сортировка ужасно работает с отсортированными данными).


Привет, лучший способ объяснить разницу между всеми сортировки на мой взгляд. (Мой ответ для людей, которые путают, насколько быстрая сортировка быстрее на практике, чем другая сортировка).

"думаю, что вы работаете на очень медленном компьютере".

  1. первая вещь одна сравнивая деятельность принимает 1 час.
  2. одна перенося деятельность принимает 2 часа.

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

теперь из всех операций сортировки quick-sort имеют очень мало сравнений и очень меньше замены элементов.

быстрая сортировка быстрее по этой основной причине.