【问题标题】:Performance specification for handling duplicate keys in a binary search tree处理二叉搜索树中重复键的性能规范
【发布时间】:2015-04-01 19:19:25
【问题描述】:

我正在阅读算法简介一书,寻找在二叉搜索树中处理重复键的最佳方法。

这个用例提到了几种方法:

  1. 在节点x处保留一个布尔标志x:b,并根据x:b的值将x设置为x:leftx:right,在FALSE和@之间交替987654328@每次我们 访问x,同时插入与x具有相同键的节点。

  2. x 保留一个具有相同键的节点列表,并将´ 插入列表中。

  3. x 随机设置为x:leftx:right

我了解每个实现都有自己的性能命中/未命中,STL 的实现可能与 Boost Containers 不同。

C++11 规范中是否提到了处理重复键的最差时间性能的性能界限,比如multimap

【问题讨论】:

  • FWIW,我是选项 2 的粉丝 - 尽管每个节点可能需要一个额外的指针,但它清楚地向可能正在检查/维护您的代码的其他人说明了您的意图。
  • 是的,即使我更喜欢那样,但它会在时间上是线性的,而且正如你所提到的,也会导致一些空间开销。
  • 如果你这样做是为了好玩,那么没有区别。如果您关心性能,那么多图和多集的“无序”、“侵入”和“平面”版本通常会胜过基于二叉树的版本。
  • @basav 保留一个列表不会增加时间复杂度,因为根据定义,您永远不需要扫描列表中的单个特定项目。
  • 知道了。因为所有的值都映射到同一个键,不需要包含在时间复杂度中..

标签: c++ algorithm boost stl


【解决方案1】:

在插入/删除时间方面,2 总是更好,因为它不会增加树的大小,并且在您插入或删除重复项时不需要复杂的结构更改。

如果重复数量较少,选项 3 是空间最优的。

选项 1 将需要存储 1 个额外的信息位(在大多数实现中需要 2 个字节),但与 1 相比,树的高度将是最佳的。

TL;DR:实现 2 有点困难,但如果重复的数量很大,则值得。否则使用 3。我不会使用 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2023-03-08
    • 2012-06-05
    相关资源
    最近更新 更多