树是一种伟大的数据结构

这篇文章用来简单聊聊“树”这种数据结构,我不想罗列太多的概念,只是讲一讲近期学习新产生的理解和体会。如标题所说,树是一种伟大的数据结构,那么它伟大在哪里呢?我认为树的伟大之处,就在于使用了树,可以让很多看起来不可能做到的事情变成了可能!

只是凭借直观的想象可能难以感受得到,我就先列举一个树的应用的例子,然后在用简单的数字说明一下,相信就会有很深的体会了。树在查找领域有广泛的应用,我就用二叉查找树来讲吧。相信大家都知道大名鼎鼎的二分查找,二分查找可以极大的降低查找所需的时间复杂度。比方说在N个数据中查找某个值key,如果使用顺序查找,可分成两种情况:一种是查找可以命中,在最坏情况下需要N次比较(从第一个比较到最后一个)。第二种是查找无法命中,即这N个数据中根本就没有要查找的key,那么计算机也需要把这N个数据都比较一次才能知道其中没有要查找的key。所以当数据量非常大,比如1000万、1亿、10亿甚至更大时,顺序查找的耗时可能根本无法接受。于是二分查找就派上用场了。

使用二分查找可以将比较次数降低到对数级别(每次都将查找范围减半),在N个数据中查找指定的key最多只需要logN(以2为底)+1次比较,无论查找是否命中。于是在128个数据中查找最多需要8次比较,而顺序查找在最坏情况下需要128次比较,即使平均情况也需要60多次。这个比较还不明显,但是当N等于10亿的时候,效果就非常明显了。这时候二分查找最多需要30次比较(2的30次幂大于10亿),而顺序查找呢,很明显了吧,二分查找将查找效率提升了将近1亿倍,一亿倍是什么概念大家可以感受下,这就是线性级别和对数级别的差距。但是二分查找需要一个前提,就是数据必须是有序的。我们知道要维持一个不断有新数据插入的数组有序需要付出很高昂的代价。于是就有了二叉查找树这种数据结构,可以在不断插入数据的过程中维持树有序,付出的代价也可以接受。这就是树的好处,在一颗完全二叉树中,只有N达到了2的k次幂的时候,树高才会加一,所以树高和N是一个对数关系,有10亿个结点的完全二叉树,树高也不超过30。但是仍有一个缺点,就是最终形成的树可能过于不平衡,如果这样就体现不出二分查找的优势,那解决办法是什么呢?

红黑树便进入了人们的视野,红黑树是平衡的二叉查找树,它可以对比于2-3查找树,这种树有两种结点,一种是2叉结点,一种是3叉结点,3叉结点可以看作是红黑树中红结点和它的父结点组成的结点。红黑树中可以认为每个红色结点和它的父结点高度相同,可以通过左旋、右旋和变色三种操作来实现平衡。具体的实现请看红黑树,这里不再具体介绍。这样,无论数据插入的顺序如何,红黑树都几乎是完美平衡的。于是就实现了对数级别的插入和对数级别的查找。所以即使数据量达到了上千亿,我们的计算机也只不过需要比较几十次而已,这样,称之为伟大的数据结构,不足为过吧。

以上仅仅是自己的一点体会,但是自身水平有限,文中表述若有偏颇,还望读者能够批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值