开设算法设计与分析试卷基础课有什么用

扫一扫下载手机客户端
扫描我,关注团购信息,享更多优惠
||网络安全
| | | | | | | | | | | | | | | |
||电子电工
汽车交通| | | | | | | | | |
||投资理财
| | | | | | | | | | | | | | | | |
| | | | | | |
| | | | | | | | | | | | | | | | | | |
| | | | | | |||
||外语考试
| | | | | | | | |
| 视频教程|
算法设计与分析基础(第2版)
定价:¥49.00
校园优惠价:¥36.75 (75折)
促销活动:
此商品暂时缺货(可留下联系方式,到货将第一时间通知您)
如果您急需团购,可点击“团购急调”按钮将此书加入购物车,由客服人员为您协调调货!
电话号码:
*邮箱地址:
原书名:Introduction to the Design and Analysis of Algorithms (2nd Edition)
原出版社:
ISBN:上架时间:出版日期:2007 年1月开本:185×260页码:409版次:2-1
所属分类:
作者基于丰富的教学经验,开发了一套对算法进行分类的新方法。这套方法站在通用问题求解策略的高度,能对现有的大多数算法进行准确分类,从而使读者能够沿着一条清晰的、一致的、连贯的思路来探索算法设计与分析这一迷人领域。本书作为第2版,相对第1版增加了新的习题,还增加了“迭代改进”一章,使得原来的分类方法更加完善。.
本书十分适合作为算法设计和分析的基础教材,也适合任何有兴趣探究算法奥秘的读者使用,只要读者具备数据结构和离散数学的知识。...
作者简介:莱维丁是Villanova大学计算科学系的教授。他的论文 A New Road Map of Algorithm Design Techniques:Picking Up Where the Traditional Classification Leaves Off(《算法设计技术新途径:弥补传统分类法的缺憾》)受到业内人士极高的评价。在SIGCSE会议上,作者做过多次关于算法教学的演讲。
译者简介:潘彦,计算机专业人士,国际电气电子工程师学会(IEEE)会员。
什么是算法
算法问题求解基础
重要的问题类型
基本数据结构
算法效率分析基础
渐进符号和基本效率类型
非递归算法的数学分析
递归算法的数学分析
例题:斐波那契数列
算法的经验分析
算法可视法
选择排序和冒泡排序
顺序查找和蛮力字符串匹配
最近对和凸包问题的蛮力算法
  三年前的夏天,本书第1版刚刚脱稿,现在,它的第2版又即将付梓了。.
  三年中,本书第1版伴随着众多喜爱算法并用心学习算法的各位读者走过了一千多个日日夜夜。想到大家正在通过我的文字来理解Levitin教授的原著,又想到自己水平有限,失误实在无法完全避免,因此背上常常会生出汗来。但我没有想到的是,读者给了我很多鼓励和帮助。
  首先,读者们给我写来大量的电子邮件,有探讨问题的,有表扬的,有建议的,还有打算为本书成立一个论坛的,真的非常感谢大家。其次,读者们聚集在某一知名网上书店的论坛里讨论本书,大多数读者都没有吝惜溢美之词,让我受宠若惊。而且,先后有20位大学教师确定将此书作为相关课程的教材,我非常感谢大家的信任。更有益锋、csoapy、马帅、1rc531、dreamhead等网友,提出了不少勘误建议,尤其令人高兴的是,这些建议100%都是正确的。..
  欣喜之余,不禁让人感叹互联网的巨大威力。如果没有电子邮件、网上论坛这样的互联网工具,读者和译者的交流不可能这样自由和迅捷,最新的勘误也不能以最快的速度送达读者手中,就连书中许多互联网相关的习题也无法完成。更有意思的是,如果没有互联网,我也不可能为大家翻译本书,因为对本书译者的甄选,译者和编者的日常交流也完全是在网上进行的。
  互联网就是以这样的方式在改变着我们的生活,改变着整个世界,可以说,它是近20年来最伟大的发明。但大家有没有想到,正是各种算法在支撑着整个互联网的正常运行。互联网的信息传输需要路由选择算法,互联网的信息安全需要加密算法,互联网的信息检索需要模式匹配算法,互联网的信息存储需要排序算法,这样的例子不胜枚举。应该承认,没有算法就没有互联网。
  本书第1章“绪论”引用了David Berlinski的名言:“微积分以及在微积分基础上建立起来的数学分析体系成就了现代科学,而算法则成就了现代世界。”这句话绝不是随便说说而已的,算法的确是一种改造世界的有力工具。因此,我衷心希望读者们能够学好算法、用好算法,甚至能在算法上有所创新,真正掌握算法的强大威力。
  最后,我还是要感谢家人,尤其是妻子李靓对本书翻译过程的大力支持,你们的赞赏是我坚持下去的动力。...
  phil_pan@hotmail.com
  一个人接受科技教育的最大收获,是那些能够受用一生的通用智能工具”。.
  ――George Forsythe,What to do till the computer scientist comes,1968
  无论是计算科学还是计算实践,算法都在其中扮演着重要角色。由于这一事实,这门学科中出现了大量的教材。它们在介绍算法的时候,基本上都选择了以下两种方案中的一种。第一种方案是按照问题的类型对算法分类。这类教材安排了不同的章节分别讨论排序、查找、图等算法。这种做法的优点是,对于解决同一问题的不同算法,它能够立即比较这些算法的效率。其缺点在于,由于过于强调问题的类型,它忽略了对算法设计技术的讨论。
  第二种方案围绕着算法设计技术来组织章节。在这种结构中,即使算法来自于不同的计算领域,如果它们采用了相同的设计技术,就会被编成一组。从各方获得的信心(例如[BaY95])使我相信,这种结构更适合于算法设计与分析的基础课程。强调算法设计技术有三个主要原因。第一,学生们在解决新问题时,可以运用这些技术设计出新的算法。从实用的角度看,这使得学习算法设计技术成为一种很有价值的努力。第二,学生们会试图按照算法的内在设计方法对已知的众多算法进行分类。计算机科学教育的一个主要目的,就是让学生们知道如何发掘不同应用领域的算法间的共性。毕竟,每门学科都会倾向于把它的重要主题归纳为几个甚至一个规则。第三,依我看来,算法设计技术作为问题求解的一般性策略,在解决计算机领域以外的问题时,也能发挥相当大的作用。
  遗憾的是,无论是从理论还是从教学的角度,传统的算法设计技术分类法都存在一些严重的缺陷。其中最显著的缺陷就是无法对许多重要的算法进行分类。由于这种局限性,这些书的作者不得不在按照设计技术进行分类的同时,另外增加一些章节来讨论特殊的问题类型。但这种改变将导致课程缺乏一致性,而且很可能会使学生感到迷惑。
  算法设计技术的新分类法
  传统算法设计技术分类法的缺陷令我感到失望,它激发我开发一套新的分类法[Lev99],这套分类法就是本书的基础。以下是这套新分类法的几个主要优势。
  新分类法比传统分类法更容易理解。它包含的某些设计策略,比如蛮力法、减治法、变治法、时空权衡和迭代改进――它们几乎从不曾被看作重要的设计范例。
  新分类法很自然地覆盖了许多传统方法无法分类的经典算法(欧几里得算法、堆排序、查找树、散列法、拓扑排序、高斯消去法、霍纳法则等,不胜枚举)。所以,新分类法能够以一种连贯的、一致的方式表达这些经典算法的标准内容。
  新分类法很自然地容纳了某些设计技术的重要变种(比如,它能涵盖减治法的3个变种和变治法的3个变种)。
  在分析算法效率时,新分类法与分析方法结合得更好(参见附录B)。
  设计技术作为问题求解的一般性策略
  在本书中,主要将设计技术应用于计算机科学中的经典问题(这里惟一的创新是引入了一些数值算法的内容,我们也是用同样的通用框架来表述这些算法的)。但把这些设计技术看作问题求解的一般性工具时,它们的应用就不仅限于传统的计算问题和数学问题了。有两个因素令这一点变得尤其重要。第一,越来越多的计算类应用超越了它们的传统领域,并且有足够的理由使人相信,这种趋势会愈演愈烈。第二,人们渐渐认识到,提高学生们的问题求解能力是高等教育的一个主要目标。为了满足这个目标,在计算机科学课程体系中安排一门算法设计和分析课程是非常合适的,因为它会告诉学生如何应用一些特定的策略来解决问题。
  虽然我并不建议将算法设计和分析课程变成一门教授一般性问题求解方法的课程,但我的确认为,我们不应错过算法设计和分析课程提供的这样一个独一无二的机会。为了这个目标,本书包含了一些和谜题相关的应用。虽然利用谜题来教授算法课程绝不是我的创新,但本书打算通过引进一些全新的谜题来系统地实现这个思路。
  如何使用本书
  我的目标是写一本既不泛泛而谈,又可供学生们独立阅读的教材。为了实现这个目标,本书做了如下努力。
  根据George Forsythe的观点(参见引言),我试图着重强调那些隐藏在算法设计和分析背后的主要思想。在选择特定的算法来阐述这些思想的时候,我并不倾向于涉及大量的算法,而是选择那些最能揭示其内在设计技术或是分析方法的算法。幸运的是,大多数经典算法满足了这个要求。..
  第2章主要分析算法的效率,该章将分析非递归算法的方法和分析递归算法的典型方法区别开宋。这一章还花了一些篇幅介绍算法经验分析和算法可视化。
  书中系统地穿插着一些面向读者的提问。其中有些问题是经过精心设计的,而且立即提供答案,目的是引起读者的注意或引发疑问。其余问题的用意是防止读者走马观花,不能充分理解本书的内容。
  每一章结束时都会对本章最重要的概念和结论做一个总结。
系列图书推荐 ¥49.00¥36.75
同类热销商品¥108.00¥81.00
订单处理配送
北京奥维博世图书发行有限公司 china-pub,All Rights Reserved[友情链接]算法:设计和分析(一) Algorithms: Design and Analysis, Part 1 Coursera | MOOC学院 果壳网旗下慕课学习社区
Algorithms: Design and Analysis, Part 1算法:设计和分析(一)
(31人评价)
知识量:10
教师参与:9.0
趣味性:8.6
课程设计:9.9
难度:一般
本课程在开课,请在开课时间内报名参加以获得完整体验。
在本课中,你将会学到算法设计的一些基本原则。你将会学到分治算法,常被用于应用中进行快速排序、搜索和乘法运算。你将会学到用于图论计算的极其快速的基元,例如如何计算连通性信息以及最短路径。最后,我们将会学习如何让计算机来“投硬币”,将会引出典雅且实用的算法和数据结构。学会回答以下问题:数据结构,如堆、哈希表、布鲁姆过滤器和平衡搜索树是如何工作的?快速排序为何能运行的如此快速?图论算法能告诉我们有关Web结构和社交网络的什么?我3年级的老师只解释了两数相乘的次优算法吗?课程大纲第一周:引言. 渐进分析包含有大O符号,用于排序的分治算法,统计逆序算法,矩阵相乘以及最接近点对问题第二周:分治算法的运行时分析。主方法。随机算法的介绍和概率审查。快速排序算法第三周:深入讲解随机算法以及概率。在线性时间内计算中位数。随机算法在最小图切问题上的应用第四周:图形基元。深度和广度搜索。无向图的连通分量。有向无环图的拓扑排序。有向图的强连通分量第五周:迪杰斯特拉最短路径算法。数据结构概论。堆及其应用第六周:深入讲解数据结构。哈希表及其应用。平衡二叉搜索树先修知识至少会以下一种编程语言(如C,Java或Python);熟悉证明方法,包括归纳证明和矛盾证明。在斯坦福大学,此为计算科学专业大二、三和四学生的课程。推荐阅读本课无指定教材。课程材料包含在许多著名的算法书籍中,学生可随意挑选自己感兴趣的教材,进行补充学习。课程形式课程将会包含演讲视频,长度为10到15分钟,其中会包括测验题目。另外会包括除演讲视频外的独立家庭作业和编程作业,以及期末考试。常见问题解答Q:课程结束后我会得到结业证书吗?A:是的。成功修完课程的同学将会收到由讲师颁发的结业证书。Q:课程形式是什么?A:课程包括演讲视频,被分成了几部分,每部分平均时长为8到12分钟。其中一些会包含测验题目。另外会包含除视频测验之外的独立测试。每周会有将近两个小时的视频内容。Q:我需要哪些知识储备?A:至少会以下一种编程语言(如C,Java或Python);熟悉证明方法,包括归纳证明和矛盾证明;熟悉离散概率,例如,如何计算扑克牌游戏中三张同点加一对的概率。在斯坦福大学,此为计算科学专业大二、三和四学生的课程。Q:算法:设计和分析和普林斯顿大学的算法课程有何区别?A:两门课是互补的。普林斯顿大学的课程强调实施和测试,本课聚焦算法设计范式和用于分析的相关数学模型。在典型的计算科学课程设置中,本课适合大三大四学生学习,而普林斯顿大学的课程适合大一大二学生学习。//翻译:
1. 难度:个人认为,算法课程基本上分为设计、分析、应用与实现,这个课程侧重于设计和分析这个两个部分,所以会涉及到较多的数学知识,这也是课程难度较高的原因之一吧。对于算法新手来说,难度算比较大了。
2. 内容:每周的视频有点长,完全跟下来并且理解了,需要耗费很多时间(惭愧,本人就是跳着看的...)。考核内容分为quiz和assignment两部分,quiz部分主要侧重于考核算法设计与分析,个人感觉难度较大;assignment部分侧重于考核对经典算法的编程实现,难度还可以吧,可能和我个人偏重于应用而不善分析有关。
3. 教学:老师是算法领域牛人,不过我跟他的视频有点吃力,很多时候看着看着就跟不上了...需要翻翻算法的书去理解某些知识。
4. 感觉算法学习,分析、设计和应用实现应该同步起来学,这门课本身的编程作业还是单薄了点,coursera上面有另一门侧重算法实现和应用的课程,没上过,不过感觉这两门结合起来学,应该效果非常好。
已完成总体感觉,非常好。Part 1结了之后立即就去注册了Part 2。尽量不重复别人的点评内容。说三点:
1. 内容:安排非常合理和流畅。课程的安排不是通过呆板的自上而下分割,6周的课程前后衔接过度非常自然。首先是最基本的Divide and Conquer Paradigm,由其中的Quicksort Algorithm过渡到Random Algorithm Paradigm,又由其中的Karger Contraction Algorithm全面过渡到Graph相关的内容中。在介绍Graph相关问题和算法的时候,又自然地涉及到了queue, stack等基本数据结构,直到由Dijstra's Shortest Path Algorithm引出heap而将重点全面转移到数据结构上。
2. 难度。既然是算法课,内容的理解难度是一定的,所有的课都差不多。这门课有涉及不少证明,但基本是在比较high level上介绍证明思路,讲得提纲挈领,而没有过度拘泥于细节。课后quiz类习题量很少,但有一些陷阱,需要想仔细。编程习题问题都很基本,都是implement课中讲到的算法,从算法设计本身来说没有很大挑战性。但本人因为之前只会Matlab,花了两天学会python,在用python做编程习题的时候还是花了不少时间。课堂论坛很有帮助。
3. 语言。有不少人反应教授讲课语速较快,而且没有中文字幕。首先要说明的是,Tim英语很标准,没有(地方)口音!而他的语速快正是我喜欢的地方。不是每个学术强的教授都善于讲课的。而这个教授在口头表达方面非常优秀,思路极其清晰,讲述极其流畅,而且态度非常自信。他的用语也非常口语化,因此事实上,大家不仅不应该担心没有中文字幕,而应该拿这门课的视频作为学习英语口语表达的素材!
已完成配套算法导论。觉得非常赞。当时整理笔记和课后编程练习都花了不少时间。
非常喜欢Tim。
继续上一篇。
第4周:号称是最难的一周(其实我一次过,第5周反而提交了4次才过)。对一个有向图,使用课上学习的Kosa...
赞(1)评论(4)
准备把几次作业的完成思路写在这里,供大家参考。
第1周:十万个乱序整数,找逆序对。一个较小的数排在一个较大的数的后面,...
赞(4)评论(3)
Coursera上非常吸引人的课程之一就是Stanford开设的Algorithms: Design and An...
赞(3)评论(0)
这门课内容丰富,Tim语速较快,跟下来很不容易,总结一下也好继续第二部分的课程!
第一周:用于熟悉这门课程的教学方式(...
赞(2)评论(0)
Randomized Selection
——问题:对于一列乱序数组,如何取到其中第i大的元素?
●Reduction...
赞(0)评论(1)
带着一裤兜子的工作随便儿给一个朋友做的,大家感兴趣随便看看,我不定期更新。。平时上班。。做这东西太慢太恶心,而且没空调整...
赞(1)评论(0)
和小陈老师讨论后
骤然发现,该题是POJ2299,只不过数字变成了整形下100,000个数。该作业的文件672k。
赞(2)评论(0)
几个自己忘记意思的单词:
upshot: 结果,要点;
obedient:顺从的,服从的;
tumidity:肿大...
赞(0)评论(0)
Graph Search
●几个问题
——连通性问题
——driving direction
——formulate a...
赞(2)评论(9)
Tim Roughgarden
26人获得证书加载中,请稍候...
加载中,请稍候...
京 东 价:
¥38.30 [8.6折][定价:¥45.00]
温馨提示:
其它类似商品
正在加载中,请稍候...
正在加载中,请稍候...
正在加载中,请稍候...
高等学校计算机课程规划教材:数据结构与算法(C++版)
查找同类商品
  通过《数据结构与算法(C++版)》的学习,不但能迅速提高数据结构与算法的水平,同时还能提高C++程序设计的能力,经过适当的选择,《数据结构与算法(C++版)》能作为高等院校计算机及相关专业“数据结构”、“数据结构与算法”、“数据结构与算法分析”和“数据结构与算法设计”等课程的教材,也可供其他从事软件开发工作的读者参考。
  本书结合C++面向对象程序设计的特点,构建了数据结构与算法,对所有算法都在Visual
6.0、Visual
2005、Visual
Express、Dev-C++和MinGW
Studio开发环境中进行了严格的测试,作者教学网站提供了大量的教学支持内容。同时本书配有《数据结构与算法(C++版)实验和课程设计教程》
978-7-302-17503-2)供读者学习参考。  本书共分11章,第1章是基础知识,介绍了基本概念及其术语,并讨论了实用程序软件包;第2章引入线性表;第3章介绍了栈和队列,用栈实现了表达式求值;第4章介绍串,详细讨论了串的存储结构与模式匹配算法;第5章介绍数组和广义表,首次提出了广义表的使用空间表存储结构;第6章介绍了树结构,应用哈夫曼编码实现了压缩软件;第7章介绍图结构,实现了图的常用存结构,讨论了图的相关应用,并实现了相应算法;第8章介绍查找,讨论了静态查找表、动态查找表与散列表,实现了所有算法;第9章介绍排序,以简洁方式实现各种排序算法;第10章介绍了文件,讨论了各种常用文件结构;第11章介绍了算法设计技术、分析技术与可计算问题。  通过本书的学习,不但能迅速提高数据结构与算法的水平,同时还能提高C++程序设计的能力,经过适当的选择,本书能作为高等院校计算机及相关专业“数据结构”、“数据结构与算法”、“数据结构与算法分析”和“数据结构与算法设计”等课程的教材,也可供其他从事软件开发工作的读者参考。
数据结构的概念和学习数据结构的必要性11.2
数据结构的基本概念21.2.1
数据21.2.2
数据元素和数据项21.2.3
数据结构31.3
抽象数据类型及其实现41.3.1
数据类型41.3.2
抽象数据类型41.3.3
C++程序的典型构架51.3.4
C++的类和对象61.3.5
C++的友元函数71.3.6
运算符重载91.3.7
C++的参数传递121.3.8
C++的输入输出141.3.9
有关C++的动态存储分配151.3.1
0结构与类171.3.1
1C++的模板171.4
算法和算法分析191.4.1
算法191.4.2
算法分析201.5
实用程序软件包231.6
实例研究311.6.1
生命游戏311.6.2
计算任意位数的π311.7
深入学习导读38习题138上机实验题139第2章
线性表412.1
线性表的逻辑结构412.2
线性表的顺序存储结构422.3
线性表的链式存储结构512.3.1
单链表512.3.2
循环链表592.3.3
双向链表632.3.4
在链表结构中保存当前位置和元素个数662.4
实例研究782.4.1
一元多项式的表示782.4.2
计算任意大整数的阶乘832.5
深入学习导读86习题287上机实验题287第3章
栈和队列883.1
栈的基本概念883.1.2
顺序栈893.1.3
链式栈943.2
队列1003.2.1
队列的基本概念1003.2.2
链队列1023.2.3
循环队列――队列的顺序存储结构1063.2.4
队列应用――显示二项式(a+b)i的系数1113.3
优先队列1123.4
实例研究1163.4.1
表达式求值1163.4.2
事件驱动模拟1193.5
深入学习导读124习题3125上机实验题3125第4章
串类型的定义1274.2
字符串的实现1284.3
字符串模式匹配算法1344.3.1
简单字符串模式匹配算法1344.3.2
首尾字符串模式匹配算法1364.3.3
KMP字符串模式匹配算法1364.4
实例研究1414.4.1
文本编辑1414.4.2
查找子序列1424.5
深入学习导读143习题4143上机实验题4143第5章
数组和广义表1445.1
数组1445.1.1
数组的基本概念1445.1.2
数组的顺序存储方式1445.1.3
数组的类定义1475.2
矩阵1505.2.1
矩阵的定义和操作1505.2.2
特殊矩阵1525.2.3
稀疏矩阵1575.3
广义表1675.3.1
基本概念1675.3.2
广义表的存储结构1695.4
实例研究1795.4.1
稳定伴侣问题1795.4.2
m元多项式的表示1795.5
深入学习导读182习题5183上机实验题5183第6章
树和二叉树1846.1
树的基本概念1846.1.1
树的定义1846.1.2
基本术语1846.2
二叉树1866.2.1
二叉树的定义1866.2.2
二叉树的性质1886.2.3
二叉树的存储结构1906.3
二叉树遍历1996.3.1
遍历的定义1996.3.2
遍历算法2006.3.3
二叉树遍历应用举例2066.4
线索二叉树2116.4.1
线索的概念2116.4.2
线索二叉树的实现2136.5
树和森林2216.5.1
树的存储表示2216.5.2
树的显示2286.5.3
森林的存储表示2286.5.4
树和森林的遍历2336.5.5
树和森林与二叉树的转换2356.6
哈夫曼树与哈夫曼编码2386.6.1
哈夫曼树的基本概念2386.6.2
哈夫曼树构造算法2396.6.3
哈夫曼编码2396.6.4
哈夫曼树的实现2416.7
树的计数2456.8
实例研究2476.8.1
树与等价关系2476.8.2
Huffman压缩算法2516.9
深入学习导读256习题6256上机实验题6257第7章
图的定义和术语2587.2
图的存储表示2627.2.1
邻接矩阵2627.2.2
邻接表2677.3
图的遍历2747.3.1
深度优先搜索2757.3.2
广度优先搜索2767.4
图的最小代价生成树2777.4.1
Prim算法2787.4.2
Kruskal算法2807.5
有向无环图及应用2847.5.1
拓扑排序2847.5.2
关键路径2877.6
最短路径2917.6.1
单源点最短路径问题2917.6.2
所有顶点之间的最短路径2947.7
实例研究2967.7.1
周游世界问题――哈密尔顿圈2967.7.2
一笔画问题――欧拉问题2987.8
深入学习导读299习题7299上机实验题7301第8章
查找3028.1
查找的基本概念3028.2
静态表的查找3058.2.1
顺序查找3058.2.2
有序表的查找3068.3
动态查找表3098.3.1
二叉排序树3098.3.2
二叉平衡树3198.3.3
B树和B+树3438.4
散列表3458.4.1
散列表的概念3458.4.2
构造散列函数的方法3458.4.3
处理冲突的方法3468.4.4
散列表的实现3478.5
实例研究3528.5.1
查找3个数组的最小共同元素3528.5.2
查找最小元素3538.6
深入学习导读354习题8354上机实验题8355第9章
排序3569.1
概述3569.2
插入排序3579.2.1
直接插入排序3579.2.2
Shell排序3589.3
交换排序3609.3.1
起泡排序3609.3.2
快速排序3619.4
选择排序3649.4.1
简单选择排序3649.4.2
堆排序3659.5
归并排序3689.6
基数排序3739.6.1
多关键排序3739.6.2
基数排序3739.7
各种内部排序方法讨论3769.8
外部排序3789.8.1
外部排序基础3789.8.2
外部排序的方法3789.9
实例研究3809.9.1
宴会中来宾数目的最大值3809.9.2
各种排序算法运行时间测试3829.9.3
用堆实现优先队列3859.10
深入学习导读388习题9388上机实验题9389第10章
文件39010.1
主存储器和辅助存储器39010.2
各种常用文件结构39010.2.1
顺序文件39010.2.2
索引文件39110.2.3
散列文件39210.3
实例研究39210.3.1
VSAM文件39210.3.2
多关键字文件39310.4
深入学习导读395习题10395上机实验题10395第11章
算法设计与分析39711.1
算法设计39711.1.1
递归算法39711.1.2
分治算法40111.1.3
动态规划算法40711.1.4
贪心算法42211.1.5
回溯算法42511.1.6
分支限界法43011.2
算法分析44011.2.1
递归分析44011.2.2
利用生成函数进行分析44311.3
可计算性问题44511.3.1
归约44511.3.2
难解问题、N问题、NP问题和NP完全性问题44611.3.3
不可编程问题44711.4
实例研究44911.4.1
图着色问题44911.4.2
多边形游戏45111.5
深入学习导读455习题11
456上机实验题11
调和级数458附录B
泊松分布459附录C
配套的软件包460附录D
课程设计项目466附录E
实验报告格式471附录F
课程设计报告格式472参考文献473
绪论  可能有人认为,随着计算机的功能越来越强大和运行速度越来越快,程序运行效率已变得越来越不重要了。然而,计算机功能越强大,人们就越要尝试解决更加复杂的问题,而更复杂的问题需要更大的计算量,这使得对程序的运行效率有更高的要求,工作越复杂越偏离人们的日常经验,使得从事软件开发的人必须学习和具备彻底理解隐藏在程序设计后面的一般原理――数据结构和算法。  从本质上讲,数据结构与算法的原理和方法独立于具体描述语言,然而只能使用具体的某种计算机语言才能在计算机上实现。本书采用目前普遍使用的C++程序设计语言来描述各种数据结构与算法,假设读者具有程序设计基础,了解C++的基本结构和语法。为了、使读者更好理解,本章将对C++的基本结构和语法进行介绍。  1.1
数据结构的概念和学习数据结构的必要性  对于数值计算问题的解决方法,主要是用数学方程建立数学模型,例如天气预报的数学模型为二阶椭圆偏微分方程;预测人口增长的数学模型为常微分方程。求解这些数学模型的方法是计算数学研究的范畴,例如采用差分算法、有限元算法和无限元算法等。  对于非数值计算问题,主要采用数据结构的方法建立数学模型,下面通过实例加以说明。
  数据结构与算法内容丰富,包含了计算机科学与技术的许多重要方面。分析和解决问题的思路和方法新颖,技巧性强,对学生的计算机软件素质的培养作用明显。培养和训练学生选用合适的数据结构与算法设计方法编写质量高、风格好的应用程序,并具备评价算法优劣的能力至关重要。  本书采用C++面向对象的观点介绍数据结构与算法,并使用模板程序设计技术,与采用面向过程的传统观点相比优势较大,使所设计的程序更容易实现代码重用,在提供通用性和灵活性的同时,又保证了效率。本书已将面向对象程序设计的思想融合到数据结构与算法中,读者通过学习可进一步提高面向对象程序设计的能力。  全书共分为11章。  第1章是基础知识,介绍了基本概念及其术语,抽象数据类型的实现,还讨论算法的概念和算法分析的简单方法。作为预备知识,读者应具有一定的C++程序设计的基础。但是为了降低读者的门槛,本章还介绍了要用的C++的主要知识点,并介绍了实用程序软件包。  第2章引入线性表,详细讨论线性表的顺序存储结构与链式存储结构。在讨论链式存储结构时,首先仿照传统方法实现线性表,然后在此基础之上,在链表结构中保存当前位置和元素个数。这样,在难度增加不大的情况下提高算法效率,使学生逐步体会改进算法的途径与方法。  第3章介绍了栈和队列,讨论了栈和队列的顺序存储结构与链式存储结构,用栈实现了表达式求值。通过学习能掌握各种栈和队列的实现与使用方法,对后继课程(如操作系统原理和编译原理)的学习打下良好的基础。本章还讨论了优先队列,使队列应用更加广泛。  第4章介绍串,详细讨论了串的存储结构与模式匹配算法,为开发串应用(如实现文本编辑软件)软件打下坚实的基础。  第5章介绍数组和广义表,详细讨论了数组,特殊矩阵,稀疏矩阵和广义表的存储结构及实现方法,首次提出了广义表的使用空间表存储结构,并使用广义表实现了m元多项式的表示。  第6章介绍了树结构,讨论了二叉树、线索二叉树、树、森林及其哈夫曼树的结构及其实现,还应用哈夫曼编码实现了压缩软件。  第7章介绍图结构,实现了图的常用存储结构,并讨论了图的相关应用,实现了相应算法(如求最小生成树的Prim算法与Kruskal算法,求最短路径的Dijkstra算法与Floyd算法)。  第8章介绍查找,讨论了静态查找表、动态查找表与散列表,还讨论了二叉排序树、二叉平衡树与B树,并实现了所有算法。  第9章介绍排序,以简洁方式实现各种排序算法,还测试了各种排序算法的实际运行时间。  第10章介绍了文件,讨论了主存储器和辅助存储器,以及各种常用文件结构,还特别介绍了在数据库中经常采用的VSAM文件,对读者研究与学习数据库有一定的帮助。  第11章介绍了算法设计技术、分析技术与可计算问题,详细讨论了各种算法设计技术(如贪心算法、分治算法、回溯算法)的使用方法并实现了各种算法,对算法分析技术和可计算问题也进行了深入浅出的讨论。对读者的算法设计和分析的理论和实践都有极大的帮助。  对于初学者,要完全独立编写数据结构与算法的代码是相当困难的。因此,本书讨论的数据结构与算法都加以实现并进行了严格测试,提供了完整的测试程序,读者可参考这些测试程序编写相关算法。但是,如果只会使用已有的数据结构编写简单的程序也不利于读者对数据结构与算法的深入理解,以及研究新数据结构与算法的能力。因此,本书的习题不但包括了基本练习题,还包括了仿照书中数据结构构造新数据结构的题目,或改造已有算法的题目,这样使读者具有构造新结构及改造或改进算法的能力。  本书各章还提供了实例研究,主要提供给那些精力充沛的学生深入学习与研究,这些实例包括对正文内容的补充(例如第9.9.3小节中的用堆实现优先队列),读者可能感兴趣但感到无从下手的算法(例如第1.6.2小节中的计算任意位数的π)
、离散数学中学习的著名算法的实现(例如第7.7.1小节中的周游世界问题――哈密尔顿圈与第7.7.2小节中的一笔画问题――欧拉问题)以及应用所学知识解决实际问题(例如第6.8.2小节中的Huffman压缩算法)。通过读者对实例研究的学习,可提高实际应用数据结构与算法的能力。当然,这可能有一定的难度,但应比读者想象的更易学习与掌握。  现在,各校在开设“数据结构与算法”课时都安排有上机实验课时,因此本书每章都安排有上机实验题,这些实验题不但包括读者感兴趣的实验(例如纸牌游戏――
,数据结构与算法基本应用的实验(例如编写一个程序读入一个字符串,统计字符串中出现的字符及次数,然后输出结果,要求用一个二叉排序树来保存处理结果,结点的数据元素由字符与出现次数组成,关键字为字符),对课本数据结构与算法改进的实验(例如改进本书实现的求最小生成树的Kruskal算法,用最大优先队列来实现按照边的权值顺序处理,用等价关系判断两个结点是否属于同一棵自由树以及合并自由树),还包括了解决实际问题的实验(例如采用散列文件实现电话号码查找系统),通过实验能极大地提高读者对数据结构与算法的应用能力。  为了进一步提高读者运用数据结构与算法的水平,现在很多学校还开设了“数据结构与算法课程设计”。为此,本书的附录提供了11个课程设计项目,这些项目包括了接近实际课题的题目(例如开发排课软件与公园导游系统)、容易引起读者兴趣的项目(例如理论计算机科学家族谱的文档/视图模式)与需要通过查找资料进一步提高的题目(例如采用自适应形式的哈夫曼编码方案开发压缩软件)。课程设计项目一般都提供功能的扩展方法,基础较差的读者可只实现基础功能,对数据结构与算法有兴趣的读者可实现更强的功能,这样使不同层次的读者都会有所收获,通过做这些项目能快速提高读者解决实际问题的能力。  为了尽快提高读者的学习能力,本书各章还提供了深入学习导读,包含了本书作者实现相关数据结构与算法的最原始思想的资料来源,也包括了进一步学习的参考资料,极大地方便读者与教师查阅资料。  本教材在内容组织上特别考虑了读者的可接受性;在算法实现时,重点考虑了程序的可读性,为实现更强的功能,一般采用启发的方式在习题、上机实验或课程设计中实现,这样容易培养起读者的学习兴趣,使读者感到自己具有发展或改进已有算法的能力,也会使读者感到自己已达到计算机高手的自信心。  本书作者都活跃在教学研究第一线上,同时有的作者还具有深厚的数学功底。因此,本书不但完成了所有算法的测试程序,对算法分析的相关公式进行了严格的数学推理,还独立地从数学上严格推出了一种产生泊松随机数的算法(见附录B)
。事实上,用同样的方法可产生任何离散随机分布(例如二项分布),本书作者还首次对本书中关于计算任意位数π的算法作了严格的理论推导。  本书采用了模板程序设计技术,现在模板技术已成为现代C++语言的风格基础,C++98(1998年标准化的C++)提供的标准程序库中有80%的成分是使用模板机制实现的STL(Standard
Library,标准模板库)。而国内现阶段教学并未重视C++的模板程序设计,书籍资料也不是很多。作者认为在C++中,只要模仿本书算法,读者会在不知不觉中掌握模板程序设计技巧。  现在来讨论一下在国外“数据结构与算法”课程上机教学时喜欢采用的STL。实际上,STL是AT&T贝尔实验室和HP研究实验室的研究人员将模板程序设计和面向对象程序设计的原理结合起来,创造的一套研究数据结构与算法的一种统一的方法,现在已成为C++标准库的一部分。STL提供了实现数据结构的新途径,它将(数据)结构(即组织数据的存储结构)抽象为容器,将之分为3类:序列容器、关联容器和适配器容器。通过使用模板和迭代器,STL使得程序员能够将广泛的通用算法应用到各种容器类上。通过本书作者的研究与了解,STL只覆盖了数据结构中的线性结构和树结构,并没有覆盖图部分。因此,对数据结构来讲,STL并不完备。同时,如果读者上机编程都只使用STL解决数据结构的相关算法,可能使读者在数据结构编程方面,只会使用STL,而不能独自设计新数据结构。本书采用模板方法实现了书中所有的数据结构算法,应比STL更完备。同时,STL中包含的源代码可读性差,不适合作为教学使用,本书的算法源程序首要强调可读性,使读者容易接受与模仿,并且读者可进行改进或修改算法实现。因此,在某种意义上讲,本书提供的关于数据结构与算法实现的类模板与函数模板是一种GTL
Library)或OSGTL
。读者也可由作者个人主页提供的软件包(具体内容请参看附录C)来进行实际数据结构与算法方面的软件开发。当然,通过本书的学习,再返回来学习STL的应用,将会达到事半功倍的效果。读者只要找一本介绍STL的书籍或上网找一些介绍使用STL的文档,并用STL试着编程即可完全掌握STL的使用。  现在谈谈有关C++编译器的问题,在C++之外的任何编程语言中,编译器都没有受到过如此重视。这是因为C++是一门非常复杂的语言,以至于编译器也难于构造。我们常用的编译器都不能完全符合C++标准,以至于本书的部分测试不得不使用条件编译技术来适应不同C++编译器,下面介绍一些常用的优秀C++编译器。  (1)
C++编译器:由微软开发,现在主要流行Visual
6.0、Visual
2005以及Visual
Express,特点是集成开发环境用户界面友好,信息提示准确,调试方便,对模板支持最完善。Visual
6.0对硬件环境要求低,现在安装的计算机最多,但对标准C++兼容只有83.43%.
2005与Visual
Express在软件提示信息上做了进一步的优化与改进,并且对标准C++兼容达到了98%以上的程度,但对硬件的要求较高。同时,Visual
Express是一种轻量级的Visual
C++软件,易于使用。对于编程爱好者、学生和初学者来说,Visual
Express是很好的编程工具,微软在日正式宣布
Express版永久免费。  (2)
GCC编译器:著名的开源C++编译器。是类UNIX操作系统(例如Linux)下编写C++程序的首选,有非常好的可移植性,可以在非常广泛的平台上使用,也是编写跨平台、嵌入式程序很好的选择。GCC
3.3与标准C++兼容大概能够达到96.15%。现已有一些移植在Windows环境下使用GCC编译器的IDE(集成开发环境),例如Dev-C++与MinGW
Studio。其中,Dev-C++是能够让GCC在Windows下运行的集成开发环境,提供了与专业IDE相媲美的语法高亮、代码提示、调试等功能;MinGW
Studio是跨平台下的GCC集成开发环境,目前支持
Windows、Linux和
FreeBSD。根据作者的实际使用,感觉使用GCC编译器的IDE错误信息提示的智能较低,错误提示信息不太准确,还有就是对模板支持较差,对语法检查较严格,在Visual
C++编译器中编译通过的程序可能在GCC编译器的IDE还会显示有错误信息。  本书所有算法都同时在Visual
6.0、Visual
2005、Visual
Express、Dev-C++和MinGW
Studio中通过测试。读者可根据实际情况选择适当的编译器,建议选择Visual
2005.  教师可采取多种方式来使用本书讲授数据结构,数据结构与算法分析,数据结构与算法设计,数据结构与算法等课程,应该根据学生的背景知识以及课程的学时数来进行内容的取舍。为满足不同层次的教学需求,本教材使用了分层的思想,分层方法如下:没有加星号()及双星号()的部分是基本内容,适合所有读者学习;加星号的部分适合计算机专业的读者深入学习;加有双星号的部分适合于感兴趣的同学研究,尤其适合于那些有志于ACM竞赛的读者加以深入研究。下面给出了几种可能的课程安排,建议习题及实验的主要形式是让学生编写并调试一些程序。开始时程序可以比较短,随着课程的深入,程序将逐渐变大。学生应根据课堂上所讲授的主题同步阅读课本相关内容。学
分大约课时数内
容232选讲第1章~~第9章中没有打星号()及双星号()的内容348第1章~~第10章中没有打星号()及双星号()的内容464第1章~~第11章中没有打星号()及双星号()的内容580第1章~~第11章中没有打星号()及双星号()的内容,选讲部分打有星号()的内容696第1章~~第11章中没有打双星号()的内容,选讲部分打有双星号()的内容
作者为本书提供了全面的教学支持,如果在教学或学习过程中发现与本书有关的任何问题都可以与作者联系作者将尽力满足读者的要求,并可能将解答公布在作者的教学网站上。另外,在作者的教学网站上还将提供如下内容。  (1)
提供书中所有算法在Visual
6.0、Visual
2005、Visual
Express、Dev-C++和MinGW
Studio开发环境中的测试程序,今后还会提供当时流行的C++开发环境的测试程序,每种开发环境还将提供基本开发过程的文档;还提供本书作者开发的软件包(包含所有本书所讲的数据结构与算法的类模板与函数模板)。  2)
提供教学用PowerPoint幻灯片PPT课件。  (3)
向教师提供所有习题、上机实验题与课程设计项目的解答或参考程序,对学生来讲,将在每学期期末(第15周~~第20周)公布解压密码。  (4)
数据结构与算法问答专栏。  (5)
提供至少8套数据结构与算法模拟试题及其解答,以供学生期末及其考研复习,也可供教师出考题时参考。  (6)
提供数据结构与算法相关的其他资料(例如作者收集的计算任何位数π的资料,Dev-C++与MinGW
Studio软件,流行免费C++编译器的下载网址)。  希望各位读者能够抽出宝贵的时间将建议或意见(当然也可以发表对国内外“数据结构与算法”课程教学的任何意见)寄给作者,为我们修订教材提供重要参考。  孙界平、张卫华、邹昌文、王文昌、周焯华、胡开文、沈洁、周德华与欧阳等人对本书做了大量的工作,包括提供资料,调试算法,以及参与部分章节的编写;作者还要感谢为本书提供直接或间接帮助的每一位朋友,由于他们热情的帮助与鼓励,激发了写好本书的信心以及热情。  在此还要感谢清华大学出版社的编辑及评审专家,他们为本书的出版倾注了大量热情。正是由于他们具有前瞻性的眼光才让读者有机会看到本书。  尽管作者秉着负责任的态度编写这本书,并尽了最大努力,但由于水平有限,书中难免有不妥之处,因此,敬请各位读者不吝赐教,以便作者不断提高,提高写作水平。
正在加载中,请稍候...
正在加载中,请稍候...
正在加载中,请稍候...
正在加载中,请稍候...
正在加载中,请稍候...
正在加载中,请稍候...
正在加载中,请稍候...
七日畅销榜
新书热卖榜

我要回帖

更多关于 计算机算法设计与分析 的文章

 

随机推荐