二叉树和云计算.docx
- 文档编号:7561259
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:22
- 大小:1.44MB
二叉树和云计算.docx
《二叉树和云计算.docx》由会员分享,可在线阅读,更多相关《二叉树和云计算.docx(22页珍藏版)》请在冰豆网上搜索。
二叉树和云计算
北京联合大学信息学院
课程设计报告书
课程名称:
数据结构实训
题目:
二叉家族树的建立与输出
专业:
计算机科学与技术
一、实训题目
二叉家族树的建立与输出
王大爷的祖父王威育有两个儿子,大儿子叫王喜,是王大爷的父亲,二儿子叫王嘉,是王大爷的叔叔。
王大爷有一个弟弟叫王石,还有两个堂弟妹,分别叫王磊、王燕。
王大爷本人有两个儿子和一个孙女,分别叫王波、王涌和王晓蕊。
王石有一个儿子叫王海。
王磊有一个儿子和一个孙子,分别叫王涛和王晓帆。
王大爷本人叫王硕。
王大爷家的家谱按各成员的年龄顺序及父子关系构成的二叉家族树见右图。
二、实训目的
请设计算法,帮助王大爷建立他家的二叉家族族谱树,并将家族族谱树以层次遍历的方式输出。
三、题目主要要求
利用二叉树的创建和遍历算法来实现。
四、设计思想
采用二叉树的链式存储结构(二叉链表)及队列的顺序存储
二叉链表主要是方便查找结点的左右子树,便于遍历二叉树
队列的顺序存储主要是为了二叉树的层次遍历而设置的
用队列解决
把根节点存入队列尾部
循环
如果队列不空
从队列头取出一个元素作为当前元素
输出当前元素
把当前元素的两个子节点存储入队列尾部
继续循环
如果队列空
退出循环
五、模块划分及主要算法或流程图
软件分为10个函数,二叉树的遍历主要运用递归算法
①voidInitQueue(Queue&q)//初始化队列q
②intEmptyQueue(Queue&q)//判断队列q是否非空;
③voidInsqQueue(Queue&q,QDataTypex)//依次进队元素,把根节点存入队列尾部
④OutsqQueue(Queue&q,Tree&p)//出队一个元素,输出该元素;
⑤voidDestroyList_SqQueue(Queue&q)//释放队列。
⑥voidCreateTree(Tree&r)//创建二叉树
⑦voidPreorder(Treer)//先序遍历二叉树
⑧voidmidorder(Treer)//中序遍历二叉树
⑨voidpostorder(Treer)//后序遍历二叉树
⑩voidTravelTree(Treer)//层次遍历二叉树
①②③④⑥⑩这几个函数总用重要,一旦出现一些错误,将影响整个程序的正常运行
六、不足、改进和成功分析
不足:
队列的容量有限制,没有用循环队列;输入时按照先序遍历的方式输入,所以要求输入顺序必须正确,否则得到的其他遍历也不正确。
改进:
二叉树结点的数据的内容用字符数组来存储
成功的地方:
二叉树的层次遍历应用队列知识
七、其他说明
开发环境:
MicrosoftVisualStudio6.0
八、程序清单
//Tree.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"stdio.h"
#include"malloc.h"
#include"string.h"
#defineMAX100//顺序队列的容量
//typedefstringTDataType;
typedefstructTreeNode
{
chardata[20];//用字符数组来记录结点的内容
structTreeNode*lchild,*rchild;//左右孩子为指针类型
}TreeNode,*Tree;
typedefTreeQDataType;
typedefstruct
{
QDataTypedata[MAX];
intfront,rear;//队头指针,队尾指针
}Queue;
//
(1)初始化队列q
voidInitQueue(Queue&q)
{
q.front=0;
q.rear=0;
}
//
(2)判断队列q是否非空;
intEmptyQueue(Queue&q)
{
if(q.rear==q.front)return1;
elsereturn0;
}
//(3)依次进队元素,把根节点存入队列尾部
voidInsqQueue(Queue&q,QDataTypex)
{
if(q.rear==MAX){printf("overflow");}
q.rear++;
q.data[q.rear]=x;
}
//(4)出队一个元素,输出该元素;
OutsqQueue(Queue&q,Tree&p)
{
if(EmptyQueue(q))
{
printf("underflow");
return0;
}
else
{
p=q.data[q.front+1];//从队列头取出一个元素作为当前元素
//printf("%c",x);
q.front++;
}
if(EmptyQueue(q)){q.front=0;q.rear=0;}
return1;
}
//n(9)释放队列。
voidDestroyList_SqQueue(Queue&q)
{
if(EmptyQueue(q)==0)
q.front=0;q.rear=0;
}
voidCreateTree(Tree&r)
{
charc[20];
scanf("%s",c);
if(c[0]=='#')r=NULL;
else
{
r=(Tree)malloc(sizeof(TreeNode));
strcpy(r->data,c);
CreateTree(r->lchild);
CreateTree(r->rchild);
}
}
//先序遍历二叉树
voidPreorder(Treer)
{
if(r)
{
printf("%s",r->data);
Preorder(r->lchild);
Preorder(r->rchild);
}
}
//中序遍历二叉树
voidmidorder(Treer)
{
if(r)
{
midorder(r->lchild);
printf("%s",r->data);
midorder(r->rchild);
}
}
//后序遍历二叉树
voidpostorder(Treer)
{
if(r)
{
postorder(r->lchild);
postorder(r->rchild);
printf("%s",r->data);
}
}
//层次遍历二叉树
voidTravelTree(Treer)
{
Queueq;
InitQueue(q);
Treep,p1,p2;
p=r;//(Tree)malloc(sizeof(TreeNode));
if(p)InsqQueue(q,p);//依次进队
while(!
EmptyQueue(q))
{
OutsqQueue(q,p);//出队
printf("%s",p->data);//输出当前元素
p1=p->lchild;
p2=p->rchild;
if(p1)InsqQueue(q,p1);
if(p2)InsqQueue(q,p2);
}
}
voidmain()
{
Treer;
printf("请按前根遍历方法建立二叉树:
\n");
CreateTree(r);
printf("\n先序遍历二叉树\n");
Preorder(r);
printf("\n");
printf("\n中序遍历二叉树\n");
midorder(r);
printf("\n");
printf("\n后序遍历二叉树\n");
postorder(r);
printf("\n");
printf("\n层序遍历二叉树\n");
TravelTree(r);
printf("\n");
}
实训扩充知识
云计算概念
狭义云计算指IT基础设施的交付和使用模式,指通过网络以按需、易扩展的方式获得所需资源;广义云计算指服务的交付和使用模式,指通过网络以按需、易扩展的方式获得所需服务。
这种服务可以是IT和软件、互联网相关,也可是其他服务。
云计算的核心思想,是将大量用网络连接的计算资源统一管理和调度,构成一个计算资源池向用户按需服务。
提供资源的网络被称为“云”。
“云”中的资源在使用者看来是可以无限扩展的,并且可以随时获取,按需使用,随时扩展,按使用付费。
云计算的最终目标是将计算、服务和应用作为一种公共设施提供给公众,使人们能够像使用水、电、煤气和电话那样使用计算机资源。
在云计算环境下,用户的使用观念也会发生彻底的变化:
从“购买产品”到“购买服务”转变,因为他们直接面对的将不再是复杂的硬件和软件,而是最终的服务。
用户不需要拥有看得见、摸得着的硬件设施,也不需要为机房支付设备供电、空调制冷、专人维护等等费用,并且不需要等待漫长的供货周期、项目实施等冗长的时间,只需要把钱汇给云计算服务提供商,我们将会马上得到需要的服务。
云计算系统运用了许多技术,其中以编程模型、数据管理技术、数据存储技术、虚拟化技术、云计算平台管理技术最为关键。
云计算的核心技术
云计算系统运用了许多技术,其中以编程模型、数据管理技术、数据存储技术、虚拟化技术、云计算平台管理技术最为关键。
云计算技术发展面临的主要问题
尽管云计算模式具有许多优点,但是也存在的一些问题,如数据隐私问题、安全问题、软件许可证问题、网络传输问题等。
·数据隐私问题:
如何保证存放在云服务提供商的数据隐私,不被非法利用,不仅需要技术的改进,也需要法律的进一步完善。
·数据安全性:
有些数据是企业的商业机密,数据的安全性关系到企业的生存和发展。
云计算数据的安全性问题解决不了会影响云计算在企业中的应用。
·用户使用习惯:
如何改变用户的使用习惯,使用户适应网络化的软硬件应用是长期而艰巨的挑战。
·网络传输问题:
云计算服务依赖网络,目前网速低且不稳定,使云应用的性能不高。
云计算的普及依赖网络技术的发展。
任重道远
在中国云计算模式真正推广开来还需要解决市场环境不成熟的问题。
在中国,大多企业都有自己拿不上台面的数据,如何使这部分企业转而利用云计算还需要一个漫长的过程,这也是为什么SaaS模式的应用不能得到广泛市场的原因。
虽然企业的财务人员在利用一些“公共”邮箱发送本企业的机密数据,虽然大多网民都曾用过即时通讯工具传递过某些密码,但是仍然对把所有数据保存在网上心存疑虑。
任何技术安全手段在互联网上面对具有强大创造性的人来说都是浮云,唯一能够保证安全的还是人类的道德和法律的威慑。
然而市场的培育需要无数的开拓者和牺牲者,就好比几年前云计算刚刚提出时众多的云计算倡导者已经倒下,新的继承者还在步履蹒跚。
未来是光明的,道路是曲折的。
分离出google、亚马逊的云计算平台或服务用到数据结构哪部分知识及算法。
1、google云计算应用及技术
1.1Google文件系统GFS
1.2并行数据处理MapReduce
1.3分布式锁服务Chubby
1.4分布式结构化数据表Bigtable
平台服务
}图像操作API
开发人员可通过该API对JPEG和PNG图像进行缩放、裁剪、旋转和翻转等操作
}邮件API
为开发人员开发的应用程序提供电子邮件发送服务
}MemcacheAPI
高性能的内存键值缓存,用户可使用应用程序访问该缓存
可提高应用程序的性能并减少数据库的负载
}网址抓取API
可以使用HTTP或HTTPS等网址来对数据进行检索
}用户API
使应用程序与Google帐号集成,支持Google帐号身份认证
}数据库API
为用户提供查询引擎和事务存储服务
1.1Google文件系统GFS散列表
一个GFS集群由一个主服务器(master)和大量的块服务器(chunkserver)构成,并被许多客户(Client)访问。
主服务器存储文件系统所以的元数据,包括名字空间、访问控制信息、从文件到块的映射以及块的当前位置。
它也控制系统范围的活动,如块租约(lease)管理,孤儿块的垃圾收集,块服务器间的块迁移。
主服务器定期通过HeartBeat消息与每一个块服务器通信,给块服务器传递指令并收集它的状态。
GFS中的文件被切分为64MB的块并以冗余存储,每份数据在系统中保存3个以上备份。
客户与主服务器的交换只限于对元数据的操作,所有数据方面的通信都直接和块服务器联系,这大大提高了系统的效率,防止主服务器负载过重。
1.2并行数据处理MapReduce散列表排序算法
(参考
首先来看一看一个MapReduce系统对外的接口。
Map函数:
map(String key, String value).....
Reduce函数:
reduce(String key, Iterator values).....
了解MapReduce模型的人应该知道,Map函数的输出是一系列的Key/Value对(pair),这些Key/Value对是给Reduce函数使用的。
但是在这里可以发现,Map函数的输入参数也是Key和Value。
但其实,输入的Key/Value和输出的Key/Value不是同一组东西。
对于一个Map函数调用,输入的是一个Key/Value对,而输出呢,是一组Key/Value对。
举例来说,如果要统计一篇文章中所有单词的数目,那么输入的Key可能就是行数,输入的Value就是该行的内容。
对于一次Map调用,就是要统计出一行中各个单词出现的次数,所以输出的Key是单词,Value是这个单词的出现次数。
Map函数的输入之所以也用Key/Value的形式,可能是因为一般来说一个任务并不是用一次MapReduce就能够完成,而是需要用到多次MapReduce调用,下一个Map调用的输入很有可能就是上一个Reduce的输出结果(Key/Value对)。
结合上面的图,这里描述了当一个用户程序执行MapReduce调用后,系统的流程:
1.首先,用户程序中的MapReduceLibrary会将输入的文件(就是要处理的文件)切分成大小为16M——64M之间的M份(就是图中的split0,split1,...),一般来说,这M份数据是放在了cluster的多台机器上。
然后在整个cluster的机器上启动程序的多份拷贝,如图所示,
(1)。
2.其中的一份程序拷贝是master,其余的拷贝是workers。
master会将任务分配给workers。
任务包括了M个map的任务和R个reduce的任务,master会找到空闲的worker然后将map或者reduce的任务分配给它。
(M的值取决于inputfiles被切分的块数;R值则是根据map中所能hash出的key的数量。
)如图所示,
(2)。
3.当一个worker被分配到map任务,那么它就会处理M份中的一份split。
InputData中的数据也是Key/Value形式的很多pairs(这个在前面中提到了),Map任务的worker会将这些pairs一个一个传递给Map函数,Map函数产生的很多新的Key/Value对会被缓存在内存中。
4.周期性的,buffer中缓存的那些pairs会写入到本地disk中。
如图所示,(3)(4)。
由于有R个reduce任务,所以disk中的pair会按照一定规则分为R个区,每个区的数据都特定的给某一个reduceWorker。
在图中的每个MapWorker所对应的Intermediatefiles其实被分成了R个区(很有可能就是R个文件)。
这些区的位置会被传递到master上,它会负责将这些位置交给reduceworkers。
可以看到,master在这里起到了一个“承上启下”的作用,Map函数和Reduce函数之间的连接是由master完成的。
5.ReduceWorker从master获取了这些区的位置,然后将这些Key/Value对从mapWorker处通过RPC读取。
注意,ReduceWorker只读那些对应于自己的区的数据。
如图所示,(5)。
读取完数据后需要对于这些Key/Value对按照Key进行排序,如果需要,可能还采取外排的方式(externalsort)。
之所以需要排序是因为对于一个Key,会有很多组不同的pair,通过排序可以将它们聚合在一起。
6.reduceWorker迭代整个被排序后的Key/Value数据,将每个独一无二的key和它所对应的value序列(之所以是序列,是因为对于一个key可能有很多个Key/Value,每个项中的value都不同,它们已经通过排序聚合在了一起)送入Reduce函数中。
Reduce函数对于这样的输入产生的结果往往是0或者1个值(比如将所有Value相加,和就是最后的结果)。
Reduce函数对于Reduce函数的结果会被添加到最终的outputfile里(每次reduceWorker都会产生一个输出文件,最终一共有R个文件,因为一共有R个reduce的任务)。
如图所示,(6)。
7.当所有的map和reduce任务结束后,master会唤醒用户的程序。
这时候,用户的MapReduce调用返回。
还需要提及的是,当整个流程顺利完成以后,最终得到的其实是R个文件。
如果想要最终的结果,应该将这R个文件合并。
但一般来说,都是将这R个文件作为另一个MapReduce任务的输入。
在这里,master起到了三个作用:
1.它将任务分配给worker;
2.它维护了所有worker的信息和所处的状态;
3.它将Map任务结果的位置告诉给Reduce任务,起到了一个桥梁的作用。
1.3分布式锁服务Chubby
}主要用于解决分布式一致性问题
◦在一个分布式系统中,有一组的Process,它们需要确定一个Value。
于是每个Process都提出了一个Value,一致性就是指
◦只有其中的一个Value能够被选中作为最后确定的值,并且当这个值被选出来以后,所有的Process都需要被通知到
}粗粒度的分布式锁服务
◦Chubby是Google为解决分布式一致性问题而设计的提供粗粒度锁服务的文件系统
}其他分布式系统可以使用它对共享资源的访问进行同步
Chubby的系统架构
}Chubby系统本质上就是一个分布式的、存储大量小文件的文件系统
◦Chubby中的锁就是文件
◦在GFS的例子中,创建文件就是进行“加锁”操作,创建文件成功的那个server其实就是抢占到了“锁”
◦用户通过打开、关闭和存取文件,获取共享锁或者独占锁;并且通过通信机制,向用户发送更新信息
1.4分布式结构化数据表Bigtable
}为什么需要设计BigTable?
◦Google需要存储的数据种类繁多
•网页,地图数据,邮件……
•如何使用统一的方式存储各类数据?
◦海量的服务请求
•如何快速地从海量信息中寻找需要的数据?
•BigTable:
基于GFS和Chubby的分布式存储系统
◦对数据进行结构化存储和管理
◦与GFS的联系
Google的需求
}数据存储可靠性
}高速数据检索与读取
}存储海量的记录(若干TB)
}可以保存记录的多个版本
Bigtable是一个分布式的结构化数据存储系统,它被设计用来处理海量数据:
通常是分布在数千台普通服务器上的PB级的数据。
Google的很多项目使用Bigtable存储数据,包括Web索引、GoogleEarth、GoogleFinance。
这些应用对Bigtable提出的要求差异非常大,无论是在数据量上(从URL到网页到卫星图像)还是在响应速度上(从后端的批量处理到实时数据服务)。
尽管应用需求差异很大,但是,针对Google的这些产品,Bigtable还是成功的提供了一个灵活的、高性能的解决方案。
Bigtable存储的是结构化或半结构化数据(web数据特点就是介于结构化和非结构化之间,因此称为半结构化数据,其value是有结构的数据——就如关系数据库中的列一般,因而可支持一定程度的Query(比如可按单列进行),这点上看Bigtable更接近数据库(接近而不是等价!
)Bigtable所存储的数据都是以字符串格式实现,所以对主建或者列(以及其自动加上的时间戳)排序都是以字符序进行
Bigtable的控制是采用传统的serverfarm形式,使用一个主控服务器+多个子表服务器构成。
而数据存储形式是采用多维Map的稀疏结构,可看成是由多个列表组成,所谓稀疏是说每条记录并非要求有全列。
其数据(包括索引,日志,记录数据)最终是存储在分布文件系统DFS之上——数据被以DFS所特有的文件形式分布存储在各各节点之上。
相比DHT的存储环自管理技术,它需要有master主控服务器来负责监控各客户存储节点(分配子表,失效检测,负载均衡等),另外索引文件的根也是集中存储,需要客户端首先读取(之后可以采用预读和缓存的技术减少读取索引表的次数)。
这种集中控制的做法有一个缺陷就是系统存在单点故障——因此单点需要高可用性,如记录恢复日志或双机备份等——但好处是更人为可控,方便维护,且集中管理时数据同步易于方便——显然,更新集中存储的原数据(如数据索引或节点路由等)相比DHT环中各个节点存储的原数据(如membership,即各点的路由关系)需要利用“闲谈机制”依次通知式地进行渐近更新要容易许多。
2、亚马逊云计算AWS
参考网站
2.1亚马逊平台基础存储架构:
Dynamo
Dynamo偏向存储原数据,因为其所存储的数据是非结构化数据,对value的解析完全是用户程序的事情,Dynamo系统不识别任何结构数据,都统一按照binary数据对待;
dynamo的键值并非以字符串存储,而是统一经过md5算法转后成16字节md5_key存储的,因此对数据的访问必须知道key才可进行,故而对扫表(用游标)或者query访问则无能为力。
当然在dynamo的基础上,配合一些方式我们实现query也并不可能,
Dynamo是采用DHT(分布哈希表,请参看有关资料吧)作为基本存储架构和理念,这个架构最大特点是能让数据在环中“存储”均匀,各存储点相互能感知(因数据需要在环内转发,以及相互之间进行故障探测
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 计算