《11-计算机科学与技术》由会员分享,可在线阅读,更多相关《11-计算机科学与技术(23页珍藏版)》请在人人文库网上搜索。
1、计算机软件技术基础,机械工业出版社2007年7月,第一部分 数据结构与算法基础,第1章 算法 第2章 数据结构的基础 第3章 线性表及其存储结构 第4章 栈和对列 第5章 树与二叉树 第7章 查找与排序,数据结构与算法的学习可以帮助我们更好地进行程序设计,数据结构直接关系到算法选择和程序实现效率。 应用 1)语言编译要使用“栈”程序中利用“栈”来实现函数过程的调用; 2)操作系统中要用队列打印队列,当计算机输出的数据用打印机打印时,由于打印机速度慢,此时可设置一个打印队列,将打印任务逐个打印,从而避免数据丢失或打印次序混乱; 3)数据库系统则使用线性表、链表等进行数据管理; 4)人工智能领域依。
2、据问题的差异涉及到诸如广义表、树、各种有向图等;,第1章 算法,1.1 算法的基本概念 1.2算法的描述方式,1.1 算法的基本概念,所谓算法是指解题方案的准确而完整的描述。 对于一个问题,如果可以通过一个计算机程序,在有限的存储空间内,运行有限长的时间而得到正确的结果,则称这个问题是算法可解的。 1.算法的基本特征 1)可行性:算法描述的每一个步骤必须能够实现,且能够达到预期的目的; 2)确定性:算法中的每一个步骤,必须经过明确的定义,在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出,相同的输出; 3)有穷性:算法必须能在有限的时间内做完 即算法必须能在执行有限个步骤之后终。
3、止; 4)输入:具有零个或多个输入,它们是算 法开始前的初始量; 5)输出:至少产生一个输出,它们是与输入 有某种关系的量,是算法的执行结果。,2.算法的基本要素 1)算法中对数据对象的运算和操作 通常,基本运算和操作有以下四类: 算术运算:有加、减、乘、除等运算; 逻辑运算:有“与”、“或”、“非”等运算;,关系运算:有“大于”、“小于”、“等于”、“不等于”等运算; 数据传输:有赋值、输入、输出等操作。,2)算法的控制结构 算法中各操作之间的执行顺序,称为算法的控制结构。算法的控制结构给出了算法的基本框架,它不仅决定了算法中各操作的执行顺序,而且也直接反映了算法的设计是否符合结构化原则。一。
4、个算法一般都可以用顺序、选择、循环三种基本控制结构组合而成。,3. 算法设计的基本方法 算法设计的基本方法有列举法、归纳法、递推、递归、减半递推技术和回溯法。 1)列举法 列举法的基本思想是,根据提出的问题,列举所有的情况,并用问题中给定的条件检验哪些是需要的,哪些是不需要的。因此,列举法常用于解决“是否存在”或“有多少可能”等类型的问题,例如求解不定方程的问题。,2)归纳法 归纳法的基本思想是,通过列举少量的特殊情况,经过分析,最后找出一般的关系。,3)递推 所谓递推,是指从已知的初始条件出发,逐次推出所要求的各中间结果和最后结果。其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简。
5、而确定。,4)递归,人们在解决一些复杂问题时,为了降低问题的复杂程度,一般总是将问题逐层分解,最后归结为一些最简单的问题。这种将问题逐层分解的过程,实际上并没有对问题进行求解。但是当解决了分解到最后的那些最简单的问题后,再沿着原来分解的逆过程逐步进行综合,这就是递归的基本思想。 找伪币:假设16枚金币中有一枚是伪造的,真假金币的区别仅是重量不同,利用一个没有砝码的天平作工具,如何快速找出这枚伪造的金币?,)减半递推技术 所谓“减半”,是指将问题的规模减半,而问题的性质不变;这里所谓“递推”,是指重复“减半”的过程。 猜数游戏,)回溯法 回溯法的基本思想是,通过对问题的分析,找出一个解决问题的线。
6、索,然后沿着这个线索逐步试探,对于每一步的试探,若试探成功,就得到问题的解;若试探失败,就逐步回退,换别的路线再进行试探。,1.2 算法复杂度及算法的描述方式 1.算法复杂度 算法复杂度主要包括算法的时间复杂度和算法的空间复杂度。,1)算法的时间复杂度* 所谓算法的时间复杂度,是指执行算法所需要的计算工作量。 算法的工作量,一般用算法所执行的基本运算次数来度量,而算法所执行的基本运算次数是问题规模的函数,即 算法的工作量T(n) 其中,n是问题的规模。例如,两个n阶矩阵相乘,所需要的基本运算(即两个实数的乘法)次数是n的函数T(n)。算法如下:,for(i=0;in;i+) /*执行n+1次*。
7、/ for(j=0;jn;j+)/*执行n(n+1)次*/ cij=0; /*执行n2 次*/ for(k=0;kn;k+)/*执行n2(n+1)次*/ cij=cij+aik*bkj; /*执行n3次*/ 一条语句在算法中被重复执行的次数,称为该语句的频度。 这里,T(n)=2n3 + 3 n2 + 2n +1是n的函数,显然,T(n)/n3 2 (当n 时)。 由高等数学中无穷大的比较的知识知,T(n)与n3 的量级(数量级)相同,即时间复杂度T(n)的量级为O(n3),记为T(n)=O(n3)。 在具体分析时,可做如下处理: 若语句很少执行且与规模n无关,则可忽略不计; 若所有语句都与规。
8、模n无关,则即使有上千条语句,其执行时间也不过是一个较大的常数,故时间复杂度的量级也只是O(n0)=O(1);,一般可只考虑与程序规模有关的频度最大的语句,如循环语句的循环体,多重循环的内循环等。,常见时间复杂度的量级有:常数阶O(1)、线性阶O(n)、平方阶O(n2)、指数阶O(2n )、对数阶O(log2n)、线性对数阶O(nlog2n)。通常认为,具有指数阶量级的算法是实际不可计算的,而量级低于平方阶的算法是高效率的。 今后若无特别说明,就将算法时间复杂度的量级,看作算法的时间复杂度。即某算法的时间复杂度是指该算法时间复杂度的量级。,例1-1 说明下列各个程序段的时间复杂度。 /*交换a。
9、和b的内容*/ t=a; a=b; b=t; /*求n以内所有2的幂次数的和,即 1+21+22+2k,2kn */ sum=0; for(i=1;i=n;i*=2) sum+=i; 说明:在程序段中,三条语句的执行次数均为1,与规模n无关,故可知其时间复杂度为O(1)。,在程序段中,执行次数最多的语句是循环体sum+=i,它执行的次数未知,显然不是n次,若设为k次,由于2kn,所以有klog2n故时间复杂度为O(log2n)。,在具体分析一个算法的工作量时,还会存在这样的问题:对于一个固定的规模,算法所执行的基本运算次数,还可能与特定的输入有关,而实际上又不可能将所有可能情况的算法所执行的基。
10、本运算次数都列举出来。例如:在长度为n的一维数组中,采用顺序搜索法查找值为x的元素,在这个问题的算法中,其基本运算(即比较)的次数与具体的被查找(输入)值x有关。考虑到这种情况,通常采用平均性态和最坏情况复杂性两种方式,来确定一个算法的工作量。,平均性态 所谓平均性态,是指在规模为n时,用各种特定输入下的基本运算次数的加权平均值来度量算法的工作量。 设x是所有可能输入中的某个特定输入,p(x)是x出现的概率(即输入为x的概率),,t(x)是算法在输入为x时所执行的基本运算次数,则算法的平均性态定义为: , xDn , Dn表示当规模为 n时,算法执行时所有可能输入的集合。, 最坏情况复杂性 所。
11、谓最坏情况复杂性,是指在规模为n时,算法所执行的基本运算的最大次数,定义为: , xDn 显然W(n)的计算要比A(n)的计算方便得多。,2)算法的空间复杂度 一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。,2.算法的描述方式 任何算法都必须用某种方法描述出来,其中常用的就是语言描述。根据描述语言的不同,算法分三类: 1)程序设计语言算法。采用计算机程序设计语言描述,可直接在计算机上运行,从而使给定问题在有限时间内被机械的求解。,2)伪语言算法。采用伪程序设计语言描述,不能直接在计算机上运行。伪语言介于程序设计语言和自然语言之间,它忽略程序设计语言中一些严格的语法规则和细节描述,因此伪语言描述可突出算法设计的主要方面而不是语法细节。,3)非形式算法。采用自然语言,同时还可使用程序设计语言或伪程序设计语言(如流程控制语句while、for、if等)描述。 算法除了用语言描述外,实际上还有一种图形描述方法,如流程图、N-S图等。,不管算法用什么方法描述,它最终都要转换为程序才能在计算机上运行。容易看出上述几种描述方法的可读性依次增强,但可读性越强,离最终程序的距离越远。本书采用C语言作为描述工具。