В дополнение к очкам Macneils ...
Красно-черные деревья, возможно, более полезны, потому что есть полезные эффективные операции, которые широко не поддерживаются в стандартных реализациях библиотек, таких как C ++ std::map
(по крайней мере, AFAIK). Красно-черные деревья могут поддерживать «расщепление» (разрезание дерева на два, одно, содержащее ключи меньше указанного ключа, и одно, содержащее ключи больше) и «объединение» (наоборот, объединение дерева больших ключей с деревом маленьких ключи) могут быть выполнены за время O (log n), но если они поддерживаются в стандартных библиотеках контейнеров, это, кажется, хорошо скрыто.
Однако «расширение» структур данных является распространенным явлением. Простой пример - добавление информации о размере поддерева к узлам практически любой древовидной структуры данных для поддержки подписки O (log n). Более сложные примеры включают интервальные деревья.
Как только у вас появится идея дополнения структур данных, появится множество вариантов, которые могут быть полезны для конкретных приложений, и очень немногие из них доступны в виде библиотеки. Существующие структуры данных стандартной библиотеки (например, такие как std::map
) не могут быть дополнены за исключением копирования исходного кода и его прямого изменения - вы не можете дополнить их, используя параметры шаблона.
Конечно, чтобы разработать расширенную структуру данных, вам необходимо понять основную структуру без дополнительных данных.
Деревья AVL могут быть быстрее, чем красно-черные деревья, если вы выполняете намного больше операций поиска, чем вставки / удаления (и при условии, что вам не нужны эти операции разделения / объединения), поэтому в зависимости от приложения они могут быть очень хорошей основой для приумножения.