- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
逆序树在求解一维数组最长升序序列问题中应用
逆序树在求解一维数组最长升序序列问题中应用摘 要: 针对一维数组中求最长升序序列问题,在研究树形结构和分析任务需求的基础上,提出采用区别于传统树的逆序树结构进行计算,采用深度优先算法策略查找路径。逆序树采用子节点指向父节点的节点逆序指向方式,在建树过程中不用为每个节点考虑子节点的数量,克服了不可预见的存储分配和节点指向问题,能有效地找出全部升序路径,最终找出一维数组中全局最长的升序序列。在此基础上实现的Java程序验证了逆序树结构的有效性。
关键词: 逆序树; 传统树; 节点; 深度优先; 最长升序序列
中图分类号:TP312 文献标志码:A 文章编号:1006-8228(2013)03-37-02
0 引言
在算法设计中,经常有求解最长升序序列的问题,本文以求解一维数组中最长升序序列为例,对由n个随机数组成的一维数组,如int array[]={3,18,7,14,10,12,23,41,16,24,59,37},找出其中的最长升序序列,升序的各元素可以不相邻。
1 求解分析
寻找最长的升序序列,前提是先找出所有的升序序列,再从中选出最长的序列,也就是包含节点最多的序列。根据问题的需要,初步判断用深度优先的策略,以树为结构进行查找。对一维数组中的每一个元素,以其作为根节点,搜索数组中后续比其大的元素作子节点建树,都可能产生一棵枝繁叶茂的树;从每棵树中选出从根节点到叶子节点最长的路径作为数组中由该元素开始的最长升序序列;遍历所有创建的树,再从这些局部最长升序序列中选出全局最长的升序序列[1]。全局最长的升序序列可能存在多个。
求解最长升序序列的过程,就是创建节点值递增的树的过程。在创建树的过程中,对树的每一个节点,不能预先判断其有多少个子节点,或者有没有子节点,但能清楚地确定其父节点。鉴于此,采用节点顺序指向的传统树结构不利于问题求解,确定以逆序指向的逆序树结构来求解问题,以深度优先为计算策略。
1.1 传统树
树(tree)是包含n(n0)个元素的有穷集合[2],其中:
⑴ 每个元素称为节点(node);
⑵ 有一个特定的节点被称为根节点或树根(root);
⑶ 除根节点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1=i=m)本身也是一棵树,被称作原树的子树(subtree)。
树具有以下特点:
⑴ 每个节点有零个或多个子节点;
⑵ 没有子节点的节点称为叶子节点;
⑶ 每个节点只有一个父节点;
⑷ 没有父节点的节点称为根节点。
本文将上述数据结构教材中描述的树称为“传统树”,以示区别。
在传统树结构中,一棵树由根(root)节点开始,根节点的层数为1,根节点指向2层节点,2层节点是根节点的子(son)节点,根节点是2层节点的父(father)节点;2层中的每一个节点各自指向3层节点中自己的子节点,以此类推。
1.2 逆序树
这里求解最长升序序列,即寻找树中的最长路径。对树中的每一个节点,并不能预先确定选择数组中哪一个数为其子节点会产生最长路径,因此只有选择数组中序号在其后、值比其大的全部的数来创建子节点,进而产生全部可能的路径,再从中选出最长的路径。这种情况下,采用传统树的父节点指向子节点的顺序方式,需要占用大量的存储空间来记录每个节点的子节点及其编号,更需要动态增量空间来记录子节点的子节点[3]。考虑到每一个节点的父节点是确定并且惟一的,采取子节点指向父节点的逆序方式,树中节点的指向顺序与传统的父节点指向子节点相反,本文将这种节点逆序指向的树称为逆序树,将节点所在的层数称为节点的深度[4]。
用逆序树求解最长路径,克服了传统树父节点对多个子节点的复杂指向问题,避免了为不可预见的子节点动态分配存储空间的问题,能获得比传统树更高的效率。以文中求解问题的简略搜索路径为例,传统树与逆序树结构对比如图1、图2所示。
1.3 深度优先
本问题求解的是最长升序序列,采用逆序树结构,寻找树中最长的路径,也就是寻找深度最大的节点。采用深度优先策略[5],从树中根节点出发,沿每一条路径找到叶子节点,再回退到上一层节点,沿另外的分枝路径寻找下一层节点,直至找到叶子节点……。创建树的过程,即是递归地为每一个节点寻找子节点的过程;对数组中的每一个元素,动态地创建子树,最终完成整棵树的创建。在递归过程中,对节点深度进行计算和选择性存储,只选择那些深度更大的叶子节点及其到根节点的完整路径进行存储。存储的过程只关注节点深度,不关注广度。
2 算法设计
定义全局变量Ldepth,记录最大的节点深度;定义全局变量count_longest,计数最长路径
文档评论(0)