红黑树的插入和遍历时间复杂度分析

本文分析了红黑树插入元素和使用迭代器遍历的时间复杂度。红黑树插入操作的时间复杂度为log(N),构建含有N个元素的红黑树总时间复杂度为Nlog(N)。而遍历红黑树的时间复杂度为O(N),与遍历数组相同。通过理论分析和程序实验证明了这一结论。
摘要由CSDN通过智能技术生成

红黑树的插入和遍历时间复杂度分析

 

       在平常的工作中,最常用的一种数据结构恐怕是std::map了。因此对其的时间复杂度分析是有必要的,编写程序时做到心中有底。

 

一、理论分析

       在stl中std::map和std::set都采用红黑树的方式实现。我们知道插入一个元素到红黑树的时间为log(N),其中N为当前红黑树的元素个数,因此,采用插入方式构建元素个数为N的红黑树的时间复杂度为:

              log(1) + log(2) + log(N-1) = log((N-1)!) = Nlog(N)

 

       那么采用迭代器遍历一棵红黑树的时间复杂度是多少呢? 是O(N)。 也就是说非递归遍历一棵红黑树的时间复杂度和遍历数组的时间复杂度是一样的,多么令人惊奇的结果。

       我们将分析得出这一结果。采用迭代器遍历红黑树的算法主要在迭代器增1操作:

 

1.       判断右子树是不是空,如果不为空,找到右子树的最小值begin(right(tree)),结束。如果右子树为空,如果右子树为空,转2;

2.       往根节点爬,直到父节点为空或者本节点是父节点的左子节点,然后取父节点的值。

 

我们将证明红黑树的一条边最多被访问两次:一条边最多只能被从父节点到子节点访问一次和从子节点到父节点访问一次。如果有第三次访问,注意到我们的遍历过程是完全无状态的(步骤1和2判断的唯一是根据当前节点,没有任何其余状态变量)。那么必然会导致至少一个访问的重复,与现实矛盾。证明出一条边最多被访问两次。另外一条边最小要被访问一次,原因是很显然的。因此二叉树的遍历是O(E)的,其中E为树的边数,我们知道一个节点的节点数和边数的关系为N = E + 1,故得出迭代器遍历一棵红黑树的时间复杂度是O(N)。

 

二、实验证明

 

       空口无凭,下面采用程序测试理论是否和实际相符。采用std::set<int>做为实验对象,对其分别插入和遍历10000、100000、1000000和10000000次,得到的时间消耗如下表:

 

单位/微秒

 

插入

遍历

10000次

9070

111

100000次

</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值