当前位置:文档之家› 课后习题

课后习题


11.假设以带头节点的循环单链表表示队列,并且只设一个指针 指向对尾元素节点(不设头指针),试编写相应的入列和出列 算法。 P44
struct qnode{ //入列操作 int data; struct qnode *next; }; typedef struct qnode QNODE; QNODE *rear; void addqueue(int x) { QNODE *p; p=(QNODE *)malloc(sizeof(QNODE)); If(p==NULL)
7.已知指针ha和hb分别指向两个单链表的头结点,且头结点的 数据域中存放链表的长度,试写一算法将这两个链表连接在一 起(即令其中一个表的首元结点在另一个表的最后一个节点之 后),hc指向连接后的链表的头结点,并要求算法以尽可能短 的时间完成连接运算。 请分析你的算法的时间复杂度。 void merge (NODE *ha,NODE *hb) { NODE *p,*longlink,*shortlink; hc = (NODE *)malloc(sizeof(NODE)); if(ha->data<=hb->data) { shortlink = ha; longlink = hb; } else
时间复杂度的概念
例:算法: for(i=1;i<=n;++i)
{ for(j=1;j<=n;++j)
{ c[ i ][ j ]=0; //该步骤属于基本操作 执行次数:n的平方 次 for(k=1;k<=n;++k)
c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ]; //该步骤属于基本操作 执行次数:n的三次方次
13.试将下列稀疏矩阵A用三元组形式来表示。 P45 0 0 3 0 0 0 0 0 0 0 -7 0 0 0 0 0 0 0 0 0 1 2 3 4 5
A=
8
20 0 0
0 -13
行号 5
1 1 3 4 5
列号 5
2 5 1 1 3
值域 5
3 -7 8 20 -13
(5,5,5) (1,2,3) (1,5,-7) (3,1,8) (4,1,20) (5,3,-13)
} }
则有 T(n)= n的平方+n的三次方,根据上面括号里的同数 量级,我们可以确定 n的三次方 为T(n)的同数量级 则有f (n)= n的三次方,然后根据T(n)/f(n)求极限可得到常 数c 则该算法的 时间复杂度:T(n)=O(n的三次方)
10.设有编号为1,2,3,4的四辆列车,顺序进入一个栈式结构 的车站,具体写出这四辆列车开出车站的所有可能的顺序。 P44
5 18 6 6
20 20 20 9
30 30 30 30
9 9 9 20
27 27 27 27
6 6 18 18
14 14 14 14
45 45 45 45
22 22 22 22
第四趟
第五趟 第六趟 第七趟 第八趟
5 5 5
5 5
6 6 6
6 6
9 9 9
9 9
14 14 14
14 14
20 18 18
出栈序列 1 1 1 1 1 2 2 2 2 3 3 4 1 1 3 4 2 4 3 3 4 4 3 4 2 2 4 3 操作序列 I O I OI O I O I OI O I I O O I O I I O O I O I O I I O I OO I O I I I OO O I I O OI OI O I I OOI I O O 出栈序列 2 2 2 3 3 3 4 3 3 4 2 2 4 3 1 4 3 1 4 2 2 4 1 1 4 1 1 1 操作序列 I I O IOO I O I I O IOI O O I I O I IOO O I I I O OOI O I I I O OI OO I I I O I O OO I I I I OOOO
0 Apr
1 Aug
2 Dec
3 Feb
4
5 Jan
6
7
8 June
9 July
10 Sep
11
12 Nov
13 14 15 16
May
Mar
Oct
Jan
i H(x) 0 Apr Aug 1 10 5 2 Dec
Feb
6 3 3 Feb
Mar
13 6 4
Apr
1 0 5 Jan June July 6 Mar
时间复杂度的概念 定义:一般情况下,算法的基本操作重复执行的次数是模块 n的某一个函数f(n),因此,算法的时间复杂度记做:T (n)=O(f(n)) 。在实际分析中,关注的是频度的数量 级,即按重复执行次数最多的语句确定算法的时间复杂度。 分析:随着模块n的增大,算法执行的时间的增长率和f(n) 的增长率成正比,所以f(n)越小,算法的时间复杂度越低, 算法的效率越高。 方法: 在计算时间复杂度的时候,先找出算法的基本操作, 然后根据相应的各语句确定它的执行次数,再找出T(n) 的同数量级(它的同数量级有以下:1,Log2n ,n , nLog2n ,n的平方,n的三次方,2的n次方,n!),找出后, f(n)=该数量级,若T(n)/f(n)求极限可得到一常数c,则时 间复杂度T(n)=O(f(n))
6
5
14
13
7
二叉树
8
后序遍历6,8,7,5,4,3,2,10,14,13,12,11,9,1
12.什么叫霍夫曼树?按给出的一组权值{4,2,3,5,7,8}, 建立一棵霍夫曼树。 P73 答:具有最小带权路径长度的二叉树叫 作霍夫曼树。
8 29
21
7
14
5
9
4
5
2
3
霍夫曼树
15.画出对题图3-5的深度优先生成树和广度优先生成树。 P73
1
2
5
1
2
5
1
2
5
3
4
6
3
4
6
3
4
6
7
7
7
题图3-5
深度优先生成树
广度优先生成树
5.用以下关键字序列构造两个哈希表(每个哈希表的地址空间为 0~16):(Jan,Feb,Mar,Apr,May,June,July,Aug,Sep, Oct,Nov,Dec)。H(x) = i DIV 2,其中i为关键字x中第一个字 母在字母表中的序号。 (1) 用线性探测再散列法处理冲突; (2) 用链地址法处理冲突。 并分别求这两个哈希表在等概率情况下查找成功的平均查 找长度。 P97
{ printf(“内存中无可用空间。链队列已满,即上溢。\n”); exit(1); } else { p->data = x; p->next = rear->next; rear->next = p; rear = p; } }
11.假设以带头节点的循环单链表表示队列,并且只设一个指针 指向对尾元素节点(不设头指针),试编写相应的入列和出列 算法。 P44
6
18 18 9 9 9
9
20 20 18 14 14
14
30 27 20 18 18
18
27 30 27 20 20
20
6 6 30 27 22
22
14 14 14 30 27
27
45 45 45 45 30
30
22 22 22 22 45
45
直接插入排序
初始状态 第一趟 第二趟 第三趟
18 5 5 5
(I,J,K) I表示总行数 J表示总列数 K表示非零元 素个数
4.已知一棵树边的集合为{(I,M),(I,N),(E,I),(B,E), (B,D),(A,B),(G,J),(G,K),(C,G),(C,F),(H,L), (C,H),(A,C)},画出这棵树,并回答下列问题: (1) 哪个是根结点?哪些是叶子结点? (2) 哪些是结点G的双亲?哪些是结点G的孩子? (3) 哪些是结点E的兄弟?哪些是结点F的兄弟? (4) 结点B和N的层次号分别是什么? (5) 树的深度是多少?以结点C为根的子树的深度是多少?P72
A
B
C E F J N G H L
D I M
K
(1)A是根节点,D、F、J、K、L 、M、N为叶子节点 (2)C是G的双亲节点,J 、K是G的孩子节点 (3)D是E的兄弟节点,G 、H是F的兄弟 (4)B的层次号为2,N的层次号为5 (5)A数的深度为5,以节点C为根的子树的深度为3
A
B
C
D
E
F
G
a
b
c
d
e
f
g
h
i
j
k
l
m
1
n
2
o
3
p
4
q
5
r
6
s
7
t
8
u
9 10 11 12 13
v w x y z
14 15 16 17 18 19 20 21 22 23 24 25 26
Hi=(H(key)+di) MOD m =(H(x)+di) MOD 17
i=1,2,…,16
Jan i H(x) Hi 10 5 Feb 6 3 Mar 13 6 Apr 1 0 May June July Aug 13 6 7 10 5 8 10 5 9 1 0 1 Sep 19 9 10 Oct 15 7 11 Nov Dec 14 7 12 4 2
H
I
J
K
L
M
N
11.将题图3-3中的森林转化为相应的二叉树,并将得到的二叉 树分别按先序、中序、后序序列进行遍历,写出遍历的结点序 列。 P73 1
相关主题