第一章 数据结构与算法
1.算法
算法:是指解题方案的准确而完整的描述。
算法不等于程序,也不等于计算方法,程序的编制不可能优于算法的设计。 算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。特征包括: (1)可行性;
(2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,
不允许有多义性;
(3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终
止,包括合理的执行时间的含义; (4)拥有足够的情报。
算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。 算法的三种基本控制结构:顺序结构、选择结构、循环结构。 算法复杂度包括:算法时间复杂度和算法空间复杂度。 算法时间复杂度是指执行算法所需要的计算工作量。 算法空间复杂度是指执行这个算法所需要的内存空间。
案例0.算法的有穷性是指 (D) A.算法只能被有限的用户使用 B.算法程序的长度是有限的
C.算法程序所处理的数据量是有限的 D.算法程序的运行时间是有限的
案例1.下列叙述中正确的是 (BG) A.一个算法的时间复杂度大,则其空间复杂度必定小 B.算法的时间复杂度与空间复杂度没有直接关系
C.一个算法的空间复杂度大,则其时间复杂度也必定大 D.算法的时间复杂度与空间复杂度一定相关
E.算法的效率只与问题的规模有关,而与数据的存储结构无关 F.数据的逻辑结构与存储结构是一一对应的
G.算法的时间复杂度是指执行算法所需要的计算工作量
2.栈及其基本运算
栈是限定在一端进行插入与删除运算的线性表。
在栈中,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。栈顶元素总是最后被插入的元素,栈底元素总是最先被插入的元素。即栈是按照“先进后出”或“后进先出”的原则组织数据的。 栈的基本运算:
.
1) 插入元素称为入栈运算;2)删除元素称为退栈运算;
案例2.一个栈的初始状态为空。先将元素1,2,3,A,B,C依次入栈,然后再依次出栈,则元素出栈的顺序是_ __ (C,B,A,3,2,1)
3.队列及其基本运算
队列是指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表。尾指针(Rear)指向队尾元素,头指针(front)指向排头元素的前一个位置(队头)。
队列是“先进先出”或“后进后出”的线性表。 队列运算包括:
1)入队运算:从队尾插入一个元素; 2)退队运算:从队头删除一个元素。
案例3.下列与队列结构有关联的是 (A) A.先到先服务的作业调度 B.函数的递归调用 C.数组元素的引用 D.多重循环的执行
4.循环队列及其运算:
所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置,因此,从头指针front指向的后一个位置直到队尾指针rear指向的位置之间,所有的元素均为队列中的元素。
循环队列中元素的个数=rear-front。
案例4.下列叙述中正确的是 (B) A.循环队列有队头和队尾两个指针,因此循环队列是非线性结构 B.循环队列中元素的个数是由队头指针和队尾指针共同决定
C.在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况 D.在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况
案例5.设循环队列的存储空间为Q(1:35),初始状态为front=rear=35.现经过一系列入队与退队运算后, front=15, rear=15,则循环队列中的元素个数为 (A) A.0或35 B.15 C.20 D.16 解析:循环队列中的元素个数的计算方法是:队尾-队头 1.如果大于0,rear-front 即为元素的个数。
2.如果小于0,rear-front+空间容量 即为元素个数。
.
3.如果等于0,元素个数为0或空间容量。
5.二叉树及其基本性质
二叉树是一种非线性结构,它具有以下两个特点: 1)非空二叉树只有一个根结点;
2)每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。
根据二叉树的概念可知,二叉树的度可以为0(叶结点)、1(只有一棵子 树)或2(有2棵子树)。 二叉树考点1:
在任意一棵二叉树中,度数为0的结点(即叶子结点)总比度为2的结点多一个。叶子数(度为0)=度为2结点数+1 二叉树考点2:
二叉树的深度即二叉树的层次数 二叉树考点3:
总结点数=度为2的结点数+度为1的结点数+度为0的结点数(叶子)
案例6.某二叉树共有7个结点,其中叶子结点只有1个,则该二叉树的深度为(假设根结点在第1层) _____ 。 (7)
案例7.一棵二叉树共有25个结点,其中5个是叶子结点,则度为1的结点数为_ ___ 。 (16)_ 解析:叶子结点数=度为2的结点数+1 5 = ? +1
求得度为2的结点数为4
总结点数=度为2的结点数+度为1的结点数+度为0的结点数(叶子) 25 =4 + ? +5
求得度为1的结点数为16
二叉树考点4:二叉树的遍历
二叉树的遍历是指不重复地访问二叉树中的所有结点。
二叉树的遍历可以分为以下三种:
(1)前序遍历:若二叉树为空,则结束返回。否则:首先访问根结点,然后遍历
左子树,最后遍历右子树。
(2)中序遍历:若二叉树为空,则结束返回。否则:首先遍历左子树,然后访问
根结点,最后遍历右子树。
(3)后序遍历:若二叉树为空,则结束返回。否则:首先遍历左子树,然后遍历
右子树,最后访问根结点。
.
案例8. 对下列二叉树
进行前序遍历的结果为__ ___ (ABDYECFXZ)
6.线性表
由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的称为线性表。线性表是由n(n≥0)个数据元素组成的一个有限序列,表中的每一个数据元素,除了第一个外,有且只有一个前件,除了最后一个外,有且只有一个后件。线性表中数据元素的个数称为线性表的长度。线性表可以为空表。
线性表是一种存储结构,它的存储方式:顺序和链式。 线性表的顺序存储结构具有两个基本特点:
(1)线性表中所有元素所占的存储空间是连续的;
(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
由此可以看出,在线性表的顺序存储结构中,其前后件两个元素在存储空间中是紧邻的,且前件元素一定存储在后件元素的前面,可以通过计算机直接确定第i个结点的存储地址。 顺序表的插入、删除运算
线性表的链式存储结构(线性链表)
数据结构中的每一个结点对应于一个存储单元,这种存储单元称为存储结点,简称结点。
结点由两部分组成:
(1)用于存储数据元素值,称为数据域;
(2)用于存放指针,称为指针域,用于指向前一个或后一个结点。
在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
链式存储方式既可用于表示线性结构,也可用于表示非线性结构。 线性结构条件:
(1)有且只有一个根结点;
(2)每一个结点最多有一个前件,也最多有一个后件。
.
非线性结构:不满足线性结构条件的数据结构。
案例9.下列叙述中正确的是 (A) A.循环队列是队列的一种顺序存储结构
B.循环队列是非线性结构 C.循环队列是一种逻辑结构 D.循环队列是队列的一种链式存储结构
解析:常见的线性结构有:队列、栈。非线性结构有:树、二叉树
案例10.下列叙述中正确的是 (CE) A.线性表链式存储结构与顺序存储结构所需要的存储空间是相同的
(不相同)
B.线性表链式存储结构所需要的存储空间一般要少于顺序存储结构
(多于)
C.线性表链式存储结构所需要的存储空间一般要多于顺序存储结构 D.线性表链式存储结构与顺序存储结构的存储空间都是连续的
E.线性表链式存储结构的存储空间可以是连续的,也可以是不连续的
7.排序排序是指将一个无序序列整理成按值非递减顺序排列的有序序列,即是将无序的记录序列调整为有序记录序列的一种操作。 冒泡排序、快速排序、直接插入排序:
假设线性表的长度为n,则在最坏情况下,需要比较的次数为n(n-1)/2 堆排序:
在最坏情况下,需要比较的次数为nlog2n
8.顺序查找和二分查找
顺序查找又称为顺序搜索。顺序查找一般是指在线性表中查找指定的元素 下面两种情况
1.如果线性表为无序表(即表中元素排序是无序的),则不管是顺序存储结构还
是链式存储结构,都只能用顺序查找
2.即使是有序线性表,如果采用链式存储结构,也只能用于顺序查找 二分查找只适用于顺序存储的有序表。在此所说的有序表是指线性表中的元素按值非递减排序(即从小到大,但允许相邻元素值相等)。
当有序线性表为顺序存储时才能采用二分查找,对于长度为n的有序线性表,在最坏情况下,二分查找只需要比较log2n次 ,而顺序查找需要比较n次。
案例11.对长度为n的线性表排序,在最坏情况下,比较次数不是n(n-1)/2的排序方法是 (C) A.快速排序 B.冒泡排序 C.堆排序 D.直接插入排序
.