Что такое структура данных, основанная на множестве

В С++ карта основана на черно-красном дереве, поэтому функция insert/delete будет стоить O (logn), а hash_map основан на хеше.

Но я блуждаю, что структура данных установлена ​​на основе?

Set сортируется как карта, поэтому устанавливается также на черно-красном дереве?

Как его ключ и значение хранятся в этом дереве?

И если да, то какая структура данных для unorder_set? Спасибо!

Ответы

Ответ 1

Нет никакой гарантии. Единственное, что стандартные мандаты - это затраты на операции, поэтому разработчики могут свободно использовать любые структуры данных, которые они хотят. Обычно std::set и std::map являются сбалансированными двоичными деревьями.

Кроме того, std::unordered_set и std::unordered_map являются хэш-таблицами. Это, на мой взгляд, фактически гарантировано стандартом, потому что вам разрешено вручную указывать функцию хеширования.

Ответ 2

Типы set и map могут быть реализованы в значительной степени, как бы вы ни хотели, если они соответствуют требованиям временной сложности спецификации С++, которая основывает временные сложности на сложностях сбалансированного двоичного дерева поиска, Хотя красные/черные деревья являются общими для map и set, это не единственные варианты. Вы могли бы использовать их с деревьями AVL, B-деревьями, деревьями AA и т.д.

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

Ответ 3

Упорядоченные ассоциативные контейнеры, т.е. std::set<...> и std::map<...>, и их "несколько" версий, являются node и имеют худший вариант O(ln n). Это означает, что используется сбалансированное дерево. В дополнение к сложности ни указатели, ни итераторы недействительны, когда дерево мутировано (за исключением, конечно, указателей или итераторов объектов erase() d).

B-дерево, к сожалению, не имеет правильных свойств недействительности итератора (а для карт требуется дублировать память ключа, чтобы получить большую часть преимуществ из-за представления силы с помощью std::pair<Key, Value>). На практике кажется, что красно-черные деревья наиболее эффективны, но существуют и другие возможные стратегии балансировки, например, деревья AVL. Список пропусков может также иметь необходимые свойства. В любом случае стандарт не определяет точную стратегию реализации.

Ответ 4

Как говорили другие, нет гарантии какой-либо конкретной реализации в стандарте. Тем не менее, стандарт действительно обеспечивает определенные гарантии производительности, такие как вставка в O (log n) времени для наборов, что, кажется, является реальным вопросом, который вы задаете.