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

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

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

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

12
user982740 24 Авг 2014 в 06:28

2 ответа

Лучший ответ

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

struct node
{
    node* left;
    node* right;

    Key_type key;
    Value_type value;
};

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

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

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

16
Benjamin Lindley 24 Авг 2014 в 06:56

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

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

2
101010 24 Авг 2014 в 06:33
cplusplus.com/reference/map/map "Карты обычно реализуются как бинарный поиск деревья». Хорошо, скажем, если это реализовано с использованием BST, мой вопрос в том, как это реализовано. Как выглядит узел BST? Куда идут ключи?
 – 
user982740
24 Авг 2014 в 06:37
Красно-черное дерево — это структура данных, представляющая собой разновидность самобалансирующегося бинарного дерева поиска. Как реализовано, зависит от исполнителя. О какой реализации вы говорите (например, GCC, Clang, VS)?
 – 
101010
24 Авг 2014 в 06:39
1
@ user982740.... «Карты обычно реализуются в виде двоичных деревьев поиска» нигде не встречается в стандарте C++. Реализация std::map<> остается на усмотрение реализации, если она компилируется в соответствии с правилами, установленными стандартом для (а) ассоциативных контейнеров (C++11 §23.2.4) и (б) конкретными дополнительными требованиями. и исключения для std::map<> (C++11 §23.4.4).
 – 
WhozCraig
24 Авг 2014 в 06:43