算法 + 数据结构=程序
算法通常是决定程序效率的关键,但一切算法最终都要在相应的数据结构上实现。
数据结构是计算机存储、组织数据的方式,是指相互之间存在一种或多种特定关系的数据元素的集合。许多算法的精髓就是在于选择了合适的数据结构作为基础。
选择数据结构的考虑要素:
1、数据结构要适应问题的状态描述。在程序中,要涉及到状态的存储、转换等。选择的数据结构必需先适用于描述状态,并使对状态的各种操作能够明确地定义在数据结构上。
2、数据结构应与所选择的算法相适应。数据结构是为算法服务的,其选择要充分考虑算法的各种操作。
数据结构对算法的影响:
1、数据结构的存储能力。如果数据结构存储能力强、存储信息多,算法将会较好设计。反之对于过于简单的数据结构,可能就要设计一套比较复杂的算法了。在这一点上,经常体现时间与空间的矛盾。
2、定义在数据结构上的操作。“数据结构”一词之所以不同于“变量”,主要在于数据结构上定义了基本操作,这些操作就好比工具,有了好的工具,算法设计也会比较轻松。
数据结构
根据数据元素之间关系的不同特性,通常可以归类为下列四类基本结构:
(1)集合结构:元素间关系仅是同属一个集合。
(2)线性结构:元素间存在一对一的关系。
(3)树形结构:元素间的关系是一对多的关系。
(4)图形结构:元素间的关系是多对多的关系。
一、线性结构
线性结构是N个数据元素构成的有限序列。线性结构存储方式分为顺序存储结构和链式存储结构两种。
顺序存储结构
平时使用的数组就是这种结构,比如Pascal:a:[1..100] oflongint; C++:int a[100]。
当需要在顺序存储的线性表中插入一个数据元素时,需要顺序移动后续的元素以“腾”出某个合适的位置放置新元素。
链式存储结构
二维数组与线性表
如果某一线性表,它的每一个数据元素分别是一个线性表,这样的二维表在数据实现上通常使用二维数组。二维数组的一个形象比喻:多个纵队形成的方块 m * n。
数组地址计算问题
题目描述:已知N*(N+1)/ 2个数据,按行的顺序存入数组b[1],b[2],…中。其中第一个下标表示行,第二个下标表示列。若aij (i>=j,j=1,2,…,,n)存于b[k]中,问:k,i,j之间的关系如何表示?
答案:K=i*(i-1)/2+j
栈与卡特兰数:略,可参考:
队列
先进先出。允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。
循环队列
头指针指向队列中队头元素的前一个位置,尾指针指示队尾元素在队列中的当前位置。
二、树型结构
基本概念:根、叶子、子树。
结点的度:结点拥有的子树数
二叉树的遍历和性质:略,可参考:
三、图形结构
图常用的存储结构:邻接矩阵
欧拉图
欧拉通路(回路):通过图G的每条边一次且仅一次,而且走遍每个结点的通路(回路),就是欧拉通路(回路)。存在欧拉回路的图就是欧拉图。
欧拉回路要求边不能重复,结点可以重复。笔不离开纸,不重复地走完所有的边,且走过所有结点,也就是所谓的一笔画。
欧拉图或通路的判定
1、无向连通图G是欧拉图,G不含奇数度结点(G的所有结点度数为偶数);
2、非平凡连通图G含有欧拉通路,G最多有两个奇数度的结点;
3、连通有向图D含有有向欧拉回路(即欧拉图),D中每个结点的入度=出度。
哈密顿图
哈密顿通路(回路):通过图G的每个结点一次,且仅一次的通路(回路),就是哈密顿通路(回路)。存在哈密顿回路的图就是哈密顿图。
每日练习
1、一个向量第一个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是( ) 。
A)110 B)108 C) 100 D) 109
2、设有一个含有13个元素的Hash表(0~12),Hash函数是:H(key)=key% 13,其中% 是求余数运算。用线性探查法解决冲突,则对于序列(2、8、31、20、19、18、53、27),18应放在第几号格中( ) 。
A) 5 B) 9 C) 4 D) 0
3、在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的( ) 倍。
A) 1/2 B)1 C) 2 D) 4
4、要使1...8号格子的访问顺序为:8、2、6、5、7、3、1、4,则下图中的空格中应填入( )。
A) 6 B) 0 C) 5 D) 3
5、设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5,e6依次通过栈S,一个元素出栈后即进入队列Q,若出队的顺序为e2,e4,e3,e6,e5,e1,则栈S的容量至少应该为( ) 。
A) 2 B) 3 C) 4 D) 5
6、若已知一个栈的入栈顺序是1,2,3,…,n,其输出序列为P1,P2,P3,…,Pn,若P1是n,则Pi是( )
A)i B)n-1 C)n-i+1 D)不确定
7、以下哪一个不是栈的基本运算( )
A)删除栈顶元素 B)删除栈底的元素
C)判断栈是否为空 D)将栈置为空栈
8、下面关于算法的错误说法是( )
A)算法必须有输出 B)算法必须在计算机上用某种语言实现
C)算法不一定有输入 D)算法必须在有限步执行后能结束
9、在顺序表(2,5,7,10,14,15,18,23,35,41,52)中,用二分法查找12,所需的关键码比较的次数为( )
A)2 B)3 C)4 D)5
10、无向图G=(V,E),其中V={a,b,c,d,e,f}E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)}对该图进行深度优先遍历,得到的顶点序列正确的是( )
A) a,b,e,c,d,f B)a,c,f,e,b,d C)a,e,b,c,f,d D)a,b,e,d,f,c
11、某数列有1000个各不相同的单元,由低至高按序排列;现要对该数列进行二分法检索(binary-search),在最坏的情况下,需检视( )个单元。
A.1000 B. 10 C.100 D. 500
12、线性表若采用链表存贮结构,要求内存中可用存贮单元地址( )
A.必须连续 B. 部分地址必须连续 C.一定不连续 D. 连续不连续均可
13、下列叙述中,正确的是( )
A.线性表的线性存贮结构优于链表存贮结构 B.队列的操作方式是先进后出
C.栈的操作方式是先进先出 D. 二维数组是指它的每个数据元素为一个线性表的线性表
14、设循环队列中数组的下标范围是1~n,其头尾指针分别为f和r,则其元素个数为( )
A.r-f B.r-f+1 C.(r-f) MOD n+1 D.(r-f+n) MOD n
15、表达式(1+34)*5-56/7 的后缀表达式为( )。
A)1+34*5-56/7 B) -*+1 34 5/56 7 C) 1 34 +5*56 7/-
D) 1 34 5* +56 7/- E) 1 34+5 56 7-*/
16、已知元素(8,25,14,87,51,90,6,19,20),问这些元素以怎样的顺序进入栈,才能使出栈的顺序满足:8在51前面;90在87的后面;20在14的后面;25在6的前面;19在90的后面。( )。(题意是全部进栈,再依次出栈)
A)20,6,8,51,90,25,14,19,87
B)51,6,19,20,14,8,87,90,25
C)19,20,90,7,6,25,51,14,87
D)6,25,51,8,20,19,90,87,14
E)25,6,8,51,87,90,19,14,20
17、假设我们用d=(a1,a2,...,a5),表示无向图G的5个顶点的度数,下面给出的哪(些)组d 值合理( )。
A){5,4,4,3,1} B){4,2,2,1,1} C){3,3,3,2,2}
D){5,4,3,2,1} E){2,2,2,2,2}
18、完全二叉树的结点个数为4 * N + 3,则它的叶结点个数为( )。
A. 2 * N B. 2 * N - 1 C. 2 * N + 1 D. 2 * N - 2 E. 2 * N + 2
19、二叉树T的宽度优先遍历序列为AB C D E F G H I,已知A是C的父结点,D 是G 的父结点,F 是I 的父结点,树中所有结点的最大深度为3(根结点深度设为0),可知F的父结点是( )。
A. 无法确定 B. B C. C D.D E. E
20、在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是( ) 。
A) 希尔排序 B) 起泡排序 C) 插入排序 D) 选择排序
21、已知,按中序遍历二叉树的结果为:abc
问:有多少种不同形态的二叉树可以得到这一遍历结果,并画出这些二叉树。
22、根据Nocomachns定理,任何一个正整数n的立方一定可以表示成n个连续的奇数的和。例如:
13=1
23=3+ 5
33=7+9+11
43=13+15+17+19
在这里,若将每一个式中的最小奇数称为X,那么当给出n之后,请写出X与n之间的关系表达式。
23、将数组{32, 74, 25, 53, 28, 43, 86, 47}中的元素按从小到大的顺序排列,每次可以交换任意两个元素,最少需要交换____次。
24、取火柴游戏的规则如下:一堆火柴有N 根,A、B 两人轮流取出。每人每次可以取1根或2 根,最先没有火柴可取的人为败方,另一方为胜方。如果先取者有必胜策略则记为1,先取者没有必胜策略记为0。当N 分别为100,200,300,400,500 时,先取者有无必胜策略的标记顺序为___(回答应为一个由0和/或1组成的字符串)
历年真题
1.完全二叉树有2*N-1的结点,则它的叶子结点数目是( )。
A.N-1 B.2*N C.N D.2N-1 E.N/2
2.将数组{8,23,4,16,77,-5,53,100}中元素从大到小按顺序排序,每次可以交换任意两个元素,最少要交换( )次。
A.4 B.5 C.6 D.7 E.8
3.递归过程和函数调用时,处理参数和返回地址,通常使用一种称为( )的数据结构。
A.队列 B.多维数组 C.线性表 D.链表 E.栈
4.对有序数组{5,13,19,21,37,56,64,75,88,92,100}进行二分查找,等概率情况下,查找成功的平均查找长度(平均比较次数)是()。
A.35/11 B.34/11 C.33/11 D.32/11 E.34/10
5.设T是一棵有n个定点的树,以下说法正确的是( )。
A.T是联通的,无环的 B.T是联通的,有n-1条边
C.T是无环的,有n-1条边 D.以上都不对
6. 对有序数组{5, 13, 19, 21, 37, 56, 64, 75, 88,92,100}进行二分查找,成功查找元素19的查找长度(比较次数)是( )。
A.1 B. 2 C. 3 D. 4
7. 在32*32点阵的“字库”中,汉字“北”与“京”的字模占用字节数之和是( )。
A. 512 B. 256 C. 384 D. 128
8. 在关系数据库中, 存放在数据库中的数据的逻辑结构以( )为主
A. 二叉树 B. 多叉树 C. 哈希表 D.C+树 E. 二维表
9. 欧拉图G是指可以构成一个闭回路的图,且图G的每一条边恰好在这个闭回路上出现一次(即一笔画成)。在以下各个描述中,不一定是欧拉图的是( )。
A. 图G中没有度为奇数的顶点
B. 包含欧拉环游的图(欧拉环游是指通过图中每边恰好一次的闭路径)
C. 包含欧拉闭迹的图(欧拉迹是指通过图中每边恰好一次的路径)
D. 存在一条回路,通过每个顶点恰好一次
E. 本身闭迹的图
10.高度为n的均衡的二叉树是指:如果去掉叶结点及相应的树枝,它应该是高度为n-1的满二叉树。在这里,树高等于叶结点的最大深度,根结点的深度为0,如果某个均衡的二叉树共有2381个结点,则该树的树高为()。
A. 10 B. 11 C. 12 D. 13 E. 210 – 1
11.将5个数的序列排序,不论原先的顺序如何,最少都可以通过()次比较,完成从小到大的排序。
A. 6 B. 7 C. 8 D. 9 E. 10
12. 在下列各种排序算法中,不是以“比较”作为主要操作的算法是()。
A. 选择排序 B. 冒泡排序 C. 插入排序 D. 基数排序
13.高度为n的均衡的二叉树是指:如果去掉叶结点及相应的树枝,它应该是高度为n-1的满二叉树。在这里,树高等于叶结点的最大深度,根结点的深度为0,如果某个均衡的二叉树共有2381个结点,则该树的树高为()。
A. 10 B. 11 C. 12 D. 13
14.将5个数的序列排序,不论原先的顺序如何,最少都可以通过()次比较,完成从小到大的排序。
A.6 B. 7 C. 8 D. 9
15. 字符串“ababacbab”和字符串“abcba”的最长公共子串是()。
A. abcba B. cba C. abc D. ab E. bcba
16. 完全二叉树的结点个数为4 * N + 3,则它的叶结点个数为()。
A. 2 * N B. 2 * N - 1 C. 2 * N + 1 D. 2 * N - 2 E. 2 * N+ 2
17. 平面上有五个点A(5, 3), B(3, 5), C(2, 1),D(3, 3), E(5, 1)。以这五点作为完全图G 的顶点,每两点之间的直线距离是图G 中对应边的权值。图G 的最小生成树中的所有边的权值综合为()。
A. 8 B. 7+ 5 C. 9 D. 6+ 5 E. 4+2 2 + 5
18. 一位艺术史学家有20000 幅1024* 768 的真彩色(24位)图像,如果将这些图像以位图形式保存在CD 光盘上(一张CD 光盘的容量按600M计算),大约需要()张CD光盘。
A. 1 B. 10 C.100 D. 1000 E. 10000
19. 完全二叉树的结点个数为11,则它的叶结点个数为()。
A. 4 B.3 C.5 D. 2 E. 6
20. 平面上有五个点A(5, 3), B(3, 5), C(2, 1), D(3, 3), E(5, 1)。以这五点作为完全图G 的顶点,每两点之间的直线距离是图G中对应边的权值。以下哪条边不是图G 的最小生成树中的边()。
A. AD B. BD C. CD D. DE E. EA
21.某大学计算机专业的必修课及其先修课程如下表所示:
请你判断下列课程安排方案哪个(些)是合理的( )。
A. C0, C1, C2, C3,C4, C5, C6, C7 B. C0, C1, C2, C3, C4,C6, C7, C5
C. C0, C1, C6, C7,C2, C3, C4, C5 D. C0, C1, C6, C7, C5,C2, C3, C4
E. C0, C1, C2, C3,C6, C7, C5, C4
22. 满二叉树的叶结点个数为N,则它的结点总数为( )。
A.N B. 2 * N C. 2 * N – 1 D. 2 * N + 1 E. 2N – 1
23. 在下图中,从顶点( )出发存在一条路径可以遍历图中的每条边一次,而且仅遍历一次。
A.A点 B. B点 C. C点 D. D点 E. E点