1、数据结构与算法,主讲人:张雷,运城学院公共计算机教学部 2012年2月,一、算法,(1)算法的基本概念 算法是指解决问题方案的准确而完整的描述 (2)算法的基本特征:有穷性;确定性;可行性;0个或多个输入;1个或多个输出。 (3)算法复杂度主要包括时间复杂度和空间复杂度。 所谓时间复杂度一般是用算法在执行过程中所需基本运算的执行次数来度量的。常见的时间复杂度有:线性级O(n),平方级O(n2),对数级O(log2 n)和指数级O(2n)等。 所谓空间复杂度是指执行算法所需要的存储空间的大小。,二、数据结构,(1)利用计算机进行数据处理是计算机应用的一个重要领域。在进行数据处理时,实际需要处理的
2、数据元素一般较多,而这些大量的数据元素都需要存放在计算机中,因此,大量的数据元素在计算机中如何组织,以便提高数据处理的效率,并且节省计算机的存储空间,这是进行数据处理的关键问题。,(2)数据结构作为计算机的一门学科,主要研究和讨论以下三个方面的问题: 数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; 在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构; 对各种数据结构进行的运算,包括插入、删除、查找、排序等。数据的物理结构是指数据在计算机内的实际存储形式,三、线性表,(1)线性表的基本概念 线性表是由n(n=0)个数据元素组成的一个有限序列,表中的每一个数据元素,
3、除了第一个外,有且只有一个前件,除了最后一个外,有且仅有一个后件。即线性表或是一个空表,或可表示为:(a1,a2,ai,an)其中ai是性质相同的数据元素,也称为线性表中的一个结点。 线性表的长度,即表中的元素个数n,当n=0时称为空表。,(2)线性表的顺序存储结构,线性表的顺序存储结构的基本特点: 线性表中所有元素所占的存储空间是连续的; 线性表中每个元素在存储空间中是按逻辑顺序存放的。 线性表的随机存取地址计算公式为:ADD(ai)=ADD(a1)+(i-1)*k 这里ADD(ai)是第i元素的地址,k是每个元素占用空间字节数。,(3)线性表的插入运算,在长度为n的线性表(a1,a2,ai
4、,an)的第i 元素ai之前插入一个新元素x后得到的长度为n+1的线性表为(a1,a2,x,ai,an)。 实现方法:要在第i元素之前插入一个新元素x,首先要从最后一个(即第n 个)元素开始,直到第i 元素之间的n-i+1个元素依次向后移动一个位置,移动结束后,在第i 位置写入新元素x。插入结束后,表长度就增加了1。,(4)线性表的删除运算,在长度为n的线性表(a1,a2,ai,an)中删除第i 元素ai后,变为长度为n-1的线性表(a1,a2, ai-1, ai+1,an)。 实现方法:要删除第i (1=i.n)元素,首先要从第i+1元素开始,直到最后一个(即第n个)元素之间的n-i个元素依
5、次向前移动一个位置。删除结束后,表长度减1。,四、栈,(1)栈的概念 栈是限定只能在表的一端进行插入和删除的线性表。它按照“后进先出”(LIFO)的原则组织数据。表中允许插入和删除的一端叫做栈顶,表中的固定端叫做栈底。通常用指针top指示栈顶的位置,用指针buttom指向栈底。,(2)栈的基本运算 入栈:先判断,若栈满不能入栈,发生“上溢”错误;不满时将新元素插入到栈顶位置后,修改栈顶指针top+。 出栈:先判空,若栈空不能出栈,发生“下溢”错误;非空时修改栈顶指针top-,将栈顶元素赋给一个指定的变量。,五、队列,(1)队列的概念 队列是限定只能在表的一端进行插入,在表的另一端进行删除的线性
6、表。它按照“先进先出”(FIFO)的原则组织数据。表中允许插入的一端叫做队尾,允许删除的一端叫做队头。 队尾指针rear指向队尾元素的位置,队头指针front指向队头元素的前一位置。,在实际应用中,队列的顺序存储结构一般采用循环队列的形式。所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的一个环状空间。当存储空间的最后一个位置已被使用而再要进行入队运算时,只要存储空间的第一个位置空闲,便可将元素加入到第一个位置。,在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置,因此,从排头指针front指向的后一个位置直到队尾指针re
7、ar指向的位置之间所有的元素均为队列中的元素。,在循环队列中,当front=rear时,不能确定是队列满还是队列空,在实际使用时,通常需增加一个标志s,s的定义为: S=0 表示队列空 S=1 表示队列非空,(2)队列的基本运算,入队:先判满,若队列满则不能入队,发生“上溢”错误; 出队:先判空,若队列空则不能出队,发生“下溢”错误; 求队列长度:即求队列中元素的个数,(rear-front+m) mod m。,六、线性链表,线性表的顺序存储方式有结构简单、可以随机存取等优点,但也存在两大缺点:插入或删除操作时,需要移动大量元素,效率低;对于长度可变的线性表,要预先分配(静态分配)足够的空间,
8、这是很困难的。分配太大可能使部分空间长期闲置不用,分配太小会造成表的容量难以扩充。为了克服以上缺点,可以采用链式存储方式,实现动态分配。线性表的链式存储称为线性链表。线性链表中各个元素(结点)的存储空间可以连续也可以不连续,根据表的使用情况可以随时申请和撤消元素占用空间。,表中的每个元素除了存储自身信息外,增设一个指示后继元素地址的指针。 由于每个结点都记下了后继结点的地址(最后一个结点的指针为空指针),整个表就构成了一个链。为了找到这个链表,应设一个头指针(head)指向表头结点。要对链表进行操作,一般总要从头指针出发,所以链式结构是顺序存取。,七、树与二叉树,树型结构是一种简单的非线性结构
9、,(1)树的基本术语: 在树结构中,每一个结点只有一个前件,称为父结点; 没有前件的结点只有一个,称为树的根结点; 每一个结点可以有多个后件,它们都称为该结点的子结点; 没有后件的结点称为叶子结点; 在树结构中,一个结点所拥有的后件个数称为该结点的度。 在树中,所有结点中的最大的度称为树的度。 根结点在第1层,树的最大的层次称为树的深度。,(2)二叉树及其特点,二叉树的特点:非空二叉树只有一个根结点,每一个结点最多有两棵子树(度只能是0、1、2)且严格区分是左子树还是右子树(即二叉树是有序树)。,(3)二叉树的五种基本形态,空二叉树只有一个根结点右子树为空左子树为空左、右子树均非空。,(4)二
10、叉树的基本性质,在二叉树的第i层上,最多有2i-1(i=1)个结点。 深度为k的二叉树中结点总数最多为2k-1。 对任意的一棵二叉树,度为0的结点(即叶结点)数n0总比度为2的结点数n2多1个,即n0=n2+1。,(5)满二叉树: 深度为k的二叉树共有2k-1个结点(即性质2中允许的最大值)。,(6)完全二叉树: 除最后一层外,每一层上的结点数均达到最大值,在最后一层上只缺少右边的若干结点。 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。 具有n个结点的完全二叉树的深度为log2 n+1。(这里的 表示取整),(7)二叉树的遍历,前序遍历(DLR):先访问根结点,再前序遍历左子树,最后
11、前序遍历右子树。 中序遍历(LDR):先中序遍历左子树,再访问根结点,最后中序遍历右子树。 后序遍历(LRD):先后序遍历左子树,再后序遍历右子树,最后访问根结点。,八、查找,查找是根据给定的关键字值,在表中确定一个其关键字等于给定值的记录的过程。 (1)顺序查找 查找方法:从表头到表尾逐个进行比较,若某个记录的关键字值与给定值相等,则查找成功,否则继续比较表中下一个记录,直到整个表都遍历完。,(2)折半查找(二分法查找) 查找方法:每次把待查值和查找表中间位置的记录的关键字进行比较,若相等则查找成功;不相等时根据大于或小于关系确定在后半区间或在前半区间继续折半查找。 (3)对于长度为n的有序
12、线性表,在最坏情况下,折半查找只需要比较log2n次,而顺序查找需要比较n次。,九、排序,(1)插入类排序 简单插入排序 基本思想是:将待排序表看做是左、右两部分,其中左边是有序区,右边是无序区,整个排序过程就是将右边无序区中的元素逐个插入到左边的有序区中,以构成新的有序区。,希尔排序 基本思想是:将待排序列分为若干组,在每组内进行直接插入排序,以使整个序列基本有序,然后现对整个序列进行直接插入排序。 关键在于如何分组,常用办法是第一轮取步长为初始长度n的一半,即间隔为n/2的元素为一组,以后每轮的步长为上次的一半(缩小增量法)。,(2)交换类排序,冒泡排序(简单交换排序) 基本思想是:从表的
13、一端开始,逐个比较相邻的两个元素的关键字值,发现倒序就交换。一轮比较的结果是关键字值最大的元素排到表尾,关键字值小的元素前移,就像在水面上的重物下沉、轻物上浮一样,故称之“冒泡”排序。,快速排序 基本思想是:选定一个元素作为中间元素,然后将表中所有元素与该元素进行比较,小者调到其前面,大者调到其后面,这样中间元素在表中的位置在两部分之间作为分界点,完成一轮次的排序,再对两个子表进行相同的划分和排序。具体实现时,一般用第一个元素作为中间元素,在表的两端进行比较,一轮完成时确定了中间元素的最终位置,并划分开两个子表,左边子表中任一元素都不大于右边子表中任一元素。,(3)选择类排序,简单选择排序 基
14、本思想是:第一轮在待排序列中选出关键字值最小元素与第一个元素交换,第i轮在后(in)个元素的子序列中选出最小元素与第i元素交换,每轮选择一个小者放在最终位置上。 堆排序,(4)几种排序算法的比较,典型试题练习 (历年二级等考真题),1、数据结构中,与计算机无关的是数据的 存储结构物理结构逻辑结构物理和存储结构 数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。它包括数据元素的表示和关系的表示。 2、数据结构作为计算机的一门学科,主要研究数据的逻辑结构、对各种数据结构进行的运算,以及 数据的存储结构计算方法数据映象逻辑存储3、一个算法通常由两种基本要素组成:一是对数据对象的运算和操作,
15、二是,答案:C,答案:A,答案:算法的控制结构,4、算法的基本特征是可行性、确定性、 和 和拥有足够的情报(输入、输出)5、算法分析的目的是 找出数据结构的合理性 找出算法中输入和输出之间的关系 分析算法的易懂性和可靠性 分析算法的效率以求改进6、在算法正确的前提下,评价一个算法的两个标准是 。 7、算法的工作量大小和实现算法所需的存储单元多少分别称为算法的 。,答案:有穷性,答案:D,答案:时间复杂度和空间复杂度,答案:时间复杂度和空间复杂度,8、算法的空间复杂度是指 算法程序的长度算法程序中的指令条数算法程序所占的存储空间 执行过程中所需要的存储空间9、算法的时间复杂度是指 执行算法程序所
16、需要的时间算法程序的长度 算法执行过程中所需要的基本运算次数 算法程序中的指令条数10、算法的有穷性是指 (08年4月) A)算法程序的运行时间是有限的 B)算法程序所处理的数据量是有限的 C)算法程序的长度是有限的 D)算法只能被有限的用户使用,答案:D,答案:C,答案:A,11、下列叙述中正确的是 A)一个算法的空间复杂度大,则其时间复杂度也必定大 B)一个算法的空间复杂度大,则其时间复杂度必定小 C)一个算法的时间复杂度大,则其空间复杂度必定小 D)上述三种说法都不对12、下列叙述正确的是 A)算法的执行效率与数据的存储结构无关 B)算法的空间复杂度是指算法程序中指令(或语句)的条数 C
17、)算法的有穷性是指算法必须能在执行有限个步骤之后终止 D)以上三种描述都不对,答案:D,答案:C,13、下列叙述中正确的是 07年9月 A)数据的逻辑结构与存储结构必定是一一对应的 B)由于计算机存储空间是向量式的存储结构,因此,数据的存储结构一定是线性结构 C)程序设计语言中的数据一般是顺序存储结构,因此,利用数组只能处理线性结构 D)以上三种说法都不对,答案:D,14、下列叙述中正确的是 2010年3月算法的时间复杂度是指A)算法的执行时间B)算法所处理的数据量C)算法程序中的语句或指令条数D)算法在执行过程中所需要的基本运算次数,答案:D,15. (2011年9月),答案:D,2 线性表
18、,1、线性表(a1,a2,ai,an),下列说法正确的是 每个元素都有一个直接前件和直接后件 线性表中至少要有一个元素 表中诸元素的排列顺序必须是由小到大或由大到小 除第一个元素和最后一个元素外,其余每个元素都有且只有一个直接前件和一个直接后件2、下列叙述正确的是 线性表是线性结构 栈和队列是非线性结构 线性链表是非线性结构 二叉树是线性结构,答案:D,答案:A,3、根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分成 动态结构和静态结构 紧凑结构和非紧凑结构 线性结构和非线性结构 内部结构和外部结构5、线性表的顺序存储结构和线性表的链式存储结构分别是 顺序存取,顺序存取 随机
19、存取,顺序存取 随机存取,随机存取 任意存取,任意存取,答案:C,答案:B,6、长度为的顺序存储线性表中,当在任何位置上插入一个元素概率都相等时,插入一个元素所需移动元素的平均个数为 。7、数据的存储结构是指 数据所占的存储空间量 数据的逻辑结构在计算机中的表示 数据在计算机中的顺序存储方式 存储在外存中的数据 8、数据结构分为逻辑结构与存储结构,线性链表属于 。 9、数据结构分为线性结构和非线性结构,带链的队列属于 。,答案:/2,答案:B,答案:存储结构,答案:线性结构,11、下列叙述正确的是08年9月 A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 B)顺序存储
20、结构只针对线性结构,链式存储结构只针对非线性结构 C)顺序存储结构能存储有序表,链式存储结构不能存储有序表 D)链式存储结构比顺序存储结构节省存储空间,答案:A,12、下列叙述中正确的是() A、一个逻辑数据结构只能有一种存储结构 B、数据的逻辑结构属于线性结构,存储结构属于非线性结构 C、一个逻辑结构可以有多种存储结构,且各种存储结构不影响数据处理的效率 D、一个逻辑结构可以有多种存储结构,且各种存储结构影响数据处理的效率,答案:D,13、,答案:B,答案:n-1,14、,15. (2011年9月),答案:C,16. (2011年9月),答案:n,在长度为n的顺序存储的线性表中插入一个元素,
21、最坏情况下需要移动表中( ) 个元素,3 栈和队列,1、栈和队列的共同特点是 都是先进先出 都是后进先出 只允许在端点处插入和删除元素 没有共同点2、如果进栈序列为e1,e2,e3,e4,则可能的出栈序列是 e3,e1,e4,e2 e2,e4,e3,e1 Ce3,e4,e1,e2 D任意顺序,答案:B,答案:C,3、栈底至栈顶依次存放元素、,在第五个元素入栈前,栈中元素可以出栈,则出栈序列可能是 4、下列数据结构中,按先进后出原则组织数据的是线性链表栈循环链表 顺序表,答案:B,答案:B,6、一些重要的程序设计语言允许过程的递归调用。而实现递归调用中的存储分配通常用栈 堆 数组 链表7、在一个
22、容量为15的循环队列中,若头指针front=6,尾指针rear=9,则该循环队列中共有 个元素。求队列长度:即求队列中元素的个数,(rear-front+m) mod m 8、当循环队列非空且队尾指针等于队头指针时,说明循环队列已满,不能进行入队运算。这种情况称为 。,答案:A,答案:3,答案:上溢,9、下列关于队列的叙述中正确的是 A)在队列中只能插入数据 B)在队列中只能删除数据 C)队列是先进先出的线性表 D)队列是先进后出的线性表11、一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺序是 08年9月 A)12345ABCDE
23、B)EDCBA54321 C)ABCDE12345 D)54321EDCBA,答案:C,答案:B,12、下列叙述中正确的是08年9月 A)循环队列有队头和队尾两个指针,因此,循环队列是非线性结构 B)在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况 C)在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况 D)循环队列中元素的个数是由队头和队尾指针共同决定,答案:D,13. 填空题一个队列的初始状态为空。现将元素A,B,C,D,E,F,5,4,3,2,1依次入队,然后再依次退队,则元素退队的顺序为 【 】 。,答案: ABCDEF54321,14、填空题 设某循环队列的容量
24、为50,如果头指针front=45(指向队头元素的前一位置),尾指针rear=10(指向队尾元素),则该循环队列中共有 【 】 个元素。,答案:15,15.,答案:C,答案:1DCBA2345,16.,17. (2011年9月),答案:线性结构,数据结构分为线性结构和非线性结构。带链的栈属于( ),18. (2011年9月),答案:A,4 线性链表,1、用链表表示线性表的优点是 便于随机存取 花费的存储空间比顺序存储少 便于插入和删除操作 数据元素的物理顺序与逻辑顺序相同2、链表不具有的特点是 不必事先估计存储空间 可随机访问任一元素 插入和删除不需要移动元素 所需空间与线性表长度成正比,答案
25、:C,答案:B,4、非空的循环单链表head的尾结点(由p所指向),满足 p-next=NULL B p=NULLC p-next=head D p=head5、循环链表的主要优点是 不再需要头指针了 从表中任一结点出发都能访问到整个链表 在进行插入、删除运算时,能更好地保证链表不断开 已知某个结点的位置后,能够容易的找到它的直接前件,答案:C,答案:B,5 树与二叉树,1、在深度为的满二叉树中,叶子结点的个数为 (08年4月) 2、设树T的度为4,其中度为1,2,3,4的结点个数分别是4,2,1,1,则T中的叶子结点数为 8 7 6 53、具有个结点的二叉树有 种形态 种形态 种形态 种形态
26、,答案:C,答案:A,答案:D,5、设一棵完全二叉树共有700个结点,则在该二叉树中有 个叶子结点6、下列关于完全二叉树的叙述中,错误的是 A 除了最后一层外,每一层上的结点数均达到最大值 B 可能缺少若干个左右叶子结点 C 完全二叉树一般不是满二叉树 D 具有结点的完全二叉树的深度为log2n+1,答案:350,答案:B,设有下列二叉树, 对此二叉树前序遍历的结果为)ZBTYCPXA)ATBZXCYP)ZBTACYXP)ATBZXCPY,答案:B,7、已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是 acbed decba deabc cedba8、已知一棵二
27、叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为 )GEDHFBCA )DGEBHFCA )ABCDEFGH )ACBFEDHG,答案:D,答案:B,10、在下列关于二叉树的叙述中,正确的一项是 A)在二叉树中,任何一个结点的度都是2 B)二叉树的度为2 C)在二叉树中至少有一个结点的度是2 D)一棵二叉树的度可以小于2 11、一棵二叉树中共有70个叶子结点与个度为的结点,则该二叉树中的总结点数为 (07年9月) A)219 B)221 C)229 D)231,答案:D,答案:A,12、填空题 (2010年) 设二叉树如下: 对该二叉树进行后序遍历的结果为
28、 【 】 。,答案:EDBGHFCA,13、填空题(2010年),答案:25,答案:B,14. (2011年9月),15. (2011年3月),答案:D,16. (2011年3月),答案:DEBFCA,一棵二叉树的中序遍历结果为DBEAFC,前序遍历的结果为ABDECF,则后序遍历结果为( ),6 查找,1、在长度为n的有序线性表中进行二分法查找。最坏的情况下,需要的比较次数为 。 08年9月 2、对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为,答案: log2n,答案: n,4、有序线性表能进行二分法查找的前提是该线性表必须是( )存储的,答案: 顺序,7 排序,1、排序是计
29、算机程序设计中的一种重要操作,常见的排序方法有插入排序、 和选择排序等。2、已知数据表A中每个元素距其最终位置不远,为节省时间,应采用的算法是 A、堆排序 B、直接插入排序 C、快速排序 D、直接选择排序 3、最简单的交换排序方法是 A、快速排序 B、选择排序 C、堆排序 D、冒泡排序,答案: 交换排序,答案: B,答案: D,4、冒泡排序算法在最好情况下的元素交换次数为 。5、假设线性表的长度为n,则在最坏情况下,冒泡排序需要的比较次数为07年9月 A、 log2n B、 n2 C、 O(n1.5) D、n(n-1)/27、在下列几种排序方法中,要求内存量最大的是 A、插入排序 B、选择排序 C、快速排序 D、归并排序,答案: 0,答案: D,答案: D,