题型:选择20(2*10)+判断10(1*10)+填空(2*10)+问题求解30(7+7+8+8)+算法设计(10*2)
一、选择题
- 数据的最小单位
- *q是*p的直接前驱,*q与*p之间插入*s执行的操作
- 线性表最常用的操作是在最后一个元素后插入或删除第一个元素,则采用什么储存方式
- 栈容量为4,进栈的序列为1、2、3、4、5、6,则可能的出栈序列为
- 大小为6的数组循环队列,rear和front的值为0和4,从当前队列添加2个元素再删除2个元素,rear和front的值为多少
- 下面哪个说法正确?串是由字符构成的有限序列;空串是由空格构成的串;朴素的模式匹配算法又称为KMP算法;串采用顺序存储结构
- 权8、4、5、7构成的Huffman树,则带权的路径长度是
- 临界矩阵 A = [ 0 1 0 1 0 0 1 1 0 1 0 0 1 0 0 0 ] A=\begin{bmatrix}0&1&0&1\\0&0&1&1\\0&1&0&0\\1&0&0&0\end{bmatrix} A=⎣⎢⎢⎡0001101001001100⎦⎥⎥⎤,则各顶点的度是
- 散列表的平均查找长度是?处理冲突的方法?表长度?
- 快速排序的平均复杂度?
二、判断题
- 算法的含义与程序的含义对比
- 线性表经常存取而少插入删除,则采用链式存储
- 两个栈共享一个空间,应该把栈的栈底分别设置在在空间的两端
- 循环队列不存在空间溢出问题
- 串长度指串中不同字符的个数
- 对应一组权值构造的Huffman树不唯一
- 度为2 的有序树为二叉树
- ADE网络中的关键路径上的节点的最早开始时间和最晚开始时间相同
- 散列表查找不需要任何比较
- 最小生成树的Kruskal算法是一种贪心算法
三、填空题
- 评价算法的两个指标
- 删除单链表中p指向节点的前驱节点的时间复杂度
- 1、2、3进入空栈,则出栈顺序组成的序列有几种
- 循环队列的引入是为了克服
- 主串S=”abccdcdccbaa“,子串T=”cdcc“,则几次匹配成功
- 二维数组 A [ 0 … 8 , 0 … 9 ] A[0\dots8,0\dots 9] A[0…8,0…9],每个数组占用3存储单元,首地址为SA开始,按行存放, A [ 8 ] [ 5 ] A[8][5] A[8][5]的起始地址
- n节点二叉树,使用二叉链表存储,包含几个空指针域
- n顶点无向图的每个顶点的度最大为
- 拉链法构造一个数列表,函数为 H ( k e y ) = k e y % 17 H(key)=key\%17 H(key)=key%17,需要几个链表
- 二路归并排序算法的时间复杂度
四、问题求解
-
字符串S有6种字符视为 { A 、 B 、 C 、 D 、 E 、 F } \{A、B、C、D、E、F\} {A、B、C、D、E、F},分别出现 2 、 3 、 7 、 10 、 4 、 5 2、3、7、10、4、5 2、3、7、10、4、5次
- 设计哈夫曼编码画出哈夫曼树,给出编码(左0右1)
- S的编码至少几位(树的带权路径长度)
-
关键字序列 ( 13 , 5 , 20 , 19 , 15 , 8 ) (13,5,20,19,15,8) (13,5,20,19,15,8)插入到表长为8的散列表,函数为 H ( k e y ) = k e y % 7 H(key)=key\%7 H(key)=key%7,利用线性探查法解决冲突
- 计算关键字对应的散列地址,画出解决冲突构造的散列表
- 计算等概率下查找成功的平均查找长度
-
已知某有向带权图11个节点的连接方式,以3为出发点,使用Dijkstra算法列出3到其余顶点的最短路径,并填写动态执行情况,U为选定的节点集合,D[i]表示顶点到点i的距离,P[i]表示源点到顶点i时,顶点i的前驱节点(M表示无穷大)
- 动态执行情况:
- 列出顶点3到各顶点最短路径
0 → \rightarrow → 2 6 | 3 → \rightarrow → 1 25 | 5 → \rightarrow → 1 12 | 6 → \rightarrow → 4 9 |
---|---|---|---|
0 → \rightarrow → 4 6 | 3 → \rightarrow → 6 13 | 5 → \rightarrow → 2 1 | 6 → \rightarrow → 9 4 |
0 → \rightarrow → 5 17 | 3 → \rightarrow → 8 9 | 5 → \rightarrow → 4 3 | 7 → \rightarrow → 1 7 |
1 → \rightarrow → 3 17 | 4 → \rightarrow → 5 3 | 5 → \rightarrow → 7 10 | 7 → \rightarrow → 5 11 |
2 → \rightarrow → 5 11 | 4 → \rightarrow → 6 4 | 5 → \rightarrow → 8 4 | 7 → \rightarrow → 9 6 |
2 → \rightarrow → 7 6 | 4 → \rightarrow → 7 3 | 6 → \rightarrow → 0 12 | 10 → \rightarrow → 1 15 |
3 → \rightarrow → 0 1 | 4 → \rightarrow → 8 1 | 6 → \rightarrow → 1 5 | 10 → \rightarrow → 5 2 |
3 → \rightarrow → 10 3 | 4 → \rightarrow → 9 15 | 6 → \rightarrow → 2 1 | 10 → \rightarrow → 8 7 |
循环 | U | D [ 0 ] , … , D [ 10 ] D[0],\dots,D[10] D[0],…,D[10] | P [ 0 ] , … , P [ 10 ] P[0],\dots,P[10] P[0],…,P[10] |
---|---|---|---|
初始化 | {3} | 1 25 M 0 M M 13 M 9 M 3 | 3 3 0 3 0 0 3 0 3 0 3 |
1 | |||
-
给定数字序列50、37、66、98、75、14、28、50,排序以第1个数字为基准,使用快速排序
- 一排:
- 二排:
- 三排:
五、算法设计
- 串采用链式存储结构,填写程序,完成串的模式匹配
typedef struct linknode{
char data;
struct linknode *next;
}linkstring
linkstring* Index(linkstring *s,linkstring *t){
linkstring *first,*sptr,*tptr;
first=s;
sptr=first;
@1········
while(sptr&&tptr){
if(@2········){
sptr=sptr->next;
@3········
}else{
first=first->next;
@4········
tptr=t;
}
}
if(tptr=NULL)
@5········
else
return NULL;
}
- 以二叉链表作为存储结构,编写算法求二叉树中度为1的结点个数
typedef struct Node{
char data;
struct Node *leftchild,*rightchild;
}BinTree
int CountNodes(BinTree *root){
}