本节书摘来自华章计算机《程序设计解题策略》一书中的第1章,第1.7节,作者:吴永辉 王建德 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.7 本章小结
树是一个具有层次结构的集合,一种没有回路的连通图,在程序设计竞赛中,许多试题的数据关系呈现树型结构。为了拓宽读者对树的认识、拓展树的应用范围、掌握更多利用树型结构解题的处理方法,我们在本章中介绍了以往竞赛曾涉及的一些前沿知识:
1) 探讨了如何利用划分树求解整数区间内第k大的值:即先离线构建出整个查询区间的划分树,然后在划分树中查找某子区间中第k大值。这个算法保证能在O(logn)的时间复杂度内快速求出问题解。
2) 通过分析一些蕴涵最小生成树性质的试题,给出了应用最小生成树原理优化算法的一般思路和方法,在此基础上引入了最小生成树的两个拓展——最小度限制生成树和k小生成树,并列举了这两个拓展形式的应用范例。
3) 阐释了用于区间计算的线段树,提出了构建和维护一维线段树的一般方法,并指出避免区间重复操作的一种有效方法是把子树收缩为叶子或让叶子释放出儿子。对这些线段树的时空复杂度、优缺点、适用范围做了比较客观的比较和分析,为读者在什么情况下应该选择什么样的线段树,提供了借鉴思路。
4) 引入了两种“近似平衡”的二叉查找树——伸展树和红黑树,介绍了这两种改进型二叉查找树的基本操作和应用范例,在时间复杂度、空间复杂度、编程复杂度三个方面,比较了它们与其他同类树的优劣。
5) 介绍了一种能够维护一个带权森林、支持边的插入与删除、支持树的合并与分离、支持寻找路径上费用最小边的数据结构——动态树。由于这种树的所有操作的均摊复杂度均为O(logN),且树中所有节点或者部分节点可随需要而动态变动,因此具备了一般静态树无法企及的功能。
6) 推荐了一种可与Fibonacci堆、二叉堆和二项堆“媲美”的优先队列——左偏树,通过介绍左偏树的基本操作和应用范例来展现其编程简单、效率较高的优势。
7) 展示了一种可取代树结构的链接表——跳跃表。跳跃表作为一种新兴的数据结构,以相当高的时空效率显示其魅力。与同样以编程复杂度低而被人喜好的“伸展树”相比,跳跃表的效率不但不会比它差,甚至优于前者。
我们每介绍一种新的树结构或树结构的替代物,就在空间要求、时间效率和编程复杂度三个方面比较其他树结构。之所以要这样做,是因为在程序设计竞赛中,不能一味追求算法有很高的时间效率,而需要在时间复杂度、空间复杂度、编程复杂度三者之间,寻找一个满足竞赛要求和现场条件的“平衡点”。只有在对各种树结构的原理和应用做更广泛地考察、更深入地研究后,才能真正使选中的树结构或树结构的替代物成为帮助你成功解题的一个“利器”。