2009 年
讲解视频推荐:【BOK408真题讲解-2009年(催更就退网版)】
1. 图的应用(10')
带权图(权值非负, 表示边连接的两顶点间的距离)的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假设从初始顶点到目标顶点之间存在路径,现有一种解决该问题的方法:
① 设最短路径初始时仅包含初始顶点,令当前顶点 u 为初始顶点;
② 选择离 u 最近且尚未在最短路径中的一个顶点 v ,加入到最短路径中,修改当前顶点 u = v ;
③ 重复步骤 ② ,直到 u 是目标顶点时为止。
请问上述方法能否求得最短路径?若该方法可行, 请证明之;否则,请举例说明。
【解析】:

2. 线性表的链式表示(15')
已知一个带有表头结点的单链表,结点结构为:
data | link |
---|
假设该链表只给出了头指针 list 。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第 k 个位置上的结点(k 为正整数)。若查找成功, 算法输出该结点的 data 域的值, 并返回 1 ;否则, 只返回 0 。要求:
(1)描述算法的基本设计思想。
(2)描述算法的详细实现步骤。
(3)根据设计思想和实现步骤, 采用程序设计语言描述泉法(使用 C 、C++ 或 Java 语言实现),关键之处请给出简要注释。
【解析】:
2010 年
讲解视频推荐:【BOK408真题讲解-2010年】
1. 散列表(10')
将关键字序列(7, 8, 30, 11, 18 , 9, 14)散列存储到散列表中。散列表的存储空间是一个下标从 0 开始的一维数组,散列函数为:H(key) = (key × 3) MOD 7 ,处理冲突采用线性探测再散列法,要求装填(载)因子为 0.7 。
(1)请画出所构造的散列表。
(2)分别计算等概率情况下查找成功和查找不成功的平均查找长度。
【解析】:

2. 线性表的顺序表示(13')
设将 n(n > 1)个整数存放到一维数组 R 中。试设计一个在时间和空间两方面都尽可能高效的算法,将 R 中保存的序列循环左移 p(0 < p < n)个位置,即将 R 中的数据由(x~0~, x~1~, ..., x~n-1~)变换为(x~p~, x~p+1~, ..., x~n-1~, x~0~, x~1~, ..., x~p-1~)。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用 C 、C++ 或 Java 语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
【解析】:
2011 年
讲解视频推荐:【BOK408真题讲解-2011年】
1. 图的应用(8')
已知有 6 个顶点(顶点编号为 0 ~ 5 ) 的有向带权图 G ,其邻接矩阵 A 为上三角矩阵,按行为主序(行优先)保存在如下的一维数组中。
4 | 6 | ∞ | ∞ | ∞ | 5 | ∞ | ∞ | ∞ | 4 | 3 | ∞ | ∞ | 3 | 3 |
---|
要求:
(1)写出图 G 的邻接矩阵 A 。
(2)画出有向带权图 G 。
(3)求图 G 的关键路径,并计算该关键路径的长度。
【解析】:
2. 线性表的顺序表示(15')
一个长度为 L(L ≥ 1)的升序序列 S ,处在第 ⌈L / 2⌉ 个位置的数称为 S 的中位数。例如,若序列 S~1~ = (11, 13, 15, 17, 19) ,则 S 的中位数是 15 。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若 S~2~ = (2, 4, 6, 8, 20) ,则 S~1~ 和 S~2~ 的中位数是 11 。现有两个等长升序序列 A 和 B ,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列 A 和 B 的中位数。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用 C 、C++ 或 Java 语言描述算法, 关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
【解析】:
2012 年
讲解视频推荐:【BOK408真题讲解-2012年】
1. 树与二叉树的应用(10')
设有 6 个有序表 A, B, C, D, E, F ,分别含有 10 ,35, 40, 50, 60 和 200 个数据元素,各表中元素按升序排列。要求通过 5 次两两合并,将 6 个表最终合并成 1 个升序表,并在最坏情况下比较的总次数达到最小。请回答下列问题。
(1)给出完整的合并过程, 并求出最坏情况下比较的总次数。
(2)根据你的合并过程,描述 n(n ≥ 2)个不等长升序表的合并策略,并说明理由。
【解析】:
2. 线性表的链式表示(13')
假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时, 则可共享相同的后缀存储空间。例如,"loading" 和 "being" 的存储映像如下图所示。

设 str1 和 str2 分别指向两个单词所在单链表的头结点, 链表结点结构为:
data | next |
---|
请设计一个时间上尽可能高效的算法, 找出由 str1 和 str2 所指的两个链表共同后缀的起始位置(如图中字符 i 所在结点的位置 p ) 。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想, 采用 C 或 C++ 或 Java 语言描述算法, 关键之处给出注释。
(3)说明你所设计算法的时间复杂度。
【解析】:

(3)时间复杂度为 O(len1 + len2) 或 O(max(len1, len2)) ,其中 len1 、len2 分别为两个链表的长度。
2013 年
讲解视频推荐:【BOK408真题讲解-2013年】
1. 线性表的顺序表示(13')
已知一个整数序列 A = (a~0~, a~1~,..., a~n-1~) ,其中 0 ≤ a~i~ < n(0 ≤ i < n)。若存在 a~p1~ = a~p2~ = ··· = a~pm~ = x 且 m > n/2(0 ≤ p~k~ < n, 1 ≤ k ≤ m),则称 x 为 A 的主元素。例如 A = (0, 5, 5, 3, 5, 7, 5, 5) ,则 5 为主元素; 又如 A = (0, 5, 5, 3, 5, 1, 5, 7) ,则 A 中没有主元素。假设 A 中的 n 个元素保存在一个一维数组中, 请设计一个尽可能高效的算法, 找出 A 的主元素。若存在主元素,则输出该元素;否则输出 -1 。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用 C 、C++ 或 Java 语言描述算法, 关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
【解析】:
(1)给出算法的基本设计思想:算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的元素 Num 。然后重新计数, 确认 Num 是否是主元素。

(3)说明算法复杂性:参考答案中实现的程序的时间复杂度为 O(n) ,空间复杂度为 O(1) 。
2. 顺序查找和折半查找(10')
设包含 4 个数据元素的集合 S = {"do", "for", "repeat", ''while"} ,各元素的查找概率依次为 P~1~ = 0.35 ,p~2~ = 0.15 ,p~3~ = 0.15 ,p~4~ = 0.35 。将 S 保存在一个长度为 4 的顺序表中, 采用折半查找法, 查找成功时的平均查找长度为 2.2 。请回答:
(1)若采用顺序存储结构保存 s ,且要求平均查找长度更短,则元素应如何排列? 应使用何种查找方法?查找成功时的平均查找长度是多少?
(2)若采用链式存储结构保存 S ,且要求平均查找长度更短,则元素应如何排列? 应使用何种查找方法?查找成功时的平均查找长度是多少?
【解析】:

2014 年
讲解视频推荐:【BOK408真题讲解-2014年】
1. 树与二叉树的应用(13')
二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树 T ,采用二叉链表存储,结点结构如下:
left | weight | right |
---|
其中叶结点的 weight 域保存该结点的非负权值。设 root 为指向 T 的根结点的指针,请设计求 T 的 WPL 的算法, 要求:
(1)给出算法的基本设计思想。
(2)使用 C 或 C++ 语言,给出二叉树结点的数据类型定义。
(3)根据设计思想, 采用 C 或 C++ 语言描述算法, 关键之处给出注释。
【解析】:
2. 图的应用(10')
某网络中的路由器运行 OSPF 路由协议,题 42 表是路由器 R1 维护的主要链路状态信息(LSI),题 42 图是根据题 42 表及 R1 的接口名构造出来的网络拓扑。

请回答下列问题。
(1)本题中的网络可抽象为数据结构中的哪种逻辑结构?
(2)针对题 42 表中的内容,设计合理的链式存储结构,以保存题 42 表中的链路状态信息(LSI)。要求给出链式存储结构的数据类型定义,并画出对应题 42 表的链式存储结构示意图(示意图中可仅以 ID 标识结点)。
(3)按照迪杰斯特拉(Dijkstra)算法的策略,依次给出 R1 到达题 42 图中子网 192.1.x.x 的最短路径及费用。
【解析】:
2015 年
讲解视频推荐:【BOK408真题讲解-2015年】
1. 线性表的链式表示(15')
用单链表保存 m 个整数,结点的结构为:
data | link |
---|
且 |data| ≤ n(n 为正整数) 。现要求设计一个时间复杂度尽可能高效的算法,对于链表中 data 的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。例如,若给定的单链表 head 如下:

要求:
(1)给出算法的基本设计思想。
(2)使用 C 或 C++ 语言,给出单链表结点的数据类型定义。
(3)根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。
(4)说明你所设计算法的时间复杂度和空间复杂度。
【解析】:

2. 图的存储及基本操作(8')
已知含有 5 个顶点的图 G 如下图所示。请回答下列问题:

(1)写出图 G 的邻接矩阵 A(行、列下标从 0 开始)。
(2)求 A^2^ ,矩阵 A^2^ 中位于 0 行 3 列元素值的含义是什么?
(3)若已知具有 n(n ≥ 2)个顶点的图的邻接矩阵为 B ,则 B^m^(2 ≤ m ≤ n)中非零元素的含义是什么?
【解析】:
(1)图 G 的邻接矩阵 A 如下:

2016 年
讲解视频推荐:【BOK408真题讲解-2016年】
1. 树(8')
如果一棵非空 k(k ≥ 2)叉树 T 中每个非叶结点都有 K 个孩子,则称 T 为正则 K 叉树。请回答下列问题并给出推导过程。
(1)若 T 有 m 个非叶结点,则 T 中的叶结点有多少个?
(2)若 T 的高度为 h(单结点的树 h = 1),则 T 的结点数最多为多少个?最少为多少个?
【解析】:

2. 交换排序(15')
已知由 n(n ≥ 2)个正整数构成的集合 A = {a~k~ | 0 ≤ k < n},将其划分为两个不相交的子集 A~1~ 和 A~2~ ,元素个数分别是 n~1~ 和 n~2~ ,A~1~ 和 A~2~ 中元素之和分别为 S~1~ 和 S~2~ 。设计一个尽可能高效的划分算法, 满足 |n~1~ - n~2~| 最小且 |S~1~ - S~2~| 最大。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。
(3)说明你所设计算法的平均时间复杂度和空间复杂度。
【解析】:
(3)算法的平均时间复杂度和空间复杂度:本参考答案给出的算法平均时间复杂度是 O(n) ,空间复杂度是 O(1) 。
2017 年
讲解视频推荐:【BOK408真题讲解-2017年】
1. 二叉树的遍历(15')
请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。例如,当下列两棵表达式树作为算法的输入时,输出的等价中缀表达式分别为:(a+b)×(c×(-d)) 和 (a×b)+(-(c-d)) 。

二叉树结点定义如下:
c
typedef struct node{
char data[10]; //存储操作数或操作符
struct node *left, *right;
}BTree;
要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。
【解析】:

2. 图的应用(8')
使用 Prim(普里姆)算法求带权连通图的最小(代价)生成树(MST)。请回答下列问题。
(1)对下图 G ,从顶点 A 开始求 G 的 MST ,依次给出按算法选出的边。

(2)图 G 的 MST 是唯一的吗?
(3)对任意的带权连通图,满足什么条件时,其 MST 是唯一的?
【解析】:

2018 年
讲解视频推荐:【BOK408真题讲解-2018年】
1. 线性表的顺序表示(13')
给定一个含 n(n ≥ 1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组 {-5 , 3, 2, 3} 中未出现的最小正整数是 1 ,数组 {1, 2, 3} 中未出现的最小正整数是 4 。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
【解析】:
2. 图的应用(12')
拟建设一个光通信骨干网络连通 BJ 、CS 、XA 、QD 、JN 、NJ 、TL 和 WH 八个城市,题 42 图中无向边上的权值表示两个城市间备选光纤的铺设费用。
请回答下列问题。

(1)仅从铺设费用角度出发,给出所有可能的最经济的光纤铺设方案(用带权图表示),并计算相应方案的总费用。
(2)题 42 图可采用图的哪种存储结构?给出求解问题(1)所使用的算法名称。
(3)假设每个城市采用一个路由器按(1)中得到的最经济方案组网, 主机 H1 直接连接在 TL 的路由器上,主机 H2 直接连接在 BJ 的路由器上。若 H1 向 H2 发送一个 TTL = 5 的 IP 分组,则 H2 是否可以收到该 IP 分组?
【解析】:

2019 年
讲解视频推荐:【BOK408真题讲解-2019年】
1. 线性表的链式表示(13')
设线性表 L = (a~1~, a~2~, a~3~, ... , a~n-2~, a~n-1~, a~n~) 采用带头结点的单链表保存,链表中的结点定义如下:
c
typedef struct node{
int data;
struct node *next;
}NODE;
请设计一个空间复杂度为 O(1) 且时间上尽可能高效的算法,重新排列 L 中的各结点,得到线性表 L' = (a~1~, a~n~, a~2~, a~n-1~, a~3~, a~n-2~, ...)。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。
(3)说明你所设计的算法的时间复杂度。
【解析】:
2. 队列(10')
请设计一个队列,要求满足:① 初始时队列为空;② 入队时,允许增加队列占用空间;③ 出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;④ 入队操作和出队操作的时间复杂度始终保待为 O(1) 。请回答下列问题:
(1)该队列是应选择链式存储结构,还是应选择顺序存储结构?
(2)画出队列的初始状态,并给出判断队空和队满的条件。
(3)画出第一个元素入队后的队列状态。
(4)给出入队操作和出队操作的基本过程。
【解析】: