什么是基于集合的数据结构

时间:2013-10-30 19:42:23

标签: c++ data-structures set

在C ++中,map基于黑红树,因此插入/删除功能将花费O(logn),而hash_map则基于哈希。

但是我在徘徊,基于什么数据结构设置?

Set按地图排序,因此,是否也基于黑红树设置?

它的键和值如何存储在该树中?

如果是这样,unorder_set的数据结构是什么?谢谢!

4 个答案:

答案 0 :(得分:19)

无法保证。标准要求的唯一内容是操作成本,因此实现者可以自由使用他们想要的任何数据结构。通常std::setstd::map是平衡二叉树。

此外,std::unordered_setstd::unordered_map是哈希表。我相信这实际上是由标准保证的,因为你可以手动指定散列函数。

答案 1 :(得分:9)

setmap类型可以实现,但只要它符合C ++规范的时间复杂度要求,它将时间复杂性建立在平衡的二进制上搜索树的时间复杂性。虽然红色/黑色树木在mapset中很常见,但它们并不是唯一的选择。您可以使用AVL树,B树,AA树等实现它们。

希望这有帮助!

答案 2 :(得分:7)

有序关联容器,即std::set<...>std::map<...>及其“多”版本,是基于节点的,具有最坏情况O(ln n)复杂度。这意味着使用了平衡树。除了复杂性之外,当树变异时,指针和迭代器都不会失效(当然,除了erase() d个对象的指针或迭代器之外)。

B-tree遗憾地没有正确的迭代器失效属性(并且对于映射需要重复存储密钥以获得大部分优势,因为使用std::pair<Key, Value>强制表示)。在实践中,似乎红/黑树最有效,但还有其他可能的平衡策略,例如AVL树。跳过列表也可能具有必要的属性。在任何一种情况下,标准都没有强制要求确切的实施策略。

答案 3 :(得分:1)

正如其他人所说,似乎并不能保证标准中的具体实施。但是,标准确实会产生某些性能保证,例如在集合的O(log n)时间内插入,这似乎是您要问的真正问题。