潍坊市论坛

首页 » 分类 » 常识 » 迎接数据的恶意平衡树
TUhjnbcbe - 2021/3/1 18:20:00
北京哪里治疗白癜风医院 http://m.39.net/pf/bdfyy/bjzkbdfyy/
世界虽然不一定是恶意满满的,但是如果我们真的认为,整个世界都是如同童话世界一样美好的话,那么也实在是有点图样图森破了。无论如何,在这个世界上生存,我们都要时刻做好准备,迎接可能到来的,世界的恶意。我们不能因为一时遇到的恶意,就失去对未来的希望,但同样也不能太过于简单天真,以至于被恶意击垮——必须时刻做好,保护自己的准备。大家可能又要以为,某蒜厂临时工又在卖情怀灌鸡汤了——然而咱说的可不是“鸡汤”之类的虚无缥缈的东西,而是我们正在学习的数据结构哦!你一定会觉得,数据结构跟“世界的恶意”没有什么关系——可事实却并非如此:我们在学习数据结构的过程中使用的数据集,往往都是相对简单而“正常”的,使用简单的数据结构与算法就可以轻松解决。然而在实际的生产生活中,我们将会遇到的数据集可远远没有那么简单——可能是因为某个生产力应用场景本身所具有的特质,也可能是因为有人闲得蛋疼或者干脆就是存心想要让你的程序崩溃——你的程序和数据结构,往往要面临比课本上的示例更加庞大而复杂的数据集。而让你的程序可以轻松应对这些复杂情况,在任何条件下都能正常工作,则是身为开发者的你,所应该尽到的责任。我们之前已经学习过顺序表和链表这两种数据结构,自然也应该知道这两者的对比:顺序表的优势,在于静态操作(比如查找),而链表的优势,在于动态操作(插入与删除)。毫无疑问,现实中的很多应用场景下,我们都需要同时兼顾静态与动态两种操作——单独的顺序表,与单独的链表,都不是合适的选择。

为此,我们学习了树这种介于线性与非线性之间的结构,并在此基础上,引入了二叉搜索树这种经典的数据结构。

我们已经知道,二叉搜索树整合了顺序表和链表的特点,平均而言,不管是查找这种静态操作,还是插入之类的动态操作,都可以把平均时间复杂度控制在O(lgN)的水平,显著地优于两种静态结构。然而,回到我们开篇提出的问题,普通的二叉搜索树本身,并不足以应对“世界的恶意”:

如图所示,如果我们按照从小到大的顺序,把一系列数据依次插入到普通的BST结构中的话,最后我们会得到这样的结果。严格按照定义来看的话,这是一个SizeBalancedTree吗?显然是的——然而实际上,我们可以很明显地看出,它已经彻底退化成了一个链表结构,SizeBalancedTree本来应该具有的性能优势已经荡然无存。为此,我们需要提高这个SizeBalancedTree的姿势水平,让它可以应对“世界的恶意”——具体地说,就是要对其进行改进,使它具有“自平衡”能力,成为一个平衡二叉搜索树BBST。通过各种对树的形态的限制,和对应的调整方法,我们可以让树的深度不会变得太大,不至于使得查询的时间复杂度退化到O(n)。比如刚才的排序二叉树,如果将这棵树“调整”一下,可以得到下面这棵树:此时SizeBalancedTree的高度降低到了3,查询的效率显然就此提升了不少。这一章我们将具体介绍一种经典的BBST——AVL树,以及一种由我国竞赛选手发明的,设计巧妙的平衡树——SizeBalancedTree。欢迎大家来学习《CS:数据结构》第八章《平衡树》!预览时标签不可点收录于话题#个上一篇下一篇
1
查看完整版本: 迎接数据的恶意平衡树