- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
二叉树及其应用;二叉树;二叉树的存储结构;二叉树的遍历;二叉树的性质;树、森林转化为二叉树;树的儿子兄弟表示法;;这样我们可以类似于二叉树的链式结构写出树的儿子兄弟表示法的存储结构:
TYPE tree = ^node;
node = record
data : datatype;
parent, child, brother : tree;
// 分别记录父亲、第一个儿子、下一个兄弟
end;;给定m个实数w1, w2,…, wm,(m=2) ,要求一个具有m个外部节点的扩充二叉树,每个外部ki节点有一个wi与之对应,作为它的权,使得带权外部路径长度
最小,其中li是从根到外部节点的路径长度。;算法;讨论;分析;算法;反例;分析原因;改进算法;二叉堆;在堆中插入元素x;;插入 (实际上是不断向上调整的过程);在堆中删除任意一个元素 ;;删除 (实际上是不断向下调整的过程);堆的构造就是不断插入到堆的过程 ;堆的插入.删除;合并果子;【输入文件】
输入文件fruit.in包括两行, 第一行是一个整数n(1=n=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个ai(1=ai=20000)是第i个果子的数目。
【输出文件】
输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。
【样例输入】
3
1 2 9
【样例输出】
15
【数据规模】
对于30%的数据,保证有n=1000;
对于50%的数据,保证有n=5000;
对于全部的数据,保证有n=10000。;合并果子;由于每次要取出最小的两个节点。(一般做法是每更新一次集合,重新排序,时间是O(n2))。由于n=10000,不得不采用数据结构--堆进行优化。 ;任务;分析;分析;加分二叉树 ;加分二叉树;分析;可行算法; 河流;河流;进行了相关的转化之后,设f(i,j,k)表示在新树中,以i结点为根的子树中,分配k个加工厂。并且离i结点最近的加工厂在j结点的情况下。i结点及其子树内的所有产品,加工所需要的费用。
转移方程很容易就可以写出来:
总时间复杂度为O(N2K2)。;二叉排序树(Binary Sort Tree) ;BST的特点;实例;BST的查找;BST的插入;BST插入的递归算法;BST的生成为进行不断插入的过程!!
但在生成BST的时候,可能???由于根结点选择不好,使得树很斜,查找的效率降低,可以使用随机产生根结点的方法,使得BST较平衡,下图就是两棵关键字相同的BST树.;删除;Splay 树;Splay操作;Splay操作 情况1;Splay操作 情况2;Spaly操作 情况3;Splay操作举例;Spaly树基本操作;Pet(湖南省省队选拔赛);Pet;Pet;Pet; 数列操作;如果按题目要求直接模拟:
每一个ADD操作的复杂度是O(1)
每一个SUM操作的复杂度是O(N)
可见对于M次SUM询问,复杂度是O(NM)
有没有更好的方法呢?这里我们提出一种称之为线段树的数据结构。;线段树的定义;线段树的建立;回到原问题;SUM操作;引例 问题的解决;Picture(IOI98);预处理:
如右图所示,用2n条横线与2n条纵线将坐标平面重新进行划分。定义新的坐标轴,并记录每一个“元线段”的长度。这样就只剩下了2n*2n个坐标点,便于今后的计算。
离散化,将2n条矩形的横边和2n条纵边取出来,分别计算;Picture;线段树的插入、删除(1);线段树的插入、删除(2);Picture(IOI98);; 接着考察第三个区间,我们面对的是一个矩形的右边界,因此我们要把它对应的绿色线段从树中删除。
右图的蓝色线段中,圆形圈起来的部分不算到轮廓里面去。究其原因,是因为这个部分和除被删除线段之外的线段有交集。;综合前面的分析,我们得到:
每次插入/删除操作之前,线段树中线段覆盖的总长度是X;之后的总长度是Y。那么应该算入轮廓的长度就是|X-Y|。
关于如何计算“覆盖的总长度”,与引例中计算区间和类似,这里不再赘述。
这样我们就可以通过一遍扫描,计算出所有的纵向轮廓长度。这是只需要把图旋转90度,就可以用同样的方法计算横向轮廓的长度了。;由于每条矩形的边界线段只被扫描一遍,而且扫描的时候进行的插入或删除操作的时间复杂度是O(logn)
所以算法的总时间复杂度是O(nlogn)。
文档评论(0)