计算机数据结构
第一章 绪论
数据结构基本概念
数据-数据元素-数据项
数据结构:
- 数据的逻辑结构
- 数据的存储结构
- 顺序
- 链式——结点间物理地址不连续,结点内物理地址连续
- 索引
- 散列
- 数据的运算
算法和算法评价
第二章 线性表
1. logN²和(logN)²都是O(N)
2. NlogN2 和 NlogN3 具有相同的增长速度.
3. N2logN和NlogN2具有不同的增长速度
4. 与数据元素本身的形式、内容、相对位置、个数无关的是数据的( )。C
Suppose A is an array of length N with some random numbers. What is the time complexity of the following program in the worst case?C
void function( int A[], int N ) {
int i, j = 0, cnt = 0;
for (i = 0; i < N; ++i) {
for (; j < N && A[j] <= A[i]; ++j);
cnt += j - i;
}
}
头指针和头结点的区别:
头指针:
–头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针
–头指针具有标识作用,所以头指针冠以链表的名字(指针变量的名字)
--无论链表是否为空,头指针均不为空
–头指针是链表的必要元素
头结点:
–头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度)
–有了头结点,对在第一元素结点前插入结点和删除第一结点起操作与其它结点的操作就统一了
–头结点不一定是链表的必要元素
h
为空的判定条件是:B
h == NULL;
h->next == NULL;
h->next == h;
p
之后插入s
的语句是:p
所指的结点,相应语句为数据结构作业4:栈和队列
每一个出栈的元素的后面,其中比该元素先入栈的一定按照入栈逆顺序排列。
入栈A,B,C,D,E,若第一个出栈的是D,在D之前入栈的有A、B、C,则后续ABC的出栈顺序只能为C,B,A。
1 2 3 4 5 进栈 大的后面小的得逆序 5 4 3 2 1 进栈 小的后面大的得顺序
1. 两个栈共享一片连续空间,可以将两个栈的栈底分别设在这片空间的两端。T
2. 若已知一队列用单向链表表示,该单向链表的当前状态(含3个对象)是:1->2->3
,其中x->y
表示x
的下一节点是y
。此时,如果将对象4
入队,然后队列头的对象出队,则单向链表的状态是:B
1->2->3
2->3->4
4->1->2
下列代码的功能是返回带头结点的单链表L
的逆转链表。
List Reverse( List L )
{
Position Old_head, New_head, Temp;
New_head = NULL;
Old_head = L->Next;
while ( Old_head ) { //图解
Temp = Old_head->Next;
Old_head->Next = New_head;
New_head = Old_head;
Old_head = Temp;
}
L->Next = New_head;
return L;
}
数据结构作业5:串、数组和广义表
KMP算法,求next数组
1. 假设模式串是abababaab
,则KMP模式匹配算法中的next[j] = 0 1 1 2 3 4 5 6 2
。T
2. 数组可以应用顺序式存储结构,也可以应用链式存储结构T
3. 设主串 T = abaabaabcabaabc
,模式串 S = abaabc
,采用 KMP 算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是:B
4. 设有两个串p和q,求q在p中首次出现的位置的运算称为()。B
5. 有一个n×n的对称矩阵A,将其下三角部分按行存放在一维数组B中,而A[0][0]存放于B[0]中,则第i行的对角元素A[i][i]存放于B中的( )处。A
6. 稀疏矩阵一般的压缩存储方式有两种,即()。C
7. 设二维数组A[1… m,1… n]按行存储在数组B中,则二维数组元素A[i,j]在一维数组B[1…m*n]中的下标为 ( )。A
8. 带行表的三元组表是稀疏矩阵的一种( ) A
9. 广义表与稀疏矩阵都是线性表的扩展,它们的共同点为()。D
typedef
struct
{
int
i;
//行号
int
j;
//列号
elemtype d;
//元素值
}
typedef
struct
{
int
md;
//行数
int
nd;
//列数
int
td;
//非零元个数
}
3 * 10 * 2 + 3 * 2 = 66
13. KMP算法。
#include<cstring>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255
void get_nextval(char T[], int nextval[])
{
int i = 1, j = 0;
nextval[1] = 0;
while (i < T[0])
if (j == 0 || T[i] == T[j])
{
++i;
++j;
if (T[i] != T[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
} else
j = nextval[j];
}
int Index_KMP(char S[], char T[], int pos, int next[])
{
int i = pos, j = 1;
while (i <= S[0] && j <= T[0])
if (
)
{
++i;
++j;
}
else
;
if (j > T[0])
;
else
return 0;
}
int main()
{
char S[MAXSTRLEN+1],T[MAXSTRLEN+1];
char S1[MAXSTRLEN],S2[MAXSTRLEN];
cin >> S1 >> S2;
strcpy(&S[1],S1);
strcpy(&T[1],S2);
S[0]=strlen(S1);
T[0]=strlen(S2);
int *p = new int[T[0]+1];
get_nextval(T,p);
cout<<Index_KMP(S,T,1,p);
return 0;
}
数据结构作业6:树和二叉树
二叉树
第i层最多有2i-1(i>=1)个结点
深度为k,最多有2k-1(k>=1)个结点
终端结点n0,度为二的结点n2,n=n0+n1+n2 n=n1+2n2+1 则n0=n2+1
1. 哈夫曼树中一定没有度为 1 的结点。T
2. 对于一个有N个结点、K条边的森林,不能确定它共有几棵树 F
N-K棵树
3. 对N(≥2)个权值均不相同的字符构造哈夫曼树,则树中任一非叶结点的权值一定不小于下一层任一结点的权值。T
4. 哈夫曼编码是一种最优的前缀码。对一个给定的字符集及其字符频率,其哈夫曼编码不一定是唯一的,但是每个字符的哈夫曼码的长度一定是唯一的。F
长度不是唯一的
5. 某二叉树的中序序列和后序序列正好相反,则该二叉树一定是 C
6. 某二叉树的前序和后序遍历序列正好相反,则该二叉树一定是 B

7. 设一段文本中包含字符{a, b, c, d, e},其出现频率相应为{3, 2, 5, 1, 1}。则经过哈夫曼编码后,文本所占字节数为:C
8. 一棵二叉树中,双分支结点数为15,单分支结点数为30,则叶子结点数为()个。B
9. 若将一棵树 T 转化为对应的二叉树 BT,则下列对 BT 的遍历中,其遍历序列与 T 的后根遍历序列相同的是:B
10. 以二叉链表作为二叉树的存储结构,在具有 n 个结点的二叉链表中(n>0),空链域的个数为 __A
11. 对于任意一棵高度为 5 且有 10 个结点的二叉树,若采用顺序存储结构保存,每个结点占 1 个存储单元(仅存放结点的数据信息),则存放该二叉树需要的存储单元的数量至少是:A
12. 一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶子结点个数是( )。B
13. 若某二叉树有 5 个叶结点,其权值分别为 10、12、16、21、30,则其最小的带权路径长度(WPL)是:B

14.
数据结构作业7:图
1. 用邻接表法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。F
都有关
2. 如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则G一定有2个连通分量。T
3. 在一个有权无向图中,若b
到a
的最短路径距离是12,且c
到b
之间存在一条权为2的边,则c
到a
的最短路径距离一定不小于10。T
4. Kruskal 算法是维护一个森林,每一步把两棵树合并成一棵。T
5. Prim 算法是通过每步添加一条边及其相连的顶点到一棵树,从而逐步生成最小生成树。T
6. P 是顶点 S 到 T 的最短路径,如果该图中的所有路径的权值都加 1,P 仍然是 S 到 T 的最短路径。F
7. 如果从有向图 G 的每一点均能通过深度优先搜索遍历到所有其它顶点,那么该图一定不存在拓扑序列。T
8. 如果 e 是有权无向图 G 唯一的一条最短边,那么边 e 一定会在该图的最小生成树上。T
9. 下列关于无向连通图特征的叙述中,正确的是:只有1
- 所有顶点的度之和为偶数
- 边数大于顶点个数减1
- 至少有一个顶点的度为1
10. 若无向图G =(V,E)中含7个顶点,要保证图G在任何情况下都是连通的,则需要的边数最少是:C

可以看到,同样是给出 7 点 6 边,第二种情况并不能连通,也就不符合题目中“任何情况”的要求。
由此我们可以分析到,要让 7 个点都连通,那么先让 6 个点完全连通,所谓完全就是每个点能够支出的边是满的,这样 6 个点的情况下,边和点的关系是满的。其边的数量由公式 n*(n-1)/2 得出(无向完全连通图),也就是 6*5/2=15;
那么此时,我多了一个点,7 号点,只需要在那 6 个点的图中连一根边过来,7 号点就可以访问任意 6 点图中的点了。
11. 在N个顶点的无向图中,所有顶点的度之和不会超过顶点数的多少倍?D
12. 图的深度优先遍历类似于二叉树的:A
13. 在用邻接表表示有N个结点E条边的图时,深度优先遍历算法的时间复杂度为:B
14. 若要检查有向图中有无回路,除了可以利用拓扑排序算法外,下列哪种算法也可以用?C
15. 给定一个有向图的邻接表如下图,则该图有__个强连通分量。B
16. 已知无向图G含有16条边,其中度为4的顶点个数为3,度为3的顶点个数为4,其他顶点的度均小于3。图G所含的顶点个数至少是:B
17. 下图所示的 AOE 网表示一项包含 8 个活动的工程。活动 d 的最早开始时间和最迟开始时间分别是:C
18. 图的遍历(广度优先)
对下图进行广度优先遍历,得到的序列不可能为 ▁▁▁▁▁ 。D
数据结构作业8:查找
二次探测法、平方探测法 ( H(k) ± i2 )
线性探测法 重复+1
查找成功/失败平均查找长度 的 分母意义 是不同的,失败时,分母是模的值;成功时,分母是元素个数。
1. 在检索一个单词时,用哈希算法比用搜索树要快。T
2. 对包含N个元素的散列表进行查找,平均查找长度为:D
3. 从一个具有N个结点的单链表中查找其值等于X的结点时,在查找成功的情况下,需平均比较多少个结点?D
4. 给定输入序列 {4371, 1323, 6173, 4199, 4344, 9679, 1989} 以及散列函数 h(X)=X%10
如果用大小为10的散列表,并且用开放定址法以及一个二次散列函数h2(X)=7−(X%7)解决冲突,则输入各项经散列后在表中的下标为:B(-1表示相应的插入无法成功)
5. 现有长度为 7、初始为空的散列表HT
,散列函数H(k)=k%7,用线性探测再散列法解决冲突。将关键字 22, 43, 15 依次插入到HT
后,查找成功的平均查找长度是:C

6. 现有长度为 11 且初始为空的散列表 HT,散列函数是 H(key)=key%7,采用线性探查(线性探测再散列)法解决冲突。
将关键字序列 87,40,30,6,11,22,98,20 依次插入到 HT 后,HT 查找失败的平均查找长度是:C

因为模是 7,所以计算的地址只可能在(0~6)这个范围(%7,再往后一定是冲突再散列的)。9+8+7+6+5+4+3 = 42
42/7=6
7. 设有一组关键字 { 29,01, 13,15,56,20,87,27,69,9,10,74 },散列函数为 H(key)=key%17,采用线性探测方法解决冲突。
试在 0 到 18 的散列地址空间中对该关键字序列构造散列表,则成功查找的平均查找长度为 __D

8. 下列二叉树中,可能成为折半查找判定树(不含外部结点)的是:A
将12个数画成完全二叉树,第一层有1个、第二次2个、第三层4个,第四层只有5个。二分查找时:
第一层需要比较1次
第二两个数,每个比较2次
第三层四个数,每个比较3次
第四层五个数,每个比较4次
则平均查找长度即为:(1+2*2+3*4+4*5)/12 = 37/12
数据结构作业9:排序
交换类:快速排序,冒泡排序
插入类:插入排序,希尔排序
归并类:归并排序
选择类:选择排序,堆排序
1. 要从50个键值中找出最大的3个值,选择排序比堆排序快。T
2. 排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置的方法称为:A
3. 对一组包含10个元素的非递减有序序列,采用直接插入排序排成非递增序列,其可能的比较次数和移动次数分别是:D
4. 采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是:C
5. 选择一个排序算法时,除算法的时空效率外,下列因素中,还需要考虑的是:D
- I、数据的规模
- II、数据的存储方式
- III、算法的稳定性
- IV、数据的初始状态
6. 快速排序方法在( )情况下最不利于发挥其长处。D
7. 对同一待排序序列分别进行折半插入排序和直接插入排序, 两者之间可能的不同之处是____。D
8. 排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一“趟”。下列序列中,不可能是快速排序第二趟结果的是:D
选择排序
(类似冒泡,每次扫描最小的数字 记下下标)
希尔排序
** for(for(for(if)))**)
public static int[] insertionSort(int[] arr){
if(arr == null || arr.length <= 1){
return arr;
}
//希尔排序 升序
for (int d = arr.length / 2;d>0;d /= 2){ //d:增量 7 3 1
for (int i = d; i < arr.length; i++){
//i:代表即将插入的元素角标,作为每一组比较数据的最后一个元素角标
//j:代表与i同一组的数组元素角标
for (int j = i-d; j>=0; j-=d){ //在此处-d 为了避免下面数组角标越界
if (arr[j]