insert_equal_upper_bound和insert_equal_lower_bound

时间:2015-07-22 06:17:12

标签: boost

根据this帖子,我尝试使用 Boost 库实现red-black treethis页面中的示例使用两个不同的函数来在树中插入节点。功能如下:

//Now insert node "two" in the tree using the sorting functor
algo::insert_equal_upper_bound(&header, &two, node_ptr_compare());

//Now insert node "three" in the tree using the sorting functor
algo::insert_equal_lower_bound(&header, &three, node_ptr_compare());

我查看了here以获取更多信息,我发现insert_equal也是如此:

template<typename NodePtrCompare> 
static node_ptr 
    insert_equal(const node_ptr & header, const node_ptr & hint, 
              const node_ptr & new_node, NodePtrCompare comp);

以下是这三个功能的描述:

insert_equal_upper_bound:根据&#34; comp&#34;将new_node插入到上限之前的树中。

insert_equal_lower_bound:根据&#34; comp&#34;将new_node插入到下限之前的树中。

insert_equal:使用&#34; hint&#34;将new_node插入树中。作为它将被插入的提示。如果&#34;暗示&#34;是插入需要恒定时间的upper_bound(在最坏的情况下是两次比较)。

但我不明白这三个功能之间的区别。红黑树不是一棵(几乎)平衡的树吗?使用这些函数插入节点后它会保持平衡吗?我应该使用哪一个?

1 个答案:

答案 0 :(得分:1)

是的,所有这些(模数错误)都会保持树的平衡。

然而,暂时忽略树形结构,并且更容易理解它们的作用。将它视为一个简单的线性集合,例如:

1 3 3 6 6 7 8 8 9

现在让我们假设您要在集合中插入另一个8。如果您使用insert_equal_lower_bound,它会在之前插入新的8 ,而这些<{em>}已经在集合中。

如果您使用8insert_equal_upper_bound,那么新的insert_equal将在已经在集合中的最后一个8后插入。这里的不同之处在于8允许您指定关于您认为插入位置的“提示” - 如果该提示正确,则会为插入提供缓慢的常量复杂性(而不是您获得的对数复杂度)没有提示)。