逆序树在求解一维数组最长升序序列问题中的应用

来源 :计算机时代 | 被引量 : 0次 | 上传用户:luo665
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要: 针对一维数组中求最长升序序列问题,在研究树形结构和分析任务需求的基础上,提出采用区别于传统树的逆序树结构进行计算,采用深度优先算法策略查找路径。逆序树采用子节点指向父节点的节点逆序指向方式,在建树过程中不用为每个节点考虑子节点的数量,克服了不可预见的存储分配和节点指向问题,能有效地找出全部升序路径,最终找出一维数组中全局最长的升序序列。在此基础上实现的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(n>0)个元素的有穷集合[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,计数最长路径。在逆序树中,为树的节点定义节点类Node,在Node中记录该节点的父节点Node father,存储该节点元素的值value=array[i],记录节点元素值在数组中的下标tid=i,记录该节点的深度depth=father.depth+1,构造寻找子节点的方法Seekson(Node nn,int array[])。Seekson()是一个递归查找儿子节点的方法,每找到一个叶子节点,即终止该条路径查找,比较该叶子节点的depth与Ldepth,如果depth大于或等于Ldepth则记录该节点,再回退到上一级节点寻找另外的分枝路径。最终输出最长的路径。
  3 程序实现
  该算法用Java编程实现[6]:
  4 结束语
  本文利用逆序树结构,较好地解决了求解一维数组的最长升序序列问题。相对于传统树,逆序树依靠其节点逆序指向的特征,能更加有效地解决需要动态分配存储的问题,所给出的程序执行效率很高。
  参考文献:
  [1] 王敏.基于遍历搜索二叉树中最长路径的算法研究[J].现代电子技
  术,2010.34(8):54-55
  [2] 严蔚敏,吴伟民.数据结构[M].清华大学出版社,1997.
  [3] 刘胡瑶.异构信息资源库的构建及其关键技术实现[J].计算机辅助设
  计与图形学学报,2005.17(3): 578-583
  [4] 王建新.最长路径问题研究进展[J].计算机科学,2009.36(12):1-4
  [5] 王晓东.计算机算法设计与分析[M].电子工业出版社,2005.
  [6] 柯林斯.数据结构与Java类集框架[M].高等教育出版社,2002.
其他文献
英国伦敦大学学院最近发布新闻公告称,包括该校科学家在内的一国际研究小组发现,CDKN1C基因的特殊变异会导致IMAGe综合征,而该基因的变异还与贝威二氏综合征有关。同一基因的不
通过文献资料整理,对中国女子三级跳远一级运动员与健将运动员着地角、瞬间着地膝角、最大缓冲时刻膝角,离地瞬间膝角进行相关分析,从中发现制约中国一级运动员平均成绩的主
1月18日,山东省经济和信息化委员会、山东省信息化工作领导小组办公室组织召开了2010年度山东省政府网站绩效评估工作总结表彰会,对取得优秀成绩的省、市、县三级共50个优秀网
英国媒体消息,根据一项最新研究,石英矿可以帮助科学家预测地震及火山喷发。断层处常有大量的地下水晶沉积物,科学家发现这暗示了地壳的薄弱环节,从而可能引发一场地质上的重大事
本文介绍了Sakai 的背景,并根据郑州大学西亚斯国际学院对Sakai 中的移动学习的使用,分析了Sakai 功能,通过对Android 移动终端和Sakai的结合,探讨了其在移动学习中的应用.
日前,工业和信息化部印发了工信部电子【2010】第638号文件《关:于公布卫星电视广播地面接收设备定点生产资质证书企业名单(第一批)的通告》,文件公布了首批通过工信部组织的卫星
迄今所发现的唯一的戊型肝炎病毒(HEV)中和表位定位于开放读码框架2(ORF2)编码蛋白的第578和第607氨基酸(aa)之间的区域。将对应此区域的基因片段通过一段柔性的甘氨酸铰链与乙型肝
本系统解决了传统水表上门抄表、漏抄、少抄、欠费等一系列问题,实现预先收费-欠费断水,管理中心集中管理的理想管理模式。当用户到供水部门充值后,表内系统收到数据则自动打开
“如果能给六年前的我一个忠告,我会告诉自己:对公司有掌控力的自由,才是最重要的。”
摘 要: 目前,面向对象语言Java已成为Internet上最受欢迎的开发语言之一,许多高校纷纷将Java列为程序设计的核心课程。在多年Java教学经验的基础上,就Java语言的教学,包括教材的选择、开发环境的选取、教学内容的筛选、教学方法的运用、教学实例的选用等问题进行了较为深入的探讨,给出了可行性思路。  关键词: Java; 面向对象; 程序设计课程; 教学方法  中图分类号:G642