【问题标题】:std::map and binary search treestd::map 和二叉搜索树
【发布时间】:2014-10-17 13:08:30
【问题描述】:

我读到std map是使用二叉搜索树数据结构实现的。

BST 是一种顺序数据结构(类似于数组中的元素),它将元素存储在 BST 节点中并按顺序维护元素。例如如果元素小于节点,则将其存储在节点的左侧,如果它大于节点,则将其存储在节点的右侧。通过这种方法,我们实现了各种操作(如搜索、插入等)的 O(log n) 复杂度。

然而,std map 是一个关联容器。我们有一个键和一个值对要插入。它真的是使用 BST 实现的吗?如果是,如何实现?在 BST 中,我们没有任何键或值。它是一种标准容器。

我有点困惑。请帮助我提供澄清。它不会影响我的工作,但我想更好地理解它们。感谢您的帮助。

【问题讨论】:

标签: c++ data-structures stl binary-search-tree


【解决方案1】:

C++ 标准中没有规定应该如何实现std::map。因此,std::map 的底层数据结构是必须由实现者做出的决定。

然而,大多数实现将std::map 实现为红黑树。

【讨论】:

  • cplusplus.com/reference/map/map "地图通常实现为二叉搜索树。"好的,假设它是使用 BST 实现的,我的问题是它是如何实现的。 BST 节点长什么样?钥匙去哪儿了?
  • @user982740 红黑树是一种自平衡二叉搜索树的数据结构。如何实施取决于实施者。您指的是哪个实现(例如 GCC、Clang、VS)?
  • @user982740....“地图通常实现为二叉搜索树”在 C++ 标准中无处出现。 std::map<> 的实现留给实现,只要它符合以下标准规定的规则:(a) 关联容器 (C++11 §23.2.4) 和 (b) 特定的附加要求和例外对于std::map<> (C++11 §23.4.4)。
【解决方案2】:

地图中的节点通常看起来像这样:

struct node
{
    node* left;
    node* right;

    Key_type key;
    Value_type value;
};

正如您所说,您对 BST 的工作原理有一个大致的了解:

如果元素小于节点,则存储在节点左侧,如果元素大于节点,则将其存储在节点右侧。

对于我的node 结构,“元素”是key 成员。因此,比较密钥以确定树的组织。键比较小的节点放在左边,键比较大的节点放在右边。 value 不参与树的组织,它只是补充数据。它只是通过成为同一结构的一部分而与键相关联。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2011-09-16
    • 2021-12-27
    • 2015-06-25
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多