算法论文(二叉树排序).docVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE 1 二叉树后序非递归遍历多核程序设计 摘要: 遍历二叉树是二叉树一种重要的运算,遍历的方法也有很多种,这里我主要采用的遍历方式是二叉树后序非递归遍历,在遍历的过程中先遍历左子树在遍历右子树,最后遍历根结点。与单核环境下串行的速度相比,在多核中并行运行程序所花费的时间有所缩减,速度也有所提高。所以在我完成的串行程序中添加了循环并行化指导语句,实现了程序的并行化。这样有利于提高二叉树后序非递归遍历的运行速度,达到让程序运行花费更短时间的目的。除此之外,还提高了CPU的利用率,缩短了循环所需要的时间。 关键词 多核,循环并行化,OpenMP,二叉树后序遍历,加速比。 引言: OpenMP的规范由SGI发起,它是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。OpenMP是一种共享内存并行的应用程序编程接口。所有的处理器都被连接到一个共享的内存单元上,处理器在访问内存的时候使用的是相同的内存编址空间。由于内存是共享的,因此,某一处理器写入内存的数据会立刻被其它处理器访问到。OpenMP的重要性在于,它能够为编写多线程程序提供一种简单的方法,而无需程序员进行复杂的线程创建、同步、负载平衡和销毁工作。循环并行化是使用OpenMP并行化程序的最重要部分。由于大量科学计算程序将很大一部分的的时间用在处理循环计算上,而对于循环并行化处理来说,这一部分的应用非常关键,因此循环并行化在OpenMP应用程序中是一个相对独立且非常重要的组成部分。本文中通过实现二叉树非递归后序遍历的循环并行化,与并行之前的串行程序进行比较,分别求出串并行时间,并得出加速比。 理论分析 后序遍历是 二叉树遍历的一种。后序遍历指在访问根结点、遍历左子树与遍历右子树三者中,首先遍历左子树,然后遍历右子树,最后遍历访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。后序遍历有 递归算法和非递归 算法两种。而在本文中我采用的是二叉树后序的非递归方法。 后序遍历过程如下图所示: 二.实验运行环境及硬件 系统:Windows7 环境:visual studio 2008 三.实验原理和方法 1.串行算法的设计: (1)二叉树后序遍历的思想: 从根节点开始,沿左子树一直走到没有左孩子的节点为止,并将所经[节点]的地址第一次进栈;当找到没有左孩子的节点时,此节点的左子树已访问完毕;从栈顶退出该节点,判断该节点是否为第一次进栈,如是,再将所经[节点]的地址第二次进栈,并沿该节点的右子树一直走到没有右孩子的节点为止,如否,则访问该节点;此时,该节点的左、右子树都已完全遍历,且令指针p = NULL; (2)建立二叉树 typedef int datatype; //链式存储二叉树 typedef struct node {datatype data; struct node *lchild,*rchild; }bitree; bitree *Q[maxsize],*root,*t; int n; bitree *buildtree() //建二叉树,函数返回指向根的指针 {datatype a[N];bitree *s;n=0; root=NULL; int i; for(i=0;iN;i++) {a[i]=rand();} //随机生成结点 for(i=0;iN;i++) { s=NULL; s=(bitree *)malloc(sizeof(bitree)); s-data=a[i]; s-lchild=NULL; s-rchild=NULL; n++; Q[n]=s; if(n==1) root=s; else if(sQ[n/2]) {if(n%2==0) Q[n/2]-lchild=s; else Q[n/2]-rchild=s; } } return root; //返回根指针 } (3)构造非递归后序遍历函数 void fpostorder() //非递归函数 {bitree *a[maxsize],*p; int flag,top;top=-1;flag=0; do {while(t) {top++;a[top]=t;t=t-lchild;} //找到树

文档评论(0)

精品课件 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档