【发布时间】:2015-04-01 19:19:25
【问题描述】:
我正在阅读算法简介一书,寻找在二叉搜索树中处理重复键的最佳方法。
这个用例提到了几种方法:
在节点
x处保留一个布尔标志x:b,并根据x:b的值将x设置为x:left或x:right,在FALSE和@之间交替987654328@每次我们 访问x,同时插入与x具有相同键的节点。在
x保留一个具有相同键的节点列表,并将´ 插入列表中。将
x随机设置为x:left或x:right。
我了解每个实现都有自己的性能命中/未命中,STL 的实现可能与 Boost Containers 不同。
C++11 规范中是否提到了处理重复键的最差时间性能的性能界限,比如multimap?
【问题讨论】:
-
FWIW,我是选项 2 的粉丝 - 尽管每个节点可能需要一个额外的指针,但它清楚地向可能正在检查/维护您的代码的其他人说明了您的意图。
-
是的,即使我更喜欢那样,但它会在时间上是线性的,而且正如你所提到的,也会导致一些空间开销。
-
如果你这样做是为了好玩,那么没有区别。如果您关心性能,那么多图和多集的“无序”、“侵入”和“平面”版本通常会胜过基于二叉树的版本。
-
@basav 保留一个列表不会增加时间复杂度,因为根据定义,您永远不需要扫描列表中的单个特定项目。
-
知道了。因为所有的值都映射到同一个键,不需要包含在时间复杂度中..