【问题标题】:A red black tree with the same key multiple times: store collections in the nodes or store them as multiple nodes?多次具有相同键的红黑树:将集合存储在节点中还是将它们存储为多个节点?
【发布时间】:2012-09-20 01:44:28
【问题描述】:

显然你可以做任何一个,但前者更常见。

为什么会选择后者,它是如何工作的?

我读到这个:http://www.drdobbs.com/cpp/stls-red-black-trees/184410531;这让我觉得他们做到了。它说:

insert_always 是一个状态变量,它告诉 rb_tree 是否允许同一键值的多个实例。此变量由构造函数设置,并由 STL 用于区分 set 和 multiset 以及 map 和 multimap。 set 和 map 只能出现一次特定键,而 multiset 和 multimap 可以出现多次。

虽然现在我认为这并不一定意味着。他们可能仍在使用容器。

我认为具有相同键的所有节点都必须排成一行,因为您必须将具有相同键的所有节点存储在右侧或左侧。所以如果你在右边存储相等的节点并插入 1000 个 1 和一个 2,你基本上就会有一个链表,这会破坏红黑树的属性。

我找不到太多关于它的原因是不是一个坏主意?

【问题讨论】:

  • 我不认为排序的搜索树(和哈希)是为了支持重复键而设计的。它们的主要用例是唯一键。
  • 我认为将它们存储为单个节点的原因之一是您可以更轻松地引用它们。我选择使用集合,现在我需要两个迭代器来引用一个键/值对。 (我正在写一个基于红黑树的多图)

标签: data-structures binary-search-tree multimap red-black-tree multiset


【解决方案1】:

根据定义,二叉搜索树不能包含重复项。如果您使用它们来生成排序列表,则丢弃重复项会产生不正确的结果。 当我遇到重复问题时,我正在用 PHP 实现红黑树。我们将使用树进行排序和搜索。 我正在考虑向节点数据类型添加一个出现值。当遇到重复时,只需增加出现次数。当遍历树以产生输出时,只需按出现次数重复该值。我想我仍然会有一个有效的 BST 并避免拥有一整串重复值来保留最佳搜索时间。

【讨论】:

【解决方案2】:

作为多个节点的商店的下侧:

  1. 扩大树的大小,这会使搜索变慢。

  2. 如果要检索键 K 的所有值,则需要 M*log(N) 时间,其中 N 是总节点数,M 是键 K 的值数,除非您引入额外的代码 (这使数据结构复杂化)为这些值实现链表。 (如果存储集合,时间复杂度只取log(N),实现简单)

  3. 删除成本更高。使用多节点方法,每次删除都需要删除节点,但使用集合存储,您只需要在删除键 K 的最后一个值时删除节点 K。

想不出多节点方法有什么好的方面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2014-01-13
    • 2017-02-10
    • 2020-11-29
    • 2020-03-07
    • 1970-01-01
    相关资源
    最近更新 更多