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

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

Однако карта std является ассоциированным контейнером. У нас есть пара ключей и значений для вставки. Реализовано ли это на самом деле с использованием BST, и если да, то как? В BST у нас нет ключа или значения. Это своего рода стандартный контейнер.

Я немного запутался. Пожалуйста, помогите мне дать разъяснения. Это не влияет на мою работу, но я хочу их лучше понять. Спасибо за вашу помощь.

11
user982740 24 Авг 2014 в 06:28

2 ответа

Лучший ответ

Узел на карте обычно выглядит примерно так:

struct node
{
    node* left;
    node* right;

    Key_type key;
    Value_type value;
};

У вас есть общее представление о том, как работает BST, как вы сказали:

если элемент меньше узла, сохраните его слева от узла, а если он больше узла, сохраните его справа от узла.

В случае моей структуры node "элементом" является член key. Таким образом, ключи сравниваются, чтобы определить организацию дерева. Узлы, ключи которых сравниваются меньше, чем у родительского узла, помещаются слева, а узлы, ключи которых сравниваются больше, размещаются справа. value не участвует в организации дерева, это просто дополнительные данные. Он связан с ключом, просто являясь частью той же структуры.

15
Benjamin Lindley 24 Авг 2014 в 02:56

В стандарте C ++ нет ничего, что диктовало бы, как должен быть реализован std::map. Следовательно, основная структура данных std::map - это решение, которое должно быть принято разработчиком.

Однако большинство реализаций реализуют std::map как красно-черное дерево.

1
101010 24 Авг 2014 в 02:33