Что такое структура данных, основанная на множестве
В С++ карта основана на черно-красном дереве, поэтому функция 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) времени для наборов, что, кажется, является реальным вопросом, который вы задаете.