第1章数据结构与算法Word格式.docx
《第1章数据结构与算法Word格式.docx》由会员分享,可在线阅读,更多相关《第1章数据结构与算法Word格式.docx(37页珍藏版)》请在冰豆网上搜索。
(3)递推
(4)递归
递归分为直接递归与间接递归两种。
如果一个算法P显式地调用自己则称为直接递归。
如果算法P调用另一个算法Q,而算法Q又调用算法P,则称为间接递归调用。
(5)减半递推技术
(6)回溯法
1.1.2算法的复杂度
算法的复杂度主要包括时间复杂度和空间复杂度。
1、算法的时间复杂度
所谓算法的时间复杂度,是指执行算法所需要的计算工作量。
用基本运算的次数来度量算法工作量
1.算法的时间复杂度是指(c)
A)执行算法程序所需要的时间
B)算法程序的长度
C)算法执行过程中所需要的基本运算次数
D)算法程序中的指令条数
103_2)算法的时间复杂度是指
a)算法的执行时间
b)算法所处理的数据量
c)算法程序中的语句或指令条数
d)算法在执行过程中所需要的基本运算次数
d
算法所执行的基本运算次数还与问题的规模有关
算法的工作量=f(n)其中n是问题的规模
对于一个固定的规模,算法所执行的基本运算次数还可能与特定的输入有关。
在同一个问题规模下,如果算法执行所需的基本运算次数取决于某一特定输入时,可以用以下两种方法来分析算法的工作量。
(l)平均性态(AverageBehavior)
(2)最坏情况复杂性(Worst-CaseComplexity)
W(n)的计算要比A(n)的计算方便得多。
由于W(n)实际上是给出了算法工作量的一个上界,因此,它比A(n)更具有实用价值。
2、算法的空间复杂度
一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。
2算法的空间复杂度是指(d)
A)算法程序的长度
B)算法程序中的指令条数
C)算法程序所占的存储空间
D)算法执行过程中所需要的存储空间
69_7)下列叙述中正确的是
A)一个算法的空间复杂度大,则其时间复杂度也必定大
B)一个算法的空间复杂度大,则其时间复杂度必定小
C)一个算法的时间复杂度大,则其空间复杂度必定小
D)上述三种说法都不对
69_1算法复杂度主要包括时间复杂度和【2】复杂度。
99_4.算法的空间复杂度是指(
)。
A.算法在执行过程中所需要的计算机存储空间
B.算法所处理的数据量
C.算法程序中的语句或指令条数
D.算法在执行过程中所需要的临时工作单元数
答案A
解析:
算法的空间复杂度是指执行算法所需要的内存空间,包括算法程序所占空间,输入的初始数据所占空间和执行过程中所需要的额外空间.
1.2数据结构的基本概念
数据结构作为计算机的一门学科,主要研究和讨论以下三个方面的问题:
①数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构。
②在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构。
③对各种数据结构进行的运算。
(操作后应保持原有结构不被破坏)
1.2.1什么是数据结构
35
16
78
85
43
29
33
21
54
46
简单地说,数据结构是指相互有关联的数据元素的集合。
数据元素具有广泛的含义。
一般来说,现实世界中客观存在的一切个体都可以是数据元素。
数据元素一般具有某种共同特征。
在数据处理领域中,通常把数据元素之间这种固有的关系简单地用前后件关系(或直接前驱与直接后继关系)来描述。
1.数据的逻辑结构
一个数据结构应包含以下两方面的信息:
①表示数据元素的信息;
②表示各数据元素之间的前后件关系。
在以上所述的数据结构中,其中数据元素之间的前后件关系是指它们的逻辑关系,而与它们在计算机中的存储位置无关。
因此,上面所述的数据结构实际上是数据的逻辑结构。
2.数据的存储结构
数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称数据的物理结构)。
54_1数据的存储结构是指
A)存储在外存中的数据
B)数据所占的存储空间量
C)数据在计算机中的顺序存储方式
D)数据的逻辑结构在计算机中的表示
4数据的存储结构是指(b)
A)数据所占的存储空间量
B)数据的逻辑结构在计算机中的表示
C)数据在计算机中的顺序存储方式
D)存储在外存中的数据
红60_20数据结构中,与所用的计算机无关的是数据的
A存储结构B物理结构C逻辑结构D物理和存储结构
62_14数据结构包括数据的结构和数据的存储结构
由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后件关系的信息。
一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接。
索引等存储结构。
而采用不同的存储结构,其数据处理的效率是不同的。
因此,在进行数据处理时,选择合适的存储结构是很重要的。
4.2.79_5下列叙述中正确的是
A程序执行的效率与数据的存储结构密切相关
B程序的执行效率只取决于程序的控制结构
C程序执行的效率只取决于所处理的数据量
D以上三种说法都不对
4.3.79_6下列叙述中正确的是
A数据的逻辑结构与存储结构必定是一一对应的
B由于计算机存储空间是向量式的存储结构,因此,数据的存储结构一定是线性结构
C程序设计语言中的数组一般是顺序存储结构,因此,利用数组只能处理线性结构
红57_2下面的叙述正确的是
A算法的执行效率与数据的存储结构无关
B算法的空间复杂度是指算法程序中指令(或语句)的条数
C算法的有穷性是指算法必须能在执行有限个步骤之后终止
D以上三种描述都不对
59_4下列叙述中正确的是
A)一个逻辑数据结构只能有一种存储结构
B)数据的逻辑结构属于线性结构,存储结构属于非线性结构
C)一个逻辑数据结构可以有多种存储结构,且各种存储结构不影响数据处理的效率
D)一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率
1.2.2数据结构的图形表示
在数据结构中,没有前件的结点称为根结点;
没有后件的结点称为终端结点(也称为叶子结点)。
数据结构中除了根结点与终端结点外的其他结点一般称为内部结点。
在对数据结构的处理过程中,不仅数据结构中的结点(即数据元素)个数在动态地变化,而且,各数据元素之间的关系也有可能在动态地变化。
1.2.3线性结构与非线性结构
如果一个非空的数据结构满足下列两个条件:
①有且只有一个根结点;
②每一个结点最多有一个前件,也最多有一个后件。
则称该数据结构为线性结构。
线性结构又称线性表。
在一个线性结构中插入或删除任何一个结点后还应是线性结构。
如果一个数据结构不是线性结构,则称之为非线性结构。
一个空的数据结构究竟是属于线性结构还是属于非线性结构,这要根据具体情况来确定。
如果对该数据结构的运算是按线性结构的规则来处理的,则属于线性结构;
否则属于非线性结构。
1.3线性表及其顺序存储结构
由若干数据项组成的数据元素称为记录(record)。
可以表示为
(a1,a2,…,ai,…,an)
其中(ai=1,2,…,n)是属于数据对象的元素,通常也称其为线性表中的一个结点。
线性表中结点的个数n称为线性表的长度。
当n=0时,称为空表。
1.3.2线性表的顺序存储结构
线性表的顺序存储结构具有以下两个基本特点:
①线性表中所有元素所占的存储空间是连续的;
②线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
红62_22
顺序存储方法是把相邻的结点存储在物理位置的存储单元中.相邻
优点:
便于查找元素
缺点:
做插入删除操作时需要移动元素
1.3.3顺序表的插入运算
在一般情况下,要在第i(1≤i≤n)个元素之前插入一个新元素时,首先要从最后一个(即第n个)元素开始,直到第i个元素之间共n十l个元素依次向后移动一个位置,移动结束后,第i个位置就被空出,然后将新元素插入到第i项。
插入结束后,线性表的长度就增加了1。
18
56
63
24
31
47
87
18
14
l.3.4顺序表的删除运算
在一般情况下,要删除第i(1≤i≤n)个元素时,则要从第i+1个元素开始,直到第n个元素之间共n-i个元素依次向前移动一个位置。
删除结束后,线性表的长度就减小了1。
6.1.89_4)下列叙述中正确的是()。
A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的
B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构
C)顺序存储结构能存储有序表,链式存储结构不能存储有序表
D)链式存储结构比顺序存储结构节省存储空间
109_1下列叙述中正确的是
A)线性表的链式存储结构与顺序存储结构所需要的存储空间是相同的
B)线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构
C)线性表的链式存储结构所需要的存储空间一般要少于顺序存储结构
D)上述三种说法都不对
B
1.4栈和队列
1.4.1栈及其基本运算
1.什么是栈
栈是一种特殊的线性表。
其插入与删除运算都只在线性表的一端进行。
栈(stack)是限定在一端进行插入与删除的线性表。
在栈中,允许插入与删除的一端称为栈顶,而不允许插入与删除的另一端称为栈底。
栈顶元素总是最后被插入的元素,从而也是最先能被删除的元素:
栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。
即栈是按照"
先进后出"
(FILO--FirstInLastOut)或"
后进先出"
(LIFO-LastInFirstOut)的原则组织数据的,因此,栈也被称为"
表或"
表。
6下列关于栈的叙述中正确的是(d)
A)在栈中只能插入数据
B)在栈中只能删除数据
C)栈是先进先出的线性表
D)栈是先进后出的线性表
59_3下列关于栈的描述正确的是
A)在栈中只能插入元素而不能删除元素
B)在栈中只能删除元素而不能插入元素
C)栈是特殊的线性表,只能在一端插入或删除元素
D)栈是特殊的线性表,只能在一端插入元素,而在另一端删除元素
样1下列关于栈的叙述正确的是
A栈是非线性结构
B栈是一种树状结构
C栈具有先进先出的特征
D栈具有后进先出的特征
64_4)按照“后进先出”原则组织数据的数据结构是
A)队列
B)栈
C)双向链表
D)二叉树
99_2.下列数据结构中,能够按照”先进后出”原则存取数据的是(
A.
循环队列B.栈
C.队列D.二叉树
答案B
栈是先进后出或后进先出的线性表
9.2.69_4)按“先进后出”原则组织数据的数据结构是_______。
84_7)下列关于栈的叙述正确的是
A栈按“先进先出”组织数据
B栈按“先进后出”组织数据
C只能在栈底插入数据
D不能删除数据
通常用指针top来指示栈顶的位置,用指针bottom指向栈底。
往栈中插入一个元素称为入栈运算,从栈中删除一个元素(即删除栈顶元素)称为退栈运算。
栈的基本运算有三种:
入栈、退栈与读栈顶元素。
(l)入栈运算
入栈运算是指在栈顶位置插入一个新元素。
这个运算有两个基本操作:
首先将栈顶指针进一(即top加1),然后将新元素插入到栈顶指针指向的位置。
当栈顶指针已经指向存储空间的最后一个位置时,说明栈空间己满,不可能再进行入栈操作。
这种情况称为栈"
上溢"
错误。
10
9
8
7
top6
F
5
E
4
D
3
C
2
botton1
A
top7
X
6
top8
Y
(2)退栈运算
退栈运算是指取出栈顶元素并赋给一个指定的变量。
首先将栈顶元素(栈顶指针指向的元素)赋给一个指定的变量,然后将栈顶指针退一(即top减1)。
当栈顶指针为0时,说明栈空,不可能进行退栈操作。
下溢"
(3)读栈顶元素
读栈顶元素是指将栈顶元素赋给一个指定的变量。
必须注意,这个运算个删除栈顶元素,只是将它的值赋给一个变量,因此,在这个运算中,栈顶指针不会改变。
当栈顶指针为0时,说明栈空,读不到栈顶元素。
109_2)下列叙述中正确的是
A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化
B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化
C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化
D)上述三种说法都不对
8.1.89_1)一个栈的初始状态为空。
现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺序是()。
A)12345ABCDEB)EDCBA54321
C)ABCDE12345D)54321EDCBA
109_1)一个栈的初始状态为空。
首先将元素5,4,3,2,1依次入栈,然后退栈一次,再将元素A,B,C,D依次入栈,之后将所有元素全部退栈,则所有元素退栈(包括中间退栈的元素)的顺序为【1】。
1DCBA2345
红60_21栈底至栈顶依次存放元素ABCD,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是
AabcedBdbceaCcdabeDdcbea
93_2)支持子程序调用的数据结构是
A)栈
B)树
C)队列
D)二叉树
93_1)假如用一个长度为50的数组(数组元素的下标从0到49)作为栈的存储空间,栈底指针bottom指向栈底元素,栈顶指针top指向栈顶元素,如bottom=49,top=30(数组下标),则栈中具有__【1】个元素。
20
1.4.2队列及其基本运算
1.什么是队列
队列(queue)是指允许在一端进行插入、而在另一端进行删除的线性表。
允许插入的一端称为队尾,通常用一个称为尾指针(rear)的指针指向队尾元素,即尾指针总是指向最后被插入的元素;
允许删除的一端称为排头(也称为队头),通常也用一个排头指针(front)指向排头元素的前一个位置。
显然,在队列这种数据结构中,最先插入的元素将最先能够被删除,反之,最后插入的元素将最后才能被删除。
因此,队列又称为"
先进先出"
(FIFO——FirstInFirstOut)或"
后进后出"
(LILO——LastInLastOut)的线性表,它体现了"
先来先服务"
的原则。
Frontrear
5下列关于队列的叙述中正确的是(c)
A)在队列中只能插入数据
B)在队列中只能删除数据
C)队列是先进先出的线性表
D)队列是先进后出的线性表
9.4.74_5)下列对队列的叙述正确的是
A)队列属于非线性表
B)队列按“先进后出”原则组织数据
C)队列在队尾删除数据
D)队列按“先进先出”原则组织数据
往队列的队尾插入一个元素称为入队运算,从队列的排头删除一个元素称为退队运算。
在队列的末尾插入一个元素(入队运算)只涉及队尾指针rear的变化,而要删除队列中的排头元素(退队运算)只涉及排头指针front的变化。
103_1)一个队列的初始状态为空。
现将元素a,b,c,d,e,f,5,4,3,2,1依次入队,然后再依次退队,则元素退队的顺序为【1】。
a,b,c,d,e,f,5,4,3,2,1
62_17栈和队列的共同点是
A都是先进后出
B都是先进先出
C只允许在端点处插入和删除元素
D没有共同点
2.循环队列及其运算
所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。
9.2.89_2)下列叙述中正确的是()。
A)循环队列有队头和队尾两个指针,因此,循环队列是非线性结构
B)在循环队列中,只需要队头指针就能反映队的中元素的动态变化情况
C)在循环队列中,只需要队尾指针就能反映队的中元素的动态变化情况
D)循环队列中元素的个数是由队头指针和队尾指针共同决定
99_3.对于循环队列,下列叙述中正确的是(
A.队头指针是固定不变的
B.队头指针一定大于队尾指针
C.队头指针一定小于队尾指针
D.队头指针可以大于队尾指针,也可以小于队尾指针
答案D
如果队头指针大于队尾指针说明队列已经循环存放数据了,如果队头指针小于队尾指针说明没有进行循环存放
59_5数据结构分为逻辑结构和存储结构,循环队列属于【5】结构。
9.1.79_三线性表的存储结构主要分为顺序存储结构和链式存储结构.队列是一种特殊的线性表,循环队列是队列的顺序存储结构
93_1)下面叙述中正确的是
A)栈是“先进先出”的线性表
B)队列是“先进后出”的线性表
C)循环队列是非线性结构
D)有序线性表既可以采用顺序存储结构,也可以采用链式存储结构
5.在一个容量为15的循环队列中,若头指针front=6,尾指针rear=9,则该循环队列中共有3个元素。
84_3)设某循环队列的容量为50,头指针front=5(指向队头元素的前一位置),尾指针rear=29(指向队尾元素),则该循环队列中共有___[3]____个元素。
103_2)设某循环队列的容量为50,如果头指针front=45(指向队头元素的前一位置),尾指针rear=10(指向队尾元素),则该循环队列中共有【2】个元素。
15
循环队列主要有两种基本运算:
入队运算与退队运算。
每进行一次入队运算,队尾指针就进一。
当队尾指针rear=m+l时,则置rear=l。
每进行一次退队运算,排头指针就进一。
当排头指针front=m+l时,则置front=l。
在循环队列中,当front=rear时,不能确定是队列满还是队列空。
在实际使用循环队列时,为了能区分队列满还是队列空,通常还需增加一个标志S,S值的定义如下:
由此可以得出队列空与队列满的条件如下:
队列空的条件为S=0;
队列满的条件为s=1且front=rear。
(1)入队运算
入队运算是指在循环队列的队尾加入一个新元素。
首先将队尾指针进一(即rear=rear+l),并当rear=m+l时置rear=l;
然后将新元素插入到队尾指针指向的位置。
当循环队列非空(S=l)日队尾指针等于排头指针时,说明循环队列已满,不能进行入队运算,这种情况称为"
。
(2)退队运算
退队运算是指在循环队列的排头位置退出一个元素并赋给指定的变量。
首先将排头指针进一(即ront=front+l),并当front=m+l时置ontel;
然后将排头指针指向的元素赋给指定的变量。
当循环队列为空(S=0)时,不能进行退队运算,这种情况称为"
1.5线性链表
1.5.1线性链表的基本概念
由于线性表的顺序存储结构存在以上这些缺点,因此,对于大的线性表,特别是元素变动频繁的大线性表不宜采用顺序存储结构,而是采用下面要介绍的链式存储结构。
假设数据结构中的每一个数据结点对应于一个存储单元,这种存储单元称为存储结点,简称结点。
在链式存储方式中,要求每个结点由两部分组成:
一部分用于存放数据元素值,称为数据域;
另一部分用于存放指针,称为指针域。
其中指针用于指向该结点的前一个或后一个结点(即前件或后件)。
在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
链式存储方式既可用于表示线性结构。
也可用于表示非线性结构。
在用链式结构表示较复杂的非线性结构时,其指针域的个数要多一些。
l.线性链表
线性表的链式存储结构称为线性链表。
在线性链表中,用一个专门的指针HEAD指向线性链表中第一个数据元素的结点(即存放线性表中第一个数据元素的存储结点的序号)。
线性表中最后一个元素没有后件,因此,线性链表中最后一个结点的指针域为空(用NULL或0表示),表示链表终止。
存储序号数据域指针域
V(i)
Next(i)
i
对于线性链表,可以从头指针开始,沿各结点的指针扫描到链表中的所有结点。
存储序号数据域指针域
1
A2
A1
A4
A3