大学课堂《计算机组成原理》答案(完整版)下载

weixin_39820780 2019-07-21 05:00:29
大学课堂 《计算机组成原理》 答案 (完整版) 大学课堂 《计算机组成原理》 答案 (完整版)
相关下载链接://download.csdn.net/download/e_yohn/3534028?utm_source=bbsseo
...全文
50 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
物理学在迅速发展,不断地揭示新的现象和规律,征服新的领域,还向 相邻的学科交叉渗透,并在高新技术园地里开花结果.这就促使大学基础物理 课程作相应的改革,以适应科学发展的新形势.值此新旧世纪交替之际,广大 物理学工作者和教师所面临的一项重大挑战,乃是写出一本面向21 世纪的大 学物理教材. 卢德馨教授曾从事理论物理的科学研究多年,取得了第一手的科研经验, 有良好的物理素养.近年来他主持了南京大学基础学科教学强化部的工作,并 承担了其中大学物理学的教学任务,致力于基础物理学课程的教学改革.他对 此深思熟虑,自有一套创新性的见解,而且有足够的能力和毅力,将这些概 念付诸实践.这本书就是他多年教学经验的结晶,既新颖可喜,又脚踏实地, 是一本优秀的基础物理学课程的教材. 基础物理学改革的浪潮是全球性的,持续了好几十年,既有成功的经验, 也有失败的教训.理论物理大师费曼(R.P.Feynman)的例子就是颇有启发性 的:他于60 年代初介入了大学基础物理的教学改革,曾在美国加州理工学院 教过大学一、二年级的物理课程.称著于世的三大卷《费曼物理讲义》就是这 段经历的见证.他对于物理学的许多方面做出了富有创造性的重大贡献,随之 而来的是他对物理学的透彻洞见和精辟理解.他在上物理课时,若天马行空, 纵横驰骋;即物穷理,多蕴妙悟;且谈笑风生,挥洒自如.以此,这部讲义对 广大物理工作者和教师,深富启迪和教益,成为被引证最多的一部物理著作, 在物理学界产生广泛的影响.从这个意义上来说,这个教改的尝试是成功的. 但是应该看到事物的另一面:这本讲义,陈意过高,使得刚入大学的学生难 以掌握,因而不适宜作为实际施教的教科书.可以这么说,这是一本为教师而 写的,而不是为学生而写的教科书.对学生来说,显得高不可攀,难以理解其 底蕴.作为教材,在可接受性上出了问题.随之而来的多卷本《伯克莱物理教 程》虽在可接受性上略有改进,但仍有问题.因而可接受性成为了评衡教材的 另一重要标准.瑞斯尼克(R.Resnick)与哈立德(D.Halliday)的《物理学》 虽然没有费曼那样高的独创性,但稳打稳扎,更贴近于传统教材,可接受性 良好,受到广大教师的青睐,遂成为美国应用最广泛的大学物理学教材.革新 性教材的另一个问题,是由于要增加很多新的内容所引起的.适应科学发展的 需要,必然要增添许多反映新的进展的内容,而作者往往喜新不厌旧,对于 传统的内容舍不得抛弃,结果就会使教材的内容臃肿,篇幅浩繁,也不利于 施教. 本书作者力图推陈出新,变革教材的陈旧面孔.在这一点上,显然受到费 曼的影响,但是他并不沿袭费曼的具体做法,而是有自己的新意.例如在第四 章,他采用透视历史的方法来引入万有引力定律,娓娓道来,引人入胜.然后 讨论了引力的现代问题,诸如引力质量与惯性质量的等同性,引力红移和引 力塌缩等,和物理学的前沿相衔接;然后再回过来处理二体开普勒问题的理 论,使得学生能切实地掌握相应的理论方法.整章读下来,从历史到现实,从 概念到理论,有融会贯通的乐趣.又如在第二十七章叙述玻色-爱因斯坦统计 之后,紧接着引入最新的实验结果来讨论玻色-爱因斯坦凝聚问题,使学生不 是单纯被动地接受一些知识,而是置身于物理学发展的动态环境之中,有身 历其境之感,培养了学生对物理学的参与意识. 本书作者一方面对创新下了不少功夫,同时清醒地意识到可接受性的重 要.篇章的顺序是力学——热物理——电磁学——近代物理,大体上符合循序 渐进的教学原则,不会使学习者产生太大的跳跃和脱节的感觉.本书作者也注 意到学生容易犯错误的地方,例如在教矢量的地方,着重提醒哪些表达式是 非法的,这一细节反映出作者是一位经验丰富的教师.另外全书的篇幅控制在 600 页左右,使得这一教材可以游刃有余地在180 小时课堂教学中完成,避 免了篇幅过大的毛病. 这本教材自1989 年起即在南京大学强化部大学物理学课程中试用,1993 年起又用于南京大学天文系的学生.历次教学的效果良好:它激发了学生对物 理学的兴趣,也培养了思考物理学问题的能力,这从学生们所做的小论文工 作取得良好成绩得到了验证.当然,强化部的学生素质较高,也为这一教学改 革顺利进行提供了良好的条件.总之,这是一本令人耳目一新、适于实际施教 的大学物理学教材,值得向物理教学界推荐. 冯端 1996 年10 月 前言 本书是作者在南京大学基础学科教学强化部讲授的“大学物理学”课程 基础上写成的.强化部有天文、物理、生物物理、化学、生物、生物化学等学 科方向.“大学物理学”作为一门公共基础课,很难根据现有的“本系”或“外 系”教材来讲授.因此需要一本全新构思的书.普通物理教科书的基本内容往 往仍然是以17 世纪、19 世纪的为主,这在世纪之交是很不适宜的.学制的缩 短、双休日制度的实施使课时过多的矛盾更加突出.作者尝试撰写一本以20 世纪内容为主导的教科书,篇幅适合两个学期的课程,希望能够作为多个学 科学生的公共基础课教材. 从当前科学发展的趋势看,学科的交叉、渗透相当普遍.在教材中努力体 现这种倾向是值得尝试的.在本学科中各分支间的关联以至融会贯通也是应 该强调的.当然寻求物理学与其它学科、物理学各分支间的“枝连”是颇为艰 难的事.再者作者本人相信前沿课题应该在基础内容中有其“根”,寻根的工 作也是相当艰难的.但是一旦发现前沿课题中有适合基础教学的内容,则务求 能纳入教材.希望这种搜索寻根的工作使教材更为丰满、充实.实际研究工作 者的思路、方法对于初学者来说是很有价值但又难以获得的.例如在研究工作 中如何获取和处理信息、处理好数学和物理的关系、不断调整研究步骤、深 入理解结果的意义、扩大成果等等,本书试图通过实际问题向读者展示. 传统的基础课强调基础知识、基本理论和基本技能.实践证明完全可能通 过课程达到进一步的目标:培养学生的探索精神和创造精神.可以通过历史、 展示现实作出示范.同时还可以创造条件使学生有向内容的深度和广度发展 的余地.讲授应该不局限于一本教材,提倡开放式.本书引用一定数量的文献 和参考书,展示一些悬而未决的问题,都是基于这种考虑.列出的一些经典文 献和专业文献主要是供给教师研究用.标有*的节和段落可以作为参考内容. 在本书的辅助材料电子版中列举了作者对题解、文献阅读、课程论文等环节 的观点并包含了有关参考材料. 基于以上考虑,本书的选材、表达不同以往.例如光学和电路没有纳入; 提出了不少新的观点和处理问题的方式;尝试对物理定律的美学价值进行思 考等等.读者可以见仁见智,加以评论.本书写出初稿已有8 年了,首次在教 材建设组披露部分内容也已有4 年.但是仍不能臻于理想,错误、不当仍然难 免. 成书过程中曾先后得到陈祖福、冯端、冯致光、江元生、许敖敖、邓崇 光诸位的鼓励和支持.作者还得到江元生、梁昆淼、陈廷扬、黄天衣、沈健、 赵其昌、潘大谦诸君不少有益的意见和帮助.冯端先生通读全书、作序,对内 容的调整和增补提出了宝贵的意见,使我获益非浅.在此一并表示感谢.我的 助教和学生在教和学的过程中对本书的形成起了重要作用,石名俊选编了部 分习题。希望本书能唤起他们美好的回忆. 卢德馨 1996 年10 月于南京 第一章 绪论 §1.1 什么是物理学 物理学是研究自然界基本规律的科学.它的英文词physics 来源于希腊 文,原义是自然,而中文的含义是“物”(物质的结构、性质)和“理”(物 质的运动、变化规律).中文含义与现代观点颇为吻合.现代观点认为物理学 主要研究:物质和运动,或物质世界及其各部分之间的相互作用,或物 质的基本组成及它们的相互作用. 物质可以小至微观粒子— — 分子、原子以至“ 基本” 粒子 (elementaryparticles).所谓基本粒子,顾名思义是物质的基本组成成分, 本身没有结构.然而基本与否与人们的认识水平以及科学技术水平有关,因此 对“基本”的理解有阶段性.有鉴于此,物理学家简单地称之为“粒子”.有 时为了表达认识的层次,我们仍然可以说:“现阶段的基本粒子为⋯⋯”. 当前我们认为基本粒子有轻于(lepton)、夸克(quark)、光子(photon) 和胶子(gluon)等等.科学家们正在努力寻找自由夸克.此外,分数电荷、磁 单极也在寻找之列.我们周围的物体是物质的聚集状态.人们可以用自己的感 官感知大多数聚集状态的物质,并称它们为宏观( macroscopic)物质以区别 前面所说的微观(microscopic)粒子.居间的尺度是介观(mesoscopic), 而更大的尺度是宇观(cosmological).场(field)传递相互作用,电磁场 和引力场就是例子. 在物理学的范围内,物质的运动是指机械运动、热运动、微观粒子的运 动、原子核和粒子间的反应等等.运动总是发生在一定的时间和空间.时间和 空间首先是作为物质运动的舞台,但最后也成了物理学研究的对象. 现在知道物质之间的相互作用有四种,即万有引力、弱相互作用、电磁 相互作用和强相互作用. 爱因斯坦(A.Einstein,1879—1955)生前曾致力于统一场论的工作, 试图用统一的理论来描述各种相互作用.在60 年代,走向统一有了突破性的 进展.格拉肖(S.L.Glashow)、温伯格(S.Weinberg)和萨拉姆(A.Salam) 等人发现弱相互作用和电磁相互作用可以统一, 用弱电相互作用 (electroweak)来描述.鲁比亚(1983[1],C.Rubbia)等提供了实验支持. 大统一理论(Grand Unification Theory,GUT)试图将强相互作用也统一进 去,而超对称理论更企图将引力也纳入其中.还有人在寻求其他的相互作用. 对此,在Physics Teacher 期刊上曾有一篇文章题为“存在第五种基本力吗?” 专门讨论这一命题[6].在高级的理论中,相互作用只不过是交换物质,如电 磁作用交换光子、强作用交换胶子. 物理学的一个永恒主题是寻找各种序(orders)、对称性(symmetry) 和对称破缺(symmetry-breaking)[10]、守恒律(conservation laws)或 不变性(invariance).物质的有序状态比我们想象的要广泛得多.除了排列 整齐的位置序以外,还可以有指向序.超导态也是一种有序状态.对称性通常 指静止的空间几何对称,如太极图、八卦、晶体中的平移和旋转对称.实际上, 对称性还可以是动态的,可以是时间反演对称、物质—反物质对称以及更为 抽象的规范对称等等. 就物理学和其他科学的关系而言,我们可以说: ·物理学是最基本的科学. ·物理学是最古老、发展最快的科学. ·物理学提供最多、最基本的科学研究手段. 最基本的体现是在天文学、地学、化学、生命科学中都包含着物理过程 或现象.在这些学科中用到不少物理学概念和术语是很自然的.最基本还意味 着任何理论都不能和物理学的定律相抵触.例如,如果某种理论破坏能量守恒 定律,那么这一理论就很成问题.当然,某些物理理论本身或一些阶段性的工 作本身也是在不断地完善. 19 世纪中叶之前,物理学曾是完完全全的实验科学.力学中的理论问题 被认为是数学家的事.19 世纪末,在当时处于世界物理学中心的德国的大学 里,开始设置理论物理学教授的席位.此后,随着人类的认识能力逐步深入, 逐步深入到不能靠直觉把握的微观、高速、宇观现象,20 世纪初建立了狭义 和广义相对论,以及量子力学这些深刻的物理理论.到了20 世纪中叶,物理 学已经成为实验和理论紧密结合的科学.20 世纪后半叶由于电子计算机的发 展,既改变了理论物理的工作方式,也扩大了实验的涵义.目前物理学已经 成为实验物理、理论物理、计算物理三足鼎立的科学.实验提供的条件比 自然界出现的更富变化和更灵活可控,而物理理论则给出了对自然界的数学 描述.计算物理学是重要的新分支,有自己独特的研究方法.计算机实验可以 提供比通常的实验更为变化丰富和灵活控制的条件.不过通常需要用到超级 计算机. 物理学中最重大的基本理论有下面5 个: ·牛顿力学或经典力学(Mechanics)研究物体的机械运动; ·热力学(Thermodynamics)研究温度、热、能量守恒以及熵原理等等; ·电磁学(Electromagnetism)研究电、磁以及电磁辐射等等; ·相对论(Relativity)研究高速运动、引力、时间和空间等等; ·量子力学(Quantum mechanics)研究微观世界. 后两个理论主要是在20 世纪发展起来的,通常认为是现代物理学的核心. 以上理论中没有一个被完全推翻过,也没有一个是永远正确的.例如,牛顿力 学在高速情形下,应该用狭义相对论来代替;而对于强引力,它又偏离于广 义相对论,但在它的适用范围内仍然是精确的.科学的理论总是要发展的,需 要根据新发现的事实进行修正.在教科书中只介绍一种版本的做法很可能导 致“理论是唯一的”这样的观念.事实上,理论决不是唯一的.科学理论往往 在美学上令人赏心悦目,在数学上优雅而普适,但是仅仅有这些是决不可能 流传下来的.理论和思想必须经受实验的检验和验证.物理学中的理论和实验 在相互促进和丰富中得到发展. 一个没有思想的实验工作者可以发现无穷无尽的事实,不过毫无用处. 理论家如果不受实验检验这一约束也可能产生出极其丰富的思想,不过与大 自然毫无关系而已. 通常的科学研究方法是: ·通过观测、实验、计算机模拟得到事实和数据; ·用已知的可用的原理分析这些事实和数据; ·形成假说和理论以解释事实; ·预言新的事实和结果; ·用新的事例修改和更新理论. 上述的后3 步都是关于理论的.以上所说的科学研究的步骤是常规的.有 时候,有的人可能并不遵循这样的过程.常常直觉(intuition)或者预感 (premonition)会起相当的作用.有时候,机遇(运气或偶然)对于成功也 会起作用,使你获得一则重要的信息或发现一个特别简单的解.要学会在恰当 的时机提出恰当的问题,并找到问题的答案.有时还必须忽略一些“事实”, 原因是这些并不是真正的事实或者它们无关紧要、自相矛盾;或者是由于它 们掩盖了更重要的事实或考虑它们使问题过于复杂化.据说,有一次有人问爱 因斯坦:如果迈克耳孙-莫雷(Michelson-Morley)实验并不导致光速不变你 怎么办?他说:他将忽略那些实验结果,他已经得到了结论,光速必须被认 为是不变的.关于爱因斯坦1905 年提出狭义相对论时是否知道迈克耳孙-莫 雷实验,曾发生过长时间的争论.有人认为爱因斯坦在他的著作中没有留下他 知道迈克耳孙-莫雷实验的丝毫痕迹,他可能纯粹通过理论推理和他们(迈克 耳孙与莫雷)得出了相同的结论.爱因斯坦的首席传记作家培斯(Abraham Pais)筛选了许多历史记载,得出结论说,爱因斯坦确实知道这一实验.新近 有一篇爱因斯坦在1922 年的演说的英文翻译稿刊登在Physics Today 上[8]. 此文是根据原来的德语演讲的日文记录整理、翻译的[见第九章参考文献 (13)].译者让爱因斯坦“本人”表示,他知道这一实验. 在大学物理的学习中,除了学习事实、定律、方程和解题技巧外,还必 须努力从整体上掌握物理学.要了解各分支间的相互联系.现代观点认为,应 该从整体上逻辑地、协调地来把握物理学.学习中,对于基本物理定律的优美、 简洁、和谐以及辉煌应该有所体会,要学会鉴赏其普适程度,了解其适用范 围.还要学会区别理论和应用,物理思想和数学工具,一般规律和特殊事实, 主要和次要效应,传统的和现代的推理方式等等.
攀枝花学院本科学生课程设计任务书 题 目 二叉排序树与平衡二叉树的实现 1、课程设计的目的 使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。 使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。 3) 使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。 2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等) (1) (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”; (5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; (6)计算平衡的二叉排序树BT的平均查找长度,输出结果。 3、主要参考文献 [1]刘大有等,《数据结构》(C语言版),高等教育出版社 [2]严蔚敏等,《数据结构》(C语言版),清华大学出版社 [3]William Ford,William Topp,《Data Structure with C++》清华大学出版社 [4]苏仕华等,数据结构课程设计,机械工业出版社 4、课程设计工作进度计划 第1天 完成方案设计与程序框图 第2、3天 编写程序代码 第4天 程序调试分析和结果 第5天 课程设计报告和总结 指导教师(签字) 日期 年 月 日 教研室意见: 年 月 日 学生(签字): 接受任务时间: 年 月 日 注:任务书由指导教师填写。 课程设计(论文)指导教师成绩评定表 题目名称 二叉排序树与平衡二叉树的实现 评分项目 分值 得分 评价内涵 工作 表现 20% 01 学习态度 6 遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。 02 科学实践、调研 7 通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。 03 课题工作量 7 按期圆满完成规定的任务,工作量饱满。 能力 水平 35% 04 综合运用知识的能力 10 能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。 05 应用文献的能力 5 能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。 06 设计(实验)能力,方案的设计能力 5 能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。 07 计算及计算机应用能力 5 具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。 08 对计算或实验结果的分析能力(综合分析能力、技术经济分析能力) 10 具有较强的数据收集、分析、处理、综合的能力。 成果 质量 45% 09 插图(或图纸)质量、篇幅、设计(论文)规范化程度 5 符合本专业相关规范或规定要求;规范化符合本文件第五条要求。 10 设计说明书(论文)质量 30 综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。 11 创新 10 对前人工作有改进或突破,或有独特见解。 成绩 指导教师评语 指导教师签名: 年 月 日 摘要及关键字 本程序中的数据采用“树形结构”作为其数据结构。具体采用的是“二叉排序树”。 二叉排序树(又称二叉查找树):(1)若左子树不空,则左子树上所有节点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有节点均大于它的根结点的值;(3)它的左右子树分别为二叉排序树。 二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。 本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”;(5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; (6)计算平衡的二叉排序树BT的平均查找长度,输出结果。 关键字:数列L,结点,二叉排序树,平衡二叉树        目录 摘要…………………………………………………………………………… 3 1 绪论………………………………………………………………………… 5 1.1 课程设计的目的…………………………………………………………… 5 1.2 相关知识的阐述…………………………………………………………… 5 1.2.1一位数组的存储结构…………………………………………………… 5 1.2.2建立二叉排序树……………………………………………………… 5 1.2.3中序遍历二叉树………………………………………………………… 5 1.2.4平均查找长度…………………………………………………………… 6 1.2.5平均二叉树(AVL树)…………………………………………………… 6 1.2.6平衡因子………………………………………………………………… 7 1.2.7平衡二叉树的调整方法…………………………………………………… 7 2 方案设计……………………………………………………………… 8 2.1 模块功能………………………………………………………………………8 3 算法设计…………………………………………………………………… 8 3.1 算法流程图…………………………………………………………………… 8 4 详细设计……………………………………………………………… 10 4.1 主程序………………………………………………………………… 10 4.2 定义二叉树结构……………………………………………………………… 11 4.3 建立二叉树…………………………………………………………………… 11 4.3.1二叉排序树的查找…………………………………………………………11 4.3.2二叉排序树的插入…………………………………………………………11 4.4 中序遍历…………………………………………………………………12 4.5 平均查找长度…………………………………………………………………12 4.6 删除节点…………………………………………………………………12 4.7 判断平衡二叉树……………………………………………………………… 13 5 调试分析………………………………………………………………………… 14 5.1 时间复杂度的分析………………………………………………………………14 5.2 运行结果………………………………………………………………… 14 5.3 结果分析………………………………………………………………… 15 6 课程设计总结…………………………………………………………………… 16 参考文献………………………………………………………………………… 17 1 绪论 1.1 课程设计的目的 (1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。 (2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。 (3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。 1.2 相关知识的阐述 1.2.1 一维数组的存储结构 建立二插排序树,首先用一个一维数组记录下读入的数据,然后再用边查找边插入的方式将数据一一对应放在完全二叉树相应的位置,为空的树结点用“0” 补齐。 1.2.2 建立二叉排序树 二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。 插入算法: 首先执行查找算法,找出被插结点的父亲结点; 判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入; 若二叉树为空,则首先单独生成根结点。 注意:新插入的结点总是叶子结点。 1.2.3 中序遍历二叉树 中序遍历二叉树算法的框架是: 若二叉树为空,则空操作; 否则(1)中序遍历左子树(L); (2)访问根结点(V); (3)中序遍历右子树(R)。 中序遍历二叉树也采用递归函数的方式,先访问左子树2i,然后访问根结点i,最后访问右子树2i+1.先向左走到底再层层返回,直至所有的结点都被访问完毕。 1.2.4 平均查找长度 计算二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。  假设在含有n(n>=1)个关键字的序列中,i个关键字小于第一个关键字,n-i-1个关键字大于第一个关键字,则由此构造而得的二叉排序树在n个记录的查找概率相等的情况下,其平均查找长度为:          ASL(n,i)=[1+i*(P(i)+1)+(n-i-1)(P(n-i-1)+1)]/n 其中P(i)为含有i个结点的二叉排序树的平均查找长度,则P(i)+1为查找左子树中每个关键字时所用比较次数的平均值,P(n-i-1)+1为查找右子树中每个关键字时所用比较次数的平均值。又假设表中n个关键字的排列是“随机”的,即任一个关键字在序列中将是第1个,或第2个,…,或第n个的概率相同,则可对上式从i等于0至n-1取平均值。最终会推导出:          当n>=2时,ASL(n)<=2(1+1/n)ln(n) 由此可见,在随机的情况下,二叉排序树的平均查找长度和log(n)是等数量级的。 另外,含有n个结点的二叉排序树其判定树不是惟一的。对于含有同样一组结点的表,由于结点插入的先后次序不同,所构成的二叉排序树的形态和深度也可能不同。 而在二叉排序树上进行查找时的平均查找长度和二叉树的形态有关:  ①在最坏情况下,二叉排序树是通过把一个有序表的n个结点依次插入而生成的,此时所得的二叉排序树蜕化为棵深度为n的单支树,它的平均查找长度和单链表上的顺序查找相同,亦是(n+1)/2。  ②在最好情况下,二叉排序树在生成的过程中,树的形态比较匀称,最终得到的是一棵形态与二分查找的判定树相似的二叉排序树,此时它的平均查找长度大约是lgn。  ③插入、删除和查找算法的时间复杂度均为O(lgn)。 1.2.5 平衡二叉树( AVL树 ) ①平衡二叉树(Balanced Binary Tree)是指树中任一结点的左右子树的高度大致相同。     ②任一结点的左右子树的高度均相同(如满二叉树),则二叉树是完全平衡的。通常,只要二叉树的高度为O(1gn),就可看作是平衡的。     ③平衡的二叉排序树指满足BST性质的平衡二叉树。     ④AVL树中任一结点的左、右子树的高度之差的绝对值不超过1。在最坏情况下,n个结点的AVL树的高度约为1.44lgn。而完全平衡的二叉树高度约为lgn,AVL树是最接近最优的。 1.2.6 平衡因子 二叉树上任一结点的左子树深度减去右子树的深度称为该结点的平衡因子,易知平衡二叉树中所有结点的因子只可能为0,-1和1。 平衡二叉排序树的在平衡因子绝对值等于2时开始调整到绝对值为1或0,在平衡因子绝对值为2时,二叉排序树会出现四种不同的情况的树形,因此这时需要分别单独讨论来降低平衡因子。 1.2.7 平衡二叉树的调整方法   平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。具体步骤如下: (1)每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点; (2)若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点; (3)判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整; (4)如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或LR型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突; (5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。 2 方案设计 2.1 模块功能 1.建立二叉树:要求以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T。 2.中序遍历并输出结果:要求将第一步建立的二叉树进行中序遍历,并将结果输出。 3.平均查找长度并输出:要求计算二叉排序树T查找成功的平均查找长度,输出结果。 4.删除节点:要求输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 5.生成平衡二叉树:要求用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; 6.平均查找长度:计算平衡的二叉排序树BT的平均查找长度,输出结果。 3 算法设计 3.1 算法流程图 建立二叉树流程图: YES NO 主程序流程图: 中序遍历流程图: 删除节点流程图: 4 详细设计 4.1 主程序 void main() { node T=NULL; int num; int s=0,j=0,i=0; int ch=0; node p=NULL; printf("请输入一组数字并输入0为结束符:"); do{ scanf("%d",&num); if(!num) printf("你成功完成了输入!\n"); else insertBST(&T,num); }while(num); printf("\n\n---操作菜单---\n"); printf("\n 0: 退出" ); printf("\n 1: 中序遍历"); printf("\n 2: 平均查找长度"); printf("\n 3: 删除"); printf("\n 4: 判断是否是平衡二叉树"); while(ch==ch) { printf("\n 选择操作并继续:"); scanf("%d",&ch); switch(ch){ case 0: exit(0); /*0--退出*/ case 1: printf(" 中序遍历结果是:\n "); inorderTraverse(&T); break; case 2: s=0;j=0;i=0; calculateASL(&T,&s,&j,i); printf(" ASL=%d/%d",s,j); break; case 3: printf(" 请输入你想删除的数字:"); scanf("%d",&num); if(searchBST(T,num,NULL,&p)) { T=Delete(T,num); printf(" 你已成功删除该数字!\n "); inorderTraverse(&T); else printf(" 没有你想要删除的节点 %d!",num); break; case 4: i=0; balanceBST(T,&i); if(i==0) printf(" OK!这是平衡二叉树!"); else printf(" NO!"); break; default: printf("你的输入有误!请重新输入!\n"); break; } } } 4.2 定义二叉树结构 #include typedef struct Tnode { int data; struct Tnode *lchild,*rchild; }*node,BSTnode; 4.3 建立二叉树 4.3.1 二叉排序树的查找 searchBST(node t,int key,node f,node *p){ /*在根指针t所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找成功,则指针p指向该数据元素节点,并返回(1),否则指针p指向查找路径上访问的最后一个节点并返回(0),指针f指向t的双亲,其初始调用值为NULL*/ if(!t) {*p=f;return (0);} /*查找不成功*/ else if(key==t->data) {*p=t;return (1);} /*查找成功*/ else if(keydata) searchBST(t->lchild,key,t,p); /*在左子树中继续查找*/ else searchBST(t->rchild,key,t,p); /*在右子树中继续查找*/ } 4.3.2 二叉排序树的插入 insertBST(node *t,int key){ /*当二叉排序树t中不存在关键字等于key的数据元素时,插入key并返回(1),否则返回(0)*/ node p=NULL,s=NULL; if(!searchBST(*t,key,NULL,&p)) /*查找不成功 */ { s=(node)malloc(sizeof(BSTnode)); s->data=key; s->lchild=s->rchild=NULL; if(!p) *t=s; /*被插入节点*s为新的根节点*/ else if(keydata) p->lchild=s; /*被插节点*s为左孩子*/ else p->rchild=s; /*被插节点*s为右孩子*/ return (1); } else return (0); /*树中已有关键字相同的节点,不再插入*/ } 4.4 中序遍历 inorderTraverse(node *t) /*中序遍历*/ { if(*t){ if(inorderTraverse(&(*t)->lchild)) { printf("%d ",(*t)->data); if(inorderTraverse(&(*t)->rchild)); } } else return(1); } 4.5 平均查找长度 calculateASL(node *t,int *s,int *j,int i) /*计算平均查找长度*/ {if(*t){ i++; *s=*s+i; if(calculateASL(&(*t)->lchild,s,j,i)) { (*j)++; if(calculateASL(&(*t)->rchild,s,j,i)) {i--; return(1);} } } else return(1); } 4.6 删除节点 node Delete(node t,int key) { /*若二叉排序树t中存在关键字等于key的数据元素时,则删除该数据元素节点 */ node p=t,q=NULL,s,f; while(p!=NULL) { if(p->data==key) break; q=p; if(p->data>key) p=p->lchild; else p=p->rchild; } if(p==NULL) return t; if(p->lchild==NULL) { if(q==NULL) t=p->rchild; else if(q->lchild==p) q->lchild=p->rchild; else q->rchild=p->rchild; free(p); } else{ f=p; s=p->lchild; while(s->rchild) { f=s; s=s->rchild; } if(f==p) f->lchild=s->lchild; else f->rchild=s->lchild; p->data=s->data; free (s); } return t; } 4.7 判断平衡二叉树 int balanceBST(node t,int *i) /*判断平衡二叉树*/ { int dep1,dep2; if(!t) return(0); else { dep1=balanceBST(t->lchild,i); dep2=balanceBST(t->rchild,i); } if((dep1-dep2)>1||(dep1-dep2)dep2) return(dep1+1); else return(dep2+1); } 5 调试分析 5.1 时间复杂度的分析 为了保证二叉排序树的高度为lgn,从而保证然二叉排序树上实现的插入、删除和查找等基本操作的时间复杂度为O(lgn)。 5.2 运行结果 图5.1.1 调试界面 在程序调试过程当中,编译时并没有报错,但是运行时总是出错,在查阅资料和同学的帮助下,发现程序未对数组初始化。添加数组初始化代码: s=(node)malloc(sizeof(BSTnode)) 输入一组数列,以结0结束: 图5.2.2运行界面一 中序遍历: 图5.2.3运行界面二 计算平均查找长度 图5.2.4运行界面三 删除已有结点: 图5.2.5运行界面四 删除失败: 图5.2.6运行界面五 判断是否是平衡二叉树: 图5.2.7运行界面六 5.3 结果分析 通过运行程序和严密的求证,运行结果无误,不过对于转换平衡二叉树和平衡二叉树平均查找长度未能实现,同时也无法实现图像显示。 6 课程设计总结 在这一周的课程设计中,其实对我来说还是收获颇多。这不光提高了我的程序设计能力,更为我的就业增加了筹码。对我们来说,独立完成这样课程设计是比较困难,其中包括模块的组成分析和模块功能的实现。最后我不得不从网上下载源程序,借助课本,困难地将几个模块串起来。最后终于完成了自己的课程设计。 这次实验中我也出现过一些比较严重的错误。在用一维数组顺序表结构编写程序时我错误的运用静态链表来实现函数功能。这是我对基本概念理解的模糊不清造成的。我原以为只要采用一维数组作为存储结构它就一定也是顺序表结构,而实质上这根本是两个不相干的概念。后来在同学的指点下我意识到自己的错误。不过收获也很不少。至少我又练习了运用静态链表来实现同样的功能,同时我也发现两者在很多函数上是互通的,只需稍作修改即可移植。 另外程序的不足之处是不能实现对0这个数字的存储,可以通过改变数字的存储结构方式来实现,如使用二叉链表来作为数据的存储结构,即可实现该功能。还有就是可能自己学的还不够,对于最后两个要求未能完成,不得不说这是自己学艺不精。 现在觉得以前我对数据结构的认识是那么的肤浅,因此我下定决心寒假一定好好的把数据结构复习一遍。而且本次课程设计不光增强了我程序调试的能力,还有在面对一个较大的程序要冷静,不要浮躁,先分析模块要实现的功能,再把模块划分,最后到一个一个得模块实现,并且要不断地练习,这样,一个大的程序对我来说将不成问题。 参考文献 [1]刘大有等,《数据结构》(C语言版),高等教育出版社 [2]严蔚敏等,《数据结构》(C语言版),清华大学出版社 [3]William Ford,William Topp,《Data Structure with C++》清华大学出版社 [4]苏仕华等,数据结构课程设计,机械工业出版社

12,864

社区成员

发帖
与我相关
我的任务
社区描述
CSDN 下载资源悬赏专区
其他 技术论坛(原bbs)
社区管理员
  • 下载资源悬赏专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧