查找算法总结(二)

接下来的几种算法属于动态查找结构

三、二叉查找树:
     特点:
     1、如果它的左子树不空,那么左子树上的所有结点值均小于它的根结点值;
     2、如果它的右子树不空,那么右子树上的所有结点值均大于它的根结点值;
     3、它的左右子树也分别为二叉查找树。


二叉查找树的插入和删除都非常的方便,很好的解决了折半查找添加删除所带来的问题。
那么它的效率又如何呢?
很显然,二叉查找树查找一个数据,不需要遍历全部的节点,查找效率确实提高了。但是,也有一个很严重的问题,我在a图中查找8需要比较5次,而在b图中查找8需要3次,更为严重的是,我的二叉查找树是c图,如果再查找8,那将会如何呢?很显然,整棵树就退化成了一个线性结构,此时再查找8,就和顺序查找没什么区别了。
时间复杂度分析:最坏的情况下和顺序查找相同,是O(N),最好的情况下和折半查找相同,是O(logN)。

这说明了一个问题,同样的一组数据集合,不同的添加顺序会导致二叉查找树的结构完全不一样,直接影响到了查找的效率。
那么如何解决这个问题呢?
往后看,还有别的算法呢。二叉查找树的代码分析可以参考另一篇文章《二叉查找树算法专题》

四、平衡二叉树
     上面说了,二叉树在某种情况下会存在效率问题,不同结构的二叉查找树,查找的效率会有很大的不同,那么怎么解决这个问题呢?那就需要最大限度的减小树的深度。
     平衡二叉树的一个很大的优点就是不会出现二叉查找树的最差情况。
     平衡二叉树的时间复杂度是O(logN)。
     接下来看看平衡二叉树的查找、插入,以及删除等操作是如何实现的。
     查找就不多说了,与二叉查找树基本相同;
     那么插入如何呢? 首先第一步是先插入进去,然后,为了保持二叉树的平衡,就需要左旋或者右旋等操作了。
     删除也是同样的道理。 一会儿我们可以通过代码分析左旋右选的实现了,不过你如果想了解左旋右旋的基本概念,那还是在网上查看一下这方面的知识吧。

     知道了优点,那么我们再来分析一下平衡二叉树又有哪些缺陷呢?
     
主要有这么几个缺陷:
1、为了保证高度平衡,动态插入和删除的代价也随之增加,我们可以通过红黑树来实现更高效率的查找结构;
2、所有二叉查找树结构的查找代价都与树高有紧密的联系,能否通过减少树高来进一步的降低查找代价呢?
我们可以通过多路查找树的结构来做到这一点;
3、在大数据量查找环境下,所有的二叉查找树结构(BST,AVL,RBT)都不合适,如此大规模的数据,全部组织成平衡二叉树放入到内存中是不可能的。那么把这棵树放到磁盘中吧,问题又来了。假如构造的平衡二叉树深度有1W层,那么从根节点出发到叶子节点很可能需要1W次的硬盘I/O读写。查找效率在IO读写过程中将会付出巨大的代价。

那个提个问题:
N层平衡二叉树至少多少个结点?

假设F(N)表示N层平衡二叉树的结点个数,则F[1]=1,F[2]=2。而F(N)=F(N-2)+F(N-1)+1 

为什么呢?我们可以这样考虑,假设现在又一个(N-2)层和(N-1)层的最少结点平衡二叉树。 要构造一棵N层的平衡二叉树,则只需加入一个根节点,其左右子树分别(N-2)层和(N-1)层的树即可 。由于两个子树都是最少结点的,所有N层的也是最少结点的。
以前我一直没理解这个问题,后来我画了一个图,立马分析透彻了。

平衡二叉树的代码就不写了,真心难搞啊,网上有很多的资料。

五、红黑树
性质:
     1、每一个节点要么是红色的,要么是黑色的;
     2、根节点是黑色的;
     3、所有叶子节点都是黑色的(实际上都是NULL指针),叶子节点不包含任何关键字信息,所有的关键字信息都存在非终结点上面;
     4、每个红色节点的两个子节点都是黑色的,换句话说:从每个叶子节点到根节点的所有路径不能有两个连续的红色的节点;
     5、从任一节点到每个叶子节点的所有路径都包含相同数目的黑色节点。

相关定理:
     1、从根到叶子节点的最长的可能路径长度不多于最短的可能路径长度的2倍;
     2、红黑树的树高不大于2倍的红黑树的黑深度;
     3、一颗拥有n个内部节点(红黑树的非终结点)的红黑树的树高h<=2log(n+1)。

B树相关的知识请看下一篇文章 《查找算法总结(三)》

文章大部分都是总结于这两篇博客,在加上自己的分析:



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值