第一章:数据结构与算法(约占10分)算法I=1 ’给变量I赋值为1S=0 ’给变量S赋值为0Do while I<=100 ’循环结构:当I小于100时循环S=S+I ’对I的值累加求和I=I+1 ’变量I的值每循环一次增加1ENDDO ’循环结构:遇到ENDDO就返回DO处重新循环MSGBOX S ’输出求和变量S的值算法是指解题方案的准确而完整的描述。
算法规定了解决某类问题所需的操作语句以及执行顺序,使其能通过有限的指令语句,在一定时间内解决问题。
算法是一个操作序列、有限长度、目的是解决某类问题。
注意:1、算法不等同于数学上的计算方法:因为很多数学计算公式也许无法在计算机上实现。
2、算法也不等同于程序:因为程序的编制不可能优于算法的设计。
算法的基本特征(算法具有动态性):可行性、确定性、有穷性、拥有足够的情报(指的是有输入和输出)在设计一个算法时,必须要考虑算法的执行过程保证结果的可靠性。
算法的基本元素第一要素:对数据对象的运算和操作算数运算+ - * /逻辑运算NOT AND OR数据传输赋值,输入与输出第二要素:算法的控制结构(决定了算法中各操作的执行顺序)顺序、选择、循环算法设计的基本方法(计算机解题的过程实际上是实施某种算法)列举法(列举所有的解决方案)根据提出的问题,列举所有可能的情况,并用问题中给定的条件检验哪些是需要的哪些是不需要的。
归纳法(特殊->一般)适合于列举量为无限的情况通过列举少量的特殊情况,经过分析,最后找出一般的关系递推法(已知->未知)从已知的初始条件出发,逐次推出所要求的各中间结果和最后结果递归法(逐层分解)将一个复杂问题归结为若干个较简单的问题,然后将这些较简单的内一个问题再归结为更简单的问题。
减半递推法(对问题分而治之)“减半”是指将问题的规模减半,而问题的性质不变。
所谓“递推”是指重复“减半”的过程回溯法复杂应用,找出一个解决问题的线索,然后沿着这个线索逐步多次“探、试”算法的复杂度(一个算法所要付出的代价)算法的复杂度可分为:时间复杂度和空间复杂度算法的复杂度是衡量算法好坏的量度。
1)时间复杂度概念:指执行算法所需要的计算工作量(即算法的运算次数)含义:算法执行过程中所需要的基本运算次数影响计算工作量的主要因素:第一、基本运算次数第二、问题规模下面的方法不能用来度量算法的时间复杂度:1)算法程序的长度或算法程序中语句(指令)条数2)算法程序所执行的语句条数3)算法程序执行的具体时间时间复杂度的具体度量方法:在同一问题规模下,如果算法执行所需的基本运算次数取决于某一特定的输入时,可以用以用以下两种方法来分析的工作量:1)平均性态分析2)最坏情况复杂性分析2)空间复杂度概念:空间复杂度是指执行该算法所需要的存储空间、输入的初始数据所占的存储空间、算法执行过程中的额外空间。
注意:1)如果额外空间量相对于问题规模来说是常数,即额外空间量不随问题规模变化而变化,则称该算法是原地工作的2)为了降低算法的空间复杂度,主要应减少需要处理的数据所占的存储空间以及额外空间,通常采用压缩存储技术。
考题练习1、下列叙述正确的是A)算法就是程序B)算法强调的是利用技巧提高程序的执行效率C)设计算法时只需考虑结果的可靠性D)以上三种说法都不对2、下面叙述正确的是A)算法的执行效率与数据的存储结构无关B)算法的空间复杂度是指算法程序中指令(或语句)的条数C)算法的有穷性是指算法必须能在执行有限个步骤之后终止D)以上三种描述都不对3、下列叙述中正确的是A)一个算法的空间复杂度大,则其时间复杂度也必定大B)一个算法的空间复杂度大,则其时间复杂度必定小C)一个算法的时间复杂度大,则其空间复杂度必定小D)以上说法都不对4)算法的空间复杂度是指A)算法程序中变量的个数B)算法程序中指令的条数C)算法程序中各控制变量所占的额外空间D)算法执行过程中所需的存储空间数据结构目的:提高数据的处理效率(一是提高数据处理的速度二是节省在数据处理过程中所占用的计算机存储空间)基本概念1)数据:在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
2)数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理3)数据结构:是互相之间存在一种或多种特定关系的数据元素的集合。
数据结构的内容:逻辑结构:数据元素之间的逻辑关系,从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
存储(物理)结构:是指数据元素及其关系在计算机内存中的表示,即数据的逻辑结构在计算机存储空间中的存放形式。
注意:对于同一个逻辑结构来说,采用不同的存储结构,其数据处理的效率是不同的。
因此,在数据处理时,选择适合的存储结构很重要。
各数据元素在计算机存储空间中的位置关系与它们的逻辑关系不一定相同。
由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此,为了表示存放各数据元素的本身,而且还需要存放各数据元素之间的前后件关系的信息。
逻辑结构与物理结构的关系1)一种逻辑结构可以用不同的物理结构来实现2)逻辑结构决定了算法的设计3)物理结构决定了算法的实现数据结构的图形表示表示数据结构的常用方法:二元关系表和图形表示例:一年四季的数据结构可以用图形表示为:春->夏->秋->冬1)数据元素:用中间标有元素值的方框来表示,称为数据结点,简称结点。
2)元素之间的前后关系:用一条有向线段从前件结点指向后件结点(注意有时可以省略箭头)在数据结构中,没有前件的结点称为根结点,没有后件的结点称为终结结点(也称为叶子结点),其他的称为内部结点。
数据结构的分类:线性结构与非线性结构根据数据结构中个数据元素之间的前后关系的复杂度,一般将数据结构分成两大类:线性结构和非线性结构。
注意:线性结构与非线性结构是在数据的逻辑结构概念下的一种划分方法,与数据的存储结构无关。
前面说过,一种数据的逻辑结构根据需要可以表示成多种存储结构,但只要数据的逻辑结构是属于线性结构,则该逻辑结构的任意一种存储结构也都术语线性结构。
线性结构的定义如果一个非空的数据结构满足下列两个条件:1有且只有一个根结点(没有前件的结点称为根结点)2)每个结点最多有一个前件,也最多由一个后件。
则称该数据结构为线性结构,线性结构又称线性表3)线性结构的操作在一个线性结构中插入或删除任何一个结点后还应是线性结构线性表1)线性表就是线性结构2)线性表的顺序存储结构也称为顺序表3)在顺序表中,所有元素所占的存储空间是连续的,且各数据元素在存储空间中是按逻辑顺序依次存放的,其前后两个元素在存储空间中是紧邻的,且前件元素一定存储在后件元素的前面。
4)线性表的长度:是指线性表中的结点个数,当n=0时,称为空表。
5)通常定义一个一维数组来表示线性表的顺序存储控件。
用一维数组来存放线性表时,该一维数组的长度不要定义太短,也不要定义太长。
顺序表(线性表的顺序结构)的插入运算:最坏情况下,N个元素的线性表要移动N次,顺序表的删除运算:最坏情况下,N个元素的线性表要移动N-1次。
综上所述:线性表的顺序存储结构对于经常需要变动的大线性表就不合适了,因为插入和删除的效率比较低。
栈栈的定义:栈是一种特殊的线性表,即限定在一端进行插入和删除的线性表栈顶、栈底的定义:在栈中,允许插入和删除的一端称为栈顶,而不允许插入和删除的另一端称为栈底入栈、退栈的定义:往栈中插入一个元素叫入栈运算(压栈),从栈中删除一个元素称为退栈运算。
栈的数据操作原则:先进后出FILO(也叫后进先出)栈具有记忆功能。
注意:1)在顺序存储结构下,栈的插入与删除运算都不需要移动表中的其他数据元素。
2)在栈中,栈顶指针动态反映了栈中元素的变化情况。
栈的存储结构与运算栈的存储结构:在程序设计语言中,与普通线性表一样,用一维数组作为栈S(1:M)的顺序存储结构,其中M为栈的最大容量。
栈的基本运算:入栈、退栈和读栈顶元素。
在顺序结构下的读栈顶元素是指将栈顶元素赋值给一个指定的变量。
(读不是删除,删除一定要先读。
在只读的情况下,原来是多少,读后还是多少。
)读栈顶元素过程中应注意的问题:1)读栈顶怨毒不删除栈顶元素,只是将它的值赋给一个变量。
因此在这个运算中栈顶指针不会改变。
2)当栈顶指针为零时,说明栈为空,读不到栈顶元素。
队列队列的定义:队列也是一种特殊的线性表,即允许在一进行插入,而另一端进行删除的线性表允许插入的一端叫队尾(为指针rear)允许删除的一端叫队头(头指针,front)注意:在尾上插入,头上删除队列的数据操作方法是:先进先出在顺序存储结构下,队列的插入与删除运算都不需要移动表中的其他数据元素在实际应用中,队列的顺序存储结构一般采用循环队列的形式,方法是将队列存储空间的最后一个位置绕到第一个位置,就形成逻辑上的环状空间,供队列循环使用。
确定循环队列中元素个数的方法如下:设循环队列的容量为M,如果rear>front,则循环队列中的元素个数为rear-front;如果rear<front,则循环队列中的元素个数为m+(rear-front)循环队列的运算有两个1)入队运算:是在循环队列的队尾加入一个新元素,也就是rear=12)退队运算:是在循环队列的排头位置退出一个元素并赋给指定的变量,也就是front+1程序设计中用一维数组作为队列的顺序存储空间。
队列的实际应用实例在操作系统中,用队列来组织管理用户程序的排队执行,其原则是:1)初始时该队列为空,2)当有用户程序来到时,将该用户程序加入到队列末尾进行等待3)当计算机系统执行完当前的用户程序后,就从队列头部取出一个用户程序执行。
线性表的顺序存储结构的缺点第一、在插入和删除时需要移动元素(栈和队列除外)第二、上溢错误的出现,即存储空间不便于扩充第三、不便于对存储空间的动态分配线性链表一、链式存储方式对于大的线性表或者变动频繁的线性表不宜用顺序存储,应该用链式存储。
链式存储的结点:由两部分组成,一部分用于存储数据元素值,称为数据域,另一部分用于存放指针,称为指针域。
指针域用来指向该结点的后一个(或前一个)结点。
链式存储的特点(注意与顺序存储方式的区别)1)在链式存储结构中,存储数据结构的存储空间可以是不连续的。
2)各结点的存储顺序与数据元素之间的逻辑关系可以不一致3)链式存储方式可以用于线性结构,也可以用于非线性结构注:线性链表是线性表的链式存储结构;带链的栈是栈的链式存储结构;带链的队列是队列的链式存储结构。
注意:线性链表在插入与删除过程中均不发生数据元素移动的现象,只需改变有关结点的指针即可。
树与二叉树树是一种非线性结构,所有数据元素之间的关系具有明显的层次特性结点的度的定义:子树的个数,即拥有的后件个数称为该结点的度树的度的定义:树中所有结点的度的最大值叶子节点的定义:度为零的结点,即没有后件的结点分支节点的定义:度大于非零的结点度的深度的定义:树中叶子结点所在的最大层次(注意:根结点在第1层)路径的定义:由根到该结点所经分支和结点构成注意:线性结构与树形结构的区别二叉树的定义:是一种特殊的树,非空二叉树只有一个根结点。