多重映射如何在内部处理重复键?
How do multimaps internally handle duplicate keys?
对于地图,我可以理解它被实现为二叉搜索树(例如 red/black 树)及其时间复杂度。
但是对于多映射,内部如何处理键冲突?是否为具有相同键的所有节点维护了一个列表?或者进行一些其他处理。我遇到了一种情况,我可以使用 map<int,vector<strings>>
或 multimap<int,string>
并且想知道权衡。
C++ 规范没有给出 std::multimap
的具体实现,而是给出了 std::multimap
上的操作应该有多快以及对这些操作应该有什么保证的要求。例如,multimap
上的 insert
需要将 key/value 对插入到 multimap
中,并且必须以使其在所有现有条目之后出现的方式插入同一个键。这必须在时间 O(log n) 内工作,特别是如果插入发生时带有提示并且提示是元素应该去的地方之前的位置,则具体分摊 O(1)。有了这些信息,multimap
可以通过具有许多节点的 red/black 树来工作,每个键一个,或者它可以是存储 vector
值的 red/black 树对于每个键。 (不过,这排除了 AVL 树,因为 AVL 树插入中涉及的旋转在分摊的 O(1) 时间内不会 运行。但是,它也允许 2-3-4 树或确定性的东西跳过列表)。
但是,随着我们添加更多要求,某些实现会被排除在外。例如,如果为要擦除的元素提供迭代器,则 erase
操作需要 运行 在摊销常数时间内。这排除了使用带有键和 vector
值的单个节点,但不排除使用带有键和双向链表的值的单个节点。 iterator
类型需要能够取消对 value_type
的引用,它需要匹配基础 allocator
的 value_type
。这排除了您可以在 red/black 树中使用单个键和值的链接列表拥有单个节点的可能性,因为您无法通过这种方式获得对 value_type
的引用。
总的来说,限制是 一个允许的实现 是一棵 red/black 树,每个 key/value 对有一个节点,尽管其他可能是出色地。其他想法 - 例如使用 AVL 树,或将给定键的值合并到 vector
或 list
- 是不可能的。
希望对您有所帮助!
对于地图,我可以理解它被实现为二叉搜索树(例如 red/black 树)及其时间复杂度。
但是对于多映射,内部如何处理键冲突?是否为具有相同键的所有节点维护了一个列表?或者进行一些其他处理。我遇到了一种情况,我可以使用 map<int,vector<strings>>
或 multimap<int,string>
并且想知道权衡。
C++ 规范没有给出 std::multimap
的具体实现,而是给出了 std::multimap
上的操作应该有多快以及对这些操作应该有什么保证的要求。例如,multimap
上的 insert
需要将 key/value 对插入到 multimap
中,并且必须以使其在所有现有条目之后出现的方式插入同一个键。这必须在时间 O(log n) 内工作,特别是如果插入发生时带有提示并且提示是元素应该去的地方之前的位置,则具体分摊 O(1)。有了这些信息,multimap
可以通过具有许多节点的 red/black 树来工作,每个键一个,或者它可以是存储 vector
值的 red/black 树对于每个键。 (不过,这排除了 AVL 树,因为 AVL 树插入中涉及的旋转在分摊的 O(1) 时间内不会 运行。但是,它也允许 2-3-4 树或确定性的东西跳过列表)。
但是,随着我们添加更多要求,某些实现会被排除在外。例如,如果为要擦除的元素提供迭代器,则 erase
操作需要 运行 在摊销常数时间内。这排除了使用带有键和 vector
值的单个节点,但不排除使用带有键和双向链表的值的单个节点。 iterator
类型需要能够取消对 value_type
的引用,它需要匹配基础 allocator
的 value_type
。这排除了您可以在 red/black 树中使用单个键和值的链接列表拥有单个节点的可能性,因为您无法通过这种方式获得对 value_type
的引用。
总的来说,限制是 一个允许的实现 是一棵 red/black 树,每个 key/value 对有一个节点,尽管其他可能是出色地。其他想法 - 例如使用 AVL 树,或将给定键的值合并到 vector
或 list
- 是不可能的。
希望对您有所帮助!