北邮算法与数据结构习题参考答案
北邮算法与数据结构习题参考标准答案
}
}
四、判断括号是否配对:
intCorrect( strings )
{
Inistack(Q);
for(i=0;s[i]== ‘=’;i++ )//表达式以‘=’结束
{
switch(s[i] )
=2n–1
所以,梵塔的移动次数为2n–1次。
三、简化的背包问题:
void Pack( intm, int i,int t)//初始值为:11t
{
for (k=i; k<=n;k++)
{
solution[m]=weight[k];
if( t == weight[k])
{
for ( j=1;j<=m;j++) cout<<solution[j];cout<<endl;
{
C=new struct node;C->next=NULL;q=B->next;
While(q)
{
p=A->r= new struct node;r->exp= p->exp+q->exp;
r->inf=p->inf* q->inf;PolyAdd(C,r);
p=p->next;
void Insert (string S, string T, charch)//设块大小为m
{
i=0; p=T;
while ((p->next)&&(!i))
{
for(j=1;j<=m;j++ ) if(p->str[j]==ch) i=j;
北邮算法与数据结构习题参考答案
北邮算法与数据结构习题参考答案作业参考答案一、(带头结点)多项式乘法 C = A×B:void PolyAdd ( list &C, list R) // R 为单个结点{p=C;while ((!p->next) && (p->next->exp>R->exp)) p=p->next; if ((p->next) || (p->next->exp<R->exp)){ R->next=p->next; p->next=R; } else{ p->next->inf += R->inf; delete R;if ( ! p->next->inf ){ R=p->next; p->next=R->next; delete R; } }}void PolyMul ( list A, list B, list &C ){C=new struct node; C->next=NULL; q=B->next; While ( q ){p=A->next;while ( p ){r = new struct node; r->exp = p->exp + q->exp;r->inf = p-> inf * q->inf; PolyAdd(C, r);p=p->next;}q=q->next;}}二、梵塔的移动次数:已知移动次数迭代公式为:M ( n ) = 2M ( n-1 ) + 1初值为:M ( 0 ) = 0则:M ( n ) = 2 ( 2M ( n-2 ) + 1 ) + 1= 4M ( n-2 ) + 3= 8M ( n-3 ) + 7= 2i M ( n-i ) + 2i– 1若n=i ,则M ( n-n ) = 0,故:M ( n ) = 2n M ( n-n ) + 2n– 1= 2n– 1所以,梵塔的移动次数为2n– 1次。
北邮数据结构第六章答案详解 图(1)
1
5
1
54 3
42
5 66
图 6-8 图 G 答案:根据不同算法构造的最小生成树如图 6-9 所示的图(a)和(b)
2
④
⑤ 5
1
①
4 3
②
③
6
2
⑤
③ 5
1
①
4 3
④
②
6
(a) Prim 生成树
(b) Kruskal 生成树
图 6-9 最小生成树
5、算法设计
(1)以邻接表为存储结构,设计实现深度优先遍历的非递归算法。
int top = -1; cout<<v<<’\t’; bVisited[v] = true; stack[++top] = v;
//访问结点 v //设置访问标记 //结点 v 入栈
while (top!=-1)
{
v=stack[top];
ArcNode<T> *p = adjlist[v]. firstarc; ①
)
A.1
B. n/2
C.n-1
D.n
解析:若超过 n-1,则路径中必存在重复的顶点
答案:C
(5) 若一个图中包含有 k 个连通分量,若按照深度优先搜索的方法访问所有顶点,则必
须调用(
)次深度优先搜索遍历的算法。
A.k
B.1
C.k-1
D.k+1
解析:一次深度优先搜索可以访问一个连通分量中的所有结点,因此 k 个连通分量需要 调用 k 次深度优先遍历算法。
④
} if (p==NULL) top--;
⑤//若是找不到未访问的结点,出栈
2022年北京邮电大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)
2022年北京邮电大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、无向图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,fB.a,c,f,e,b,dC.a,e,b,c,f, dD.a,e,d,f,c,b2、设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储, a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为()。
A.13B.33C.18D.403、某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。
A.单链表B.仅有头指针的单循环链表C.双链表D.仅有尾指针的单循环链表4、最大容量为n的循环队列,队尾指针是rear,队头:front,则队空的条件是()。
A.(rear+1)MOD n=frontB.rear=frontC.rear+1=frontD.(rear-1)MOD n=front5、下列关于AOE网的叙述中,不正确的是()。
A.关键活动不按期完成就会影响整个工程的完成时间B.任何一个关键活动提前完成,那么整个工程将会提前完成C.所有的关键活动提前完成,那么整个工程将会提前完成D.某些关键活动若提前完成,那么整个工程将会提前完成6、下列关于无向连通图特性的叙述中,正确的是()。
Ⅰ.所有的顶点的度之和为偶数Ⅱ.边数大于顶点个数减1 Ⅲ.至少有一个顶点的度为1A.只有Ⅰ B.只有Ⅱ C.Ⅰ和Ⅱ D.Ⅰ和Ⅲ7、若一棵二叉树的前序遍历序列为a,e,b,d,c,后序遍历序列为b, c,d,e,a,则根结点的孩子结点()。
A.只有e B.有e、b C.有e、c D.无法确定8、一棵哈夫曼树共有215个结点,对其进行哈夫曼编码,共能得到()个不同的码字。
算法与数据结构习题及参考答案
算法与数据结构习题及参考答案一、选择题1. 在算法分析中,时间复杂度表示的是:A. 算法执行的时间B. 算法的运行速度C. 算法执行所需的操作次数D. 算法的内存消耗答案:C2. 哪种数据结构可以在常数时间内完成插入和删除操作?A. 数组B. 栈C. 队列D. 链表答案:B3. 单链表的逆置可以使用哪种算法实现?A. 冒泡排序B. 归并排序C. 快速排序D. 双指针法答案:D4. 常用的查找算法中,哪种算法的时间复杂度始终为O(log n)?A. 顺序查找B. 二分查找C. 广度优先搜索D. 深度优先搜索答案:B5. 哪种排序算法的时间复杂度最坏情况下仍为O(n log n)?A. 冒泡排序B. 插入排序C. 快速排序D. 堆排序答案:C二、填空题1. 下面哪个数据结构先进先出?A. 栈B. 队列C. 堆D. 链表答案:B2. 在快速排序的基本步骤中,需要选取一个元素作为________。
答案:枢纽元素3. 广度优先搜索使用的数据结构是________。
答案:队列4. 二分查找是基于_________的。
答案:有序数组5. 哈希表的查找时间复杂度为_________。
答案:O(1)三、解答题1. 请简要说明冒泡排序算法的原理及时间复杂度。
答:冒泡排序是一种简单直观的排序算法。
它的基本思想是通过相邻元素之间的比较和交换来将最大(或最小)的元素逐渐“冒泡”到数列的一端。
冒泡排序的过程如下:1)比较相邻的元素,如果前面的元素大于后面的元素,则交换它们的位置;2)对每一对相邻元素重复进行比较和交换,直到最后一对元素;3)针对剩下的元素重复上述步骤,直到整个数列有序。
冒泡排序的时间复杂度为O(n^2),其中n为待排序数列的长度。
在最坏情况下,冒泡排序需要进行n-1次比较和交换操作,因此时间复杂度为O(n^2)。
在最好情况下,如果待排序数列已经有序,冒泡排序只需进行n-1次比较,没有交换操作,时间复杂度为O(n)。
(完整word)北邮C++数据结构课后习题 习题4参考答案
习题41.填空题(1)已知二叉树中叶子数为50,仅有一个孩子的结点数为30,则总结点数为(___________)。
答案:129(2)4个结点可构成(___________)棵不同形态的二叉树。
答案:12(3)设树的度为5,其中度为1~5的结点数分别为6、5、4、3、2个,则该树共有(___________)个叶子。
答案:31(4)在结点个数为n(n〉1)的各棵普通树中,高度最小的树的高度是(___________),它有(___________)个叶子结点,(___________)个分支结点。
高度最大的树的高度是(___________),它有(___________)个叶子结点,(___________)个分支结点。
答案:2 n—1 1 n 1 n-1(5)深度为k的二叉树,至多有(___________)个结点。
答案:2k-1(6)有n个结点并且其高度为n的二叉树的数目是(___________)。
答案:2n—1(7)设只包含根结点的二叉树的高度为1,则高度为k的二叉树的最大结点数为(___________),最小结点数为(___________)。
答案:2k-1 k(8)将一棵有100个结点的完全二叉树按层编号,则编号为49的结点为X,其双亲PARENT(X)的编号为().答案:24(9)已知一棵完全二叉树中共有768个结点,则该树中共有(___________)个叶子结点。
答案:384(10)已知一棵完全二叉树的第8层有8个结点,则其叶子结点数是(___________).答案:68(11)深度为8(根的层次号为1)的满二叉树有(___________)个叶子结点。
答案:128(12)一棵二叉树的前序遍历是FCABED,中序遍历是ACBFED,则后序遍历是(___________).答案:ABCDEF(13)某二叉树结点的中序遍历序列为ABCDEFG,后序遍历序列为BDCAFGE,则该二叉树结点的前序遍历序列为(___________),该二叉树对应的树林包括(___________)棵树。
北邮数据结构与算法课后答案 第7章
于 n/2 则在后半区间继续查找。
int fun (Stable *L, int low, int high)
/*以第一个元素为基准分割下标在区间[low, high]内的元素序列*/
{L->elem[0]=L->elem[low] ;
K=L->elem[0].key;
while(low<high)
第7章
1.选择题
(1)A (2)C (3)C (4)D (5)D (6)C (7)B (8)C (9)D (10)C
2.判断题
(1)√ (2)Ⅹ (3)√ (4)Ⅹ (5)Ⅹ (6)√ (7)Ⅹ (8)√ (9)√ (10)√
3.简答题
(1)以关键字序列(tim,kay,eva,roy,dot,jon,kim,ann,tom,jim,guy,amy)为例,手工执行以下排序算法
j++;
}
} 4.已知记录序列 a[1..n]中的关键字各不相同,可按如下所述实现计数排序:另设数组 c[1..n],对每个 记录 a[i],统计序列中关键字比它小的记录个数存于 c[i],则 c[i]=0 的记录必为关键字最小的记录,然后依 c[i]值的大小对 a 中记录进行重新排列,试编写实现上述排序的算法。
{if (max=i) {w=r[min];r[min]=r[n-i+1];r[N-i+1]=w;} else {w=r[max];r[max]=r[n-i+1];r[N-i+1]=w;}
} i++; } } 【解答】这是一个双向选择排序算法,每次选择关键码最小的记录放在前面,同时选择关键码最大的记录 放在后面。比较 n*(n-1)/2 次。最好情况移动记录 0 次,最坏情况大约移动记录 3n 次。 (6)请回答以下关于堆的问题: 1)堆的存储结构是顺序的,还是链式的? 2)设有一个大顶堆,即堆中任意结点的关键码均大于它的左孩子和右孩子的关键码。其具有最大 值的元素可能在什么地方? 3)对 n 个元素进行初始建堆的过程中,最多做多少次数据比较? 【解答】1)堆的存储结构是顺序的。 2)堆顶。 3)不超过 4n。
北邮数据结构与算法课后答案第7章
北邮数据结构与算法课后答案第7章第7章1.选择题(1)A (2)C (3)C (4)D (5)D (6)C (7)B (8)C (9)D (10)C2.判断题(1)√ (2)Ⅹ (3)√ (4)Ⅹ (5)Ⅹ (6)√ (7)Ⅹ (8)√ (9)√ (10)√3.简答题(1)以关键字序列(tim,kay,eva,roy,dot,jon,kim,ann,tom,jim,guy,amy)为例,手工执行以下排序算法(按字典序比较关键字的大小),写出每一趟排序结束时的关键字状态:1)直接插入排序;2)冒泡排序;3)直接选择排序;4)快速排序;5)归并排序;6)基数排序。
【解答】略。
(2)已知序列{50,18,12,61,8,17,87,25},请给出采用堆排序对该序列做升序排序时的每一趟结果。
【解答】堆排序过程如下图示:1887 12178255061618712178185025(3)有n个不同的英文单词,它们的长度相等,均为m,若n>>50,m<5,试问采用什么排序方法时间复杂度最小?为什么?【提示】采用基数排序。
基数排序是一种借助多关键码排序思想对单关键码进行排序的方法,它适合n很大,而关键码较小的序列。
本题中英文单词数目n>>50,而单词长度m<5,因此采用基数排序方法最佳。
(4)如果只想得到一个含有n个元素的序列中第k(k<<n)小元素之前的部分排序序列,最好采用什么排序方法?为什么?如有这样一个序列:{57,11,25,36,18,80,22}得到其第3个最小元素之前的部分序列{11,18,22},使用所选择的算法实现时,要执行多少次比较?< p="">【解答】采用堆排序。
简单选择排序和冒泡排序可以在一趟排序后选出一个最大(或最小)元素,要比较n-1次,选次大元素要再比较n-2次,…其时间复杂度是O(n2)。
当k<<n时,从n个元素中选k 个元素不能使用这种方法。
北邮计算机统考试题及答案
北邮计算机统考试题及答案1. 数据结构与算法1.1 简述栈和队列的定义及其主要特点。
栈是一种数据结构,遵循后进先出(LIFO)的原则。
其主要特点是只能在栈顶进行插入和删除操作。
栈的插入操作称为入栈(push),删除操作称为出栈(pop)。
例如,在程序执行中,函数调用和递归调用的栈帧可以通过栈的方式实现。
队列也是一种数据结构,遵循先进先出(FIFO)的原则。
它的主要特点是只能在队尾进行插入操作,在队头进行删除操作。
队列的插入操作称为入队(enqueue),删除操作称为出队(dequeue)。
例如,在操作系统的进程调度中,可以使用队列来实现进程的排队执行。
1.2 常见的排序算法有哪些?简单描述它们的实现原理。
常见的排序算法有冒泡排序、选择排序、插入排序、快速排序和归并排序。
冒泡排序是通过相邻元素的比较和交换来实现的,每次循环找出当前未排序部分的最大值,并将其放置在已排序部分的末尾。
选择排序通过在未排序部分选择最小(或最大)的元素,将其与未排序部分的第一个元素交换位置,实现逐渐将未排序部分的最小(或最大)元素放置到已排序部分的末尾。
插入排序通过将未排序部分的元素逐个插入到已排序部分的适当位置来实现排序。
可以将未排序部分的元素与已排序部分的元素逐个比较并移动,直到找到合适的位置。
快速排序通过选择一个基准元素,将数组分成两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素。
然后递归地对两个子数组进行快速排序。
归并排序是将两个有序子数组合并成一个有序数组的过程。
通过不断地将数组进行二分,直到只剩下一个元素。
然后将两个只有一个元素的子数组进行合并,直到最终完成整个数组的排序。
1.3 列举几种常用的查找算法,并简述它们的实现原理。
常用的查找算法有线性查找、二分查找、哈希查找和二叉查找树。
线性查找是从列表的开头开始,逐个比较每个元素,直到找到目标元素或遍历完整个列表。
二分查找是在有序数组中通过比较目标值和数组中间元素的大小来实现的。
北邮C++数据结构课后习题 习题6参考答案
习题61.填空题(1)由10000个结点构成的二叉排序树,在等概率查找的条件下,查找成功时的平均查找长度的最大值可能达到(___________)。
答案:5000.5(2)长度为11的有序序列:1,12,13,24,35,36,47,58,59,69,71进行等概率查找,如果采用顺序查找,则平均查找长度为(___________),如果采用二分查找,则平均查找长度为(___________),如果采用哈希查找,哈希表长为15,哈希函数为H(key)=key%13,采用线性探测解决地址冲突,即d i=(H(key)+i)%15,则平均查找长度为(保留1位小数)(___________)。
答案:6,3,1.6(3)在折半查找中,查找终止的条件为(___________)。
答案:找到匹配元素或者low>high?(4)某索引顺序表共有元素275个,平均分成5块。
若先对索引表采用顺序查找,再对块元素进行顺序查找,则等概率情况下,分块查找成功的平均查找长度是(___________)。
答案:31(5)高度为8的平衡二叉树的结点数至少是(___________)。
答案: 54 计算公式:F(n)=F(n-1)+F(n-2)+1(6)对于这个序列{25,43,62,31,48,56},采用的散列函数为H(k)=k%7,则元素48的同义词是(___________)。
(7)在各种查找方法中,平均查找长度与结点个数无关的查找方法是(___________)。
答案:散列查找(8)一个按元素值排好的顺序表(长度大于2),分别用顺序查找和折半查找与给定值相等的元素,平均比较次数分别是s和b,在查找成功的情况下,s和b的关系是(___________);在查找不成功的情况下,s和b的关系是(___________)。
答案:(1)(2s-1)b=2s([log2(2s-1)]+1)-2[log2(2s-1)]+1+1(2)分两种情况考虑,见解答。
北邮算法与数据结构复习资料
●(2分)为解决计算机和打印机速度不匹配问题, 通常设置一个打印数据缓冲区, 主机将要输出的数据依次写入缓冲区, 而打印机依次从该缓冲区中取出数据. 该缓冲区的逻辑结构应该是?A. 栈B. 队列C. 树D. 图●(2分)设栈S和队列Q 的初始状态均为空, 元素abcdefg 依次进入栈S. 若每个元素出栈后立即进入队列Q. 且7个元素出对的顺序是bdcfeag, 则栈S 的容量至少是?A . 1 B: 2 C. 3 D, 4●(2分)已知完全二叉树的第六层(根节点视为第一次)有8个节点. 则此完全二叉树节点个数最多为A. 39B. 52C. 111D. 119●将森林转换为对应的二叉树. 若在二叉树中节点u 是节点v 的父节点的父节点. 则在原来的森林中, u与v 的可能关系为甲) 父子关系. 乙)兄弟关系丙) u 的父节点与v 的父节点是兄弟关系A. 只有甲B. 甲和乙C. 甲和丙 D 甲乙丙●下面关于无向连通图特性的叙述中, 正确的是:甲) 所有定点度数之和为偶数. 乙) 边数大于顶点个数减1丙) 至少有一个顶点的度为1.A. 只有甲B.只有乙C.甲和乙D.甲和丙参考答案:1)B 2)C 3)D 4)B 5)C 6)B 7) A●下面叙述中, 不符合m阶B树定义要求的是:A. 根节点最多有m棵子树B.所有叶节点都在同一层上.C.各节点内关键字均升序或降序排列D. 叶节点之间通过指针链接.●已知关键字序列5, 8, 12, 19, 28, 20, 15, 22 为极小堆(小根堆, 最小堆). 添加关键字3调整后得到的极小堆是:A. 3,5,12,8,28,20,15,22,19B. 3,5,12,19,20,15,22,8,28C. 3,8,12,5,20,15,22,28,19D. 3,12,5,8,28,20,15,22,19●若数据元素序列11,12,13,7,8,9,23,4,5 是采用下列排序算法之一得到的第二趟排序后的结果, 则该排序算法只能是:A. 冒泡排序B. 插入排序C.选择排序D.二路归并排序●如元素abcdef 依次进栈, 允许进栈出栈操作交替进行, 但不允许连续三次退栈. 则不可能得到的出栈序列为:A. dcebfaB. cbdaefC.bcaefdD. afedcb●某队列允许在其两端进行入队操作, 但仅允许在一端进行出队操作. 若元素abcde 依次入队后再进行出队操作, 则不可能的出队序列为A. bacdeB. dbaceC.dbcaeD. ecbad●参考答案:1)D 2)A 3)B 4) D 5)CCBACBB●采用递归方式对顺序表进行快速排序. 下列关于递归次数的叙述中, 正确的是:A. 递归的次数与初始数据的排列次序无关.B. 每次划分后先处理较长的区间可以减少递归次数;C. 每次划分后先处理较短的区间可以减少递归次数;D. 递归次数与处理划分后得到的区间的次序无关.●对一组数据(2,12,16,88,5,10)进行排序. 如果前三趟排序结果如下第一趟(2,12,16,5,10,88)第二趟(2,12,5,10,16,88)第三趟(2,5,10,12,16,88)则采用的排序算法可能是:A. 冒泡排序B. 希尔排序C.归并排序D. 基数排序DA1.()数据的逻辑结构是指数据的各数据项之间的逻辑关系。
北邮C++数据结构课后习题 习题5参考答案
习题51.填空题(1)n个顶点的无向图,最多能有(___________)条边。
答案:[n*(n-1)]/2(2)有n个顶点的强连通图G至少有(___________)条弧。
答案:n(3)G为无向图,如果从G的某个顶点出发,进行一次广度优先遍历,即可访问图的每个顶点,则该图一定是(___________)图。
答案:连通(4)若采用邻接矩阵结构存储具有n个顶点的图,则对该图进行广度优先遍历的算法时间复杂度为(___________)。
答案:O(n2)(5)n个顶点的连通图的生成树有(___________)条边。
答案:n-1(6)图的深度优先遍历类似于树的(___________)遍历;图的广度优先遍历类似于树的(___________)遍历。
答案:前序层序(7)对于含有n个顶点e条边的连通图,用普里姆算法求最小生成树的时间复杂度为(___________)。
答案:O(n2)(8)已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为(___________)。
答案:O(n+e)(9)一棵具有n个顶点的生成树有且仅有(___________)条边。
答案:n-12.单选题(1)在一个无向图中,所有顶点的度数之和等于所有边数的()倍。
A. 1/2B. 1C. 2D. 4(2)在一个具有n个顶点的有向图中,若所有顶点的出度数之和为S,则所有顶点的度数之和为()。
A. SB. S-1C. S+1D. 2S(3)具有n个顶点的有向图最多有()条边。
A. nB. n(n-1)C. n(n+1)D. 2n(4)在一个无向图中,所有顶点的度数之和等于所有边数的()倍。
A.3B.2C.1D.1/2(5)若一个图中包含有k个连通分量,若按照深度优先搜索的方法访问所有顶点,则必须调用()次深度优先搜索遍历的算法。
A. kB. 1C. k-1D. k+1(6)若一个图的边集为{<1,2>,<1,4>,<2,5>,<3,1>,<3,5>,<4,3>},则从顶点1开始对该图进行深度优先遍历,得到的顶点序列可能为()。
算法与数据结构试题与答案
A.5
B.6
C.7
D.8
二、填空题(每空 1 分,共 26 分)
1. 通常从四个方面评价算法的质量: _________、 _________、 _________ 和_________。 2. 一个算法的时间复杂度为 (n3 +n 2log 2 n +14 n)/ n 2,其数量级表示为 ________。
3. 以下数据结构中哪一个是非线性结构? ( )
A. 队列
B. 栈
C. 线性表
D. 二叉树
4. 设有一个二维数组 A[m ][ n ],假设 A[0][0] 存放位置在 644 (10) , A[2][2] 存放位置在
676 (10) ,每个元素占一个空间, 问 A[3][3] (10) 存放在什么位置?脚注 (10) 表示用 10 进
素的前一位置,尾指针 R 总是指向队尾元素的当前位置,则该循环队列中的元素个数为
( )。
(A) R-F
(B) F-R
(C) (R-F+M) % M (D) (F-R+M) % M
4 .设某棵二叉树的中序遍历序列为 ABCD ,前序遍历序列为 CABD ,则后序遍历该二叉树
得到序列为( )。
(A) BADC
3. 假定一棵树的广义表表示为 A( C,D ( E,F , G),H ( I ,J )),则树中所含的结点数
为 __________ 个,树的深度为 ___________,树的度为 _________。
4. 后缀算式 9 2 3 +- 10 2 / - 的值为 __________。中缀算式( 3+4X ) -2Y/3 对应的后缀
else {
if (item==BST->data){
北邮C++数据结构课后习题 习题3参考答案
习题31.填空题(部分答案)(1)栈的进出原则是(___________),队列的进出原则是(___________)。
答案:后进先出(LIFO)先进先出(FIFO)(2)设32位计算机系统中,空栈S存储int型数据,栈顶指针为1024H。
经过操作序列push(1),push(2),pop,push(5),push(7),pop,push(6)之后,栈顶元素为(___________),栈底元素为(___________),栈的高度为(___________),输出序列是(___________),栈顶指针为(___________)H。
答案:6 1 3 2,7 1030(3)两栈共享存储空间,其数组大小为100,数组下标从0开始。
top1和top2分别为栈1和栈2的栈顶元素下标,则栈1为空的条件为(___________),栈2为空的条件为(___________),栈1或栈2满的条件为(___________)。
答案:top1==-1 top2==100 top1+1==top2(4)一个队列的入队顺序是1234,则队列的输出顺序是(___________)。
答案:1234(5)设循环队列数组大小为100,队头指针为front,队尾指针为rear;约定front指向队头元素的前一个位置,该位置永远不存放数据。
则入队操作时,修改rear=(___________),出队操作修改front=(___________),队空的判别条件为(___________),队满的判别条件为(___________)。
若front=20,rear=60,则队列长度为(___________),若front=60,rear=20,则队列长度为(___________)。
答案:(rear+1)%100 (front+1)%100 rear==front (rear+1)%100=front 40 60(6)朴素模式匹配算法中,每个串的起始下标均为1,变量i=100,j=10,分别表示主串和模式串当前比较的字符元素下标,若本次比较两字符不同,则i回溯为(___________),j 回溯为(___________)。
数据结构课后答案_北邮
(5)顺序表多采用(___________)实现的,是一种随机存取结构,对表中任意结点存取操作的时间复杂度为(___________)。而查找链表中的结节,需要从头指针起顺着链扫描才能得到,平均时间复杂度为(___________)。因此,若线性表的操作主要是进行查找,很少进行插入或删除操作时,采用(___________)表比较合适。
#include"vector"
usingstd::vector;
//定义自然数类classNatural Nhomakorabeaumber{
public:
NaturalNumber(unsignedlongintn=0):num(n){}
unsignedlongintGreatestCommonDivisor(NaturalNumber & nn);//求解最大公约数
C.随机存取顺序存取D.索引存取散列存取
(2)在双向链表p所指结点之前插入s所指结点的操作是()。
A. p->left=s; s->right=p; p->left->right =s; s->left=p->left;
B. p->right=s; p->right->left=s; s->left=p; s->right=p->right;
m = n; n = r; r = m % n;
}
returnn;
}
//返回最大公约数
unsignedlongintNaturalNumber :: GreatestCommonDivisor(NaturalNumber & nn)
{
returnEUCLID(nn);
北邮C++数据结构课后习题 习题2参考答案
习题21.填空题(1)在一个单链表中,已知每个结点包含data和next两个域,q所指结点是p所指结点的直接前驱,若在q和p之间插入s所指结点,则执行(___________)和(___________)操作。
答案:q->next = s; s->next = p; 或s->next=q->next; q->next = s;(2)表长为n的顺序表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均个数为(___________),删除一个元素需要移动元素的平均个数为(___________)。
答案:n/2 (n-1)/2(3)表长为0的线性表称为(___________)。
答案:空表(4)动态内存管理是操作系统的基本功能之一,其作用是响应用户程序对内存的(___________)和(___________)请求。
答案:申请释放(5)顺序表多采用(___________)实现的,是一种随机存取结构,对表中任意结点存取操作的时间复杂度为(___________)。
而查找链表中的结节,需要从头指针起顺着链扫描才能得到,平均时间复杂度为(___________)。
因此,若线性表的操作主要是进行查找,很少进行插入或删除操作时,采用(___________)表比较合适。
答案:数组 O(1) O(n) 顺序(6)在链表某个位置上进行插入和删除操作,只需要修改(___________)即可,而无须移动大量元素,操作的时间复杂度为(___________)。
而在顺序表中进行插入和删除操作,往往要移动大量元素,平均移动元素的数目为(___________),平均时间复杂度为(___________)。
因此,若对线性表进行频繁的插入和删除操作时,采用(___________)表相对合适。
若插入和删除主要发生在表头和表尾,则采用(___________)表更为合适。
北邮C++数据结构课后习题 习题7参考答案
(5)对n个待排序元素序列进行快速排序,所需最好时间是(___________),最坏时间是(___________)。
答案:O(nlogn) O(n2)
(6)利用简单选择排序对n个元素进行排序,最坏情况下,元素交换的次数为(___________)。
答案:n-1
(7)如果将序列{50,16,23,68,94,70,73}建成堆,只需把16与(___________)交换。
答案:50
(8)对于键值序列{12,13,11,18,60,15,7,18,25,100},用筛选法建堆,必须从键值为(___________)的结点开始。
答案:60
(9)采用改进的冒泡排序对有n个记录的表A按键值递增排序,若L的初始状态是按键值递增,则排序过程中记录的比较次数为(___________)。若A的初始状态为递减排序,则记录的交换次数为(___________)。
(1)(19,78,32,66,26,58,46,95,89,31);
(2)(113,98,69,35,68,25,43,19,6,31,58,46,95,89,78)
(2)(16,19,25,31,55,29,43,35,113,98,68,69)
A.插入B.冒泡C.二路归并D.堆
(10)就平均性能而言,最快的排序方法是()。
A.冒泡排序B.希尔排序C.快速排序D.插入排序
(11)下面哪一种排序算法是基于比较的排序()。
A.计数排序B.桶排序C.基数排序D.插入排序
3.判断以下序列是否为小(顶)根堆?若否,则以最少的移动次数将他们调整为小(顶)根堆。(要求画出最后的堆结构和线性序列)
A. {38,46,79,56,40,84}B. {38,79,56,46,40,84}
北邮C++数据结构课后习题 习题3参考答案
习题31.填空题(部分答案)(1)栈的进出原则是(___________),队列的进出原则是(___________)。
答案:后进先出(LIFO)先进先出(FIFO)(2)设32位计算机系统中,空栈S存储int型数据,栈顶指针为1024H。
经过操作序列push(1),push(2),pop,push(5),push(7),pop,push(6)之后,栈顶元素为(___________),栈底元素为(___________),栈的高度为(___________),输出序列是(___________),栈顶指针为(___________)H。
答案:6 1 3 2,7 1030(3)两栈共享存储空间,其数组大小为100,数组下标从0开始。
top1和top2分别为栈1和栈2的栈顶元素下标,则栈1为空的条件为(___________),栈2为空的条件为(___________),栈1或栈2满的条件为(___________)。
答案:top1==-1 top2==100 top1+1==top2(4)一个队列的入队顺序是1234,则队列的输出顺序是(___________)。
答案:1234(5)设循环队列数组大小为100,队头指针为front,队尾指针为rear;约定front指向队头元素的前一个位置,该位置永远不存放数据。
则入队操作时,修改rear=(___________),出队操作修改front=(___________),队空的判别条件为(___________),队满的判别条件为(___________)。
若front=20,rear=60,则队列长度为(___________),若front=60,rear=20,则队列长度为(___________)。
答案:(rear+1)%100 (front+1)%100 rear==front (rear+1)%100=front 40 60(6)朴素模式匹配算法中,每个串的起始下标均为1,变量i=100,j=10,分别表示主串和模式串当前比较的字符元素下标,若本次比较两字符不同,则i回溯为(___________),j 回溯为(___________)。
北邮数据结构期末试题与答案
试卷四一. 填空题(22 分,每空 1 分)1.设待处理的问题规模为n,若一个算法的时间复杂度为一个常数,则表示为(),若一个算法的执行次数为n*log25n,则时间复杂度表示为()。
2.数据的逻辑结构主要分为()、()、()和()四种。
3.一棵度为3 的树,若度为1 的结点有5 个,度为2 的结点有8 个,度为3 的结点有12 个,则该树有()叶子结点。
4.设一个空栈,栈顶指针为1000H,若有输入序列为1、2、3、4、5,经过push、push、pop、push、pop、push、push 后,输出序列是(),若输入的每个数占4 个字节的空间,则栈顶指针为()H。
5.按照()遍历二叉排序树得到的序列是一个有序序列。
6.若哈夫曼树一共有n 个叶子结点,则该哈夫曼树总结点数为()。
7.设C++中存储三维数组A mnp,则第一个元素为a000,若按行优先存储,则a ijk 前面共有()个元素;若按列优先存储,则a ijk 前面共有()个元素。
8.设8 行8 列的二维数组起始元素为A[0][0],按行优先存储到起始元素下标为0 的一维数组B 中,则元素A[5][3]在B 数组中的位置为B[()]。
9.图的深度优先遍历类似于树的()遍历,它所用的数据结构是(),图的广度优先遍历类似于树的()遍历,使用的数据结构是()。
10.设无向图G 中顶点数为n,则图G 至少有()边,至多有()边;若G 为有向图,则至少有()弧,至多有()弧。
二. 单选题(23 分,每空 1 分)1.顺序表是一种采用()存取方式的()存储结构,链表是一种采用()存取方式的()存储结构。
A.顺序B. 随机C.链式D. 有序2.STL 中最常用的用于处理顺序表问题的容器是(),STL 中用于处理链表问题的容器是()。
A. vectorB. mapC. listD.stack3.长度为20 的有序序列,采用折半查找,共有()个元素的查找长度为3。
北邮数据结构与算法课后答案 第6章
void PrintNode (BiSTree T)
{if(T)
{PrintNode(T->rchild);
printf( T->data) ;
PrintNode(T->lchild);
}
} 5.已知一棵二叉排序树上所有关键字中的最小值为-max,最大值为 max,又知-max<x<max。编写递 归算法,求该二叉排序树上的小于 x 且最靠近 x 的值 a 和大于 x 且最靠近 x 的值 b。 【提示】解决本题的关键是递归函数的参数设置,采用逐渐缩小查找区间的方法来实现。
ASLSUCC=(1+2+…+12)/12=6.5 这种情况就退化成为顺序查找。
(3)试推导含有 12 个结点的平衡二叉树的最大深度,并画出一棵这样的树。 令 Fk 表示含有最少结点的深度为 k 的平衡二叉树的结点数目。那么,可知道 F1=1,F2=2,.....Fn=Fn-2+Fn-1+1. 含有 12 个结点的平衡二叉树的最大深度为5.例如:
typedef struct BiTNode
{datatype data;
int lsize;
struct BiTNode *lchild, *rchild; }BiTNode ,*BiTree;
/*增设 lsize 域的二叉树的类型定义*/
BiTree Index (BiTree T, int k)
/*结点的平衡因子*/ /*带平衡因子域的平衡二叉树的类型定义*/ /*求平衡二叉树 T 的高度*/
p=t;
while(p) {level++; if(p->bf<0) p=p->rchild; else p=p->lchild; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业参考答案一、(带头结点)多项式乘法 C = A×B:void PolyAdd ( list &C, list R) // R 为单个结点{p=C;while ((!p->next) && (p->next->exp>R->exp)) p=p->next; if ((p->next) || (p->next->exp<R->exp)){ R->next=p->next; p->next=R; } else{ p->next->inf += R->inf; delete R;if ( ! p->next->inf ){ R=p->next; p->next=R->next; delete R; }}}void PolyMul ( list A, list B, list &C ){C=new struct node; C->next=NULL; q=B->next;While ( q ){p=A->next;while ( p ){r = new struct node; r->exp = p->exp + q->exp;r->inf = p-> inf * q->inf; PolyAdd(C, r);p=p->next;}q=q->next;}}二、梵塔的移动次数:已知移动次数迭代公式为: M ( n ) = 2M ( n-1 ) + 1初值为: M ( 0 ) = 0则: M ( n ) = 2 ( 2M ( n-2 ) + 1 ) + 1 = 4M ( n-2 ) + 3= 8M ( n-3 ) + 7= 2i M ( n-i ) + 2i– 1若n=i ,则M ( n-n ) = 0,故:M ( n ) = 2n M ( n-n ) + 2n– 1 = 2n– 1所以,梵塔的移动次数为2n– 1次。
三、简化的背包问题:void Pack ( int m, int i, int t ) // 初始值为: 1 1 t {for ( k=i; k<=n; k++ ){solution[m] = weight[k];if ( t == weight[k] ){for ( j=1; j<=m; j++ ) cout<<solution[j]; cout<<endl;} else if ( t > weight[k] ) Pack ( m+1, k+1, t - weight[k] );}}四、判断括号是否配对:int Correct ( string s ){Inistack(Q);for ( i=0; s[i] == ‘=’; i++ ) // 表达式以‘=’结束{switch ( s[i] ){case ‘(’:case ‘[’:case ‘{’:Push ( Q, s[ i ] ); break;case ‘)’:case ‘]’:case ‘}’:if ( Empty(Q)) return 0; t=Pop(Q);if ( ! Matching( t, s[i] )) return 0;}}if ( ! Empty(Q) ) return 0;return 1;}五、堆栈可能的输出:12341243 1324 1342 1423 143221342143 2314 2341 2413 24313124 3142 3214 3241 3412 342141234132 42134231 4312 4321六、用两个堆栈实现一个队列:int FullQ ( ){if (Full (S1) && ! Empty (S2)) return 1; return 0; }int EmptyQ ( ){if ( Empty (S1) && Empty (S2)) return 1; return 0;}void Enqueue ( elemtype x){if (Full(S1)) if (Empty(S2)) while (! Empty (S1)) Push(S2, Pop(S1));if (! Full(S1)) Push(S1, x);}elemtype Dequeue ( ){if (Empty(S2)) while (! Empty(S1)) Push(S2, Pop(S1));if (! Empty(S2)) return Pop(S2);}七、生成新串及字符第一次出现位置:int Index ( string S, string T ){for ( i=1; i + Len(T)-1<=Len(S); i++ )if Equal ( Sub ( S, I, Len (T)), T ) return i;return 0;}void CreatNewStr ( string S, string T, string R, arrant P){R=“”; j=0;for ( i=1; i<=Len(S); i++ ){ch=Sub( S, i, 1 );if ( ! Index(T, ch) && ! Index(R, ch) ){ R=Concat(R, ch); P[j++]=i; }}}八、块链字符串插入:{为避免字符串部块间大量的数据移动,最好的方法是定义两种字符串中不出现的字符作为空标记和串结束标记,如‘#’和‘$’;也可只使用空标记,串结束以块尾指针为空表示,其算法如下:void Insert ( string S, string T, char ch) // 设块大小为m{i=0; p=T;while ((p->next) && (! i)){for ( j=1; j<=m; j++ ) if (p->str[j]==ch) i=j;if (! i) p=p->next;}if (! i) for ( j=1; j<=m; j++ ) if (p->str[j]==ch) i=j;if (! i) p->next=S; else // S插在T后{ // ch所在结点分裂,S插在T中分裂的两结点间q= new struct node; q->str=p->str; q->next=p->next;for ( j=i; j<=m; j++ ) p->str[j]= ‘#’; p->next=S;for ( j=1; j<i; j++ ) q->str[j]= ‘#’; p=S;while ( p->next ) p=p->next; p->next=q;}}九、上三角矩阵的存储:k= (i-1)*n+j-i*(i-1)/2=(2n-i+1)*i/2+j-nf1=(2n-i+1)*i/2f2=jc=-n十、循环右移k位:1 2 3 4 5 6 7 8 (n=8, k=3)67 8 1 2 3 4 587 6 5 4 3 2 1void Exch ( arrtype A, int st, int ed ){for ( i=st; i<=(st+ed) / 2; i++ ) A[i]←→A[ed-i+1];}void Shift ( arrtype A, int k, int n ){Exch(A, 1, n);Exch(A, 1, k);Exch(A, k+1, n)}十一、广义表运算结果:1、(a,b)2、((c,d))3、(c,d)4、(b)5、b6、(d)十二、利用广义表运算取出c 原子:1、Head(Tail(Tail(L1)))2、Head(Head(Tail(L2)))3、Head(Head(Tail(Tail(Head(L3)))))4、Head(Head(Head(Tail(Tail(L4)))))5、Head(Head(Tail(Tail(L5))))6、Head(Tail(Head(L6)))7、Head(Head(Tail(Head(Tail(L7)))))8、Head(Head(Tail(Head(Tail(L8)))))十三、满k 叉树问题:1、k n-12、n=1无父结点,否则为3、(n-1)k+1+i4、(n-1) Mod k ≠0十四、叶子结点数目:n 0=∑(i-1)n i +1十五、找最近共同祖先:bitptr Forefather ( bitptr root, bitptr p, bitptr q ) {find = 0; // 0---p 、q 都未找到; >0---找到一个; -1---都找到了INIT ( ff ); {定义一个数组 ff 用于记录查找路径}Fff ( root, p, q, 0, ft );return ft;}n-2+k k i=1 mvoid Fff (bitptr root, bitptr p, bitptr q, int m, bitptr &ft){if ( root && ( find >= 0 )){m = m+1;if ((root==p) || (root==q)) if (! find) find = m-1; else{ft = ff [ find ];find = -1;}ff [m] = root;Fff ( root->lc, p, q, m, ft );Fff ( root->rc, p, q, m, ft );if (m==find) find = m-1;}}十六、求树的直径等:void High ( bitptr t, int *hi, Arrtype path ){*hi = 0;INIT ( p ); {定义数组 p 动态存储路径}Hhh ( t, 1, hi, path);}void Hhh( bitptr t, int level, int *hi, Arrtype path ){if ( t ){p [ level ] = t->data;if ( ! t->lc && ! t->rc ) if ( level>hi ) {hi = level;for (i=1 ; i<=level ; i++) path[i] = p[i];}Hhh ( t->lc, level+1, hi, path );Hhh ( t->rc, level+1, hi, path );}}十七、输出中缀表达式并加上括号:void Expout ( tree t ){if ( ! t ){if ( t->lchild)if ((( t->lchild->data==‘+’)||(t->lchild->data== ‘-’)) && (( t ->data==‘*’)||(t->data==‘/’))){cout<<‘(’; Expout ( t->lchild ); cout<<‘)’;} else Expout ( t->lchild );cout<<t->data );if (t->rchild)if (( t->data==‘*’)||(t->data==‘/’)){cout<<‘(’; Expout ( t->rchild ); cout<<‘)’;} else Expout ( t->rchild );}}十八、建立二叉树:void Creat_bintree ( bitptr &t, int i, string s ){ // i 为输入字符串的当前指针,初值为 1 }if (s[i]==’#’){t = NULL;i++;} else{t = new struct node;t->data = s[i];i++;if (( i >Length(s)) || (s[i]!= ‘(’ )){t->lc = t->rc = NULL;return;}i++; {去左括号}Creat_bintree ( t->lc, i, s); {建左子树}i++; {去逗号}Creat_bintree ( t->rc, i, s); {建右子树}i++; {去右括号}}}十九、按凹入表方式打印树:void Print_tree ( bitptr t ){Prt ( t, 1)}void Prt ( bitptr t, int level ){if ( t ){Prt ( t->rc, level+1);for ( int i=1 ; i<=level ; i++ ) cout << ‘’; cout << t->data;Prt ( t->lc, level);}}二十、判断是否存在长度为 k 的简单路经:void SearchPath ( int v, int vt, int k, int m ){ //存储结构可选用邻接矩阵,路径从vs出发,到vt结束,长度为kvisited[v] = TRUE;P[m] = v;if ( v==vt ){if ( m == k+1 ){for ( i =1 ; i <= m ; i++ ) cout << P[i];cout << endl;}} else{w = FirstAdj ( v );while ( w ){if ( ! visited[w] ) SearchPath(w, vt, k, m+1);w = NextAdj ( v, w );}}visited[v] = FALSE;}二十一、求所有简单回路:void SearchCycle ( int v, int m ){ // 存储结构可选用邻接矩阵visited[v] = TRUE;P[m] = v;w = FirstAdj ( v );while ( w ){if ( ! visited[w] ) SearchCycle(w, m+1); else{for ( j = 1 ; P[j]==w ; j++);for ( i =j ; i <= m ; i++ ) cout << P[i];cout << w << endl;}w = NextAdj ( v, w );}visited[v] = FALSE;}二十二、求最小代价生成树:1、 0 2 3 ∞ ∞ ∞ ∞ ∞ 2 0 ∞2∞ ∞∞ ∞3 ∞ 0 1 ∞ ∞ ∞ ∞ ∞ 2 1 0 24 ∞ ∞∞ ∞ ∞ 2 0 1 2 ∞∞ ∞ ∞ 4 1 0 2 1∞ ∞ ∞ ∞ 2 2 0 3∞ ∞ ∞ ∞ ∞ 1 3 02、二十三、求关键路经和最短路经:1、 a b c d e f g h ive:0 2 3 611 1013 1417 vl: 0 4 3 611 10 13 15 2 2 1 1 2 2 1 117关键路经为:a c d f e g i2、a →b c d e f g h i2(ab) 3(ac) ∞ ∞ ∞ ∞ ∞ ∞3(ac) 4(abd) ∞ ∞ ∞ ∞ ∞4(abd) ∞ ∞ ∞ ∞ ∞7(abde) 8(abdf) ∞ ∞ ∞8(abdf) 9(abdeg) ∞∞ 9(abdeg) 9(abdfh)∞9(abdfh)13(abdegi)11(abdfhi)二十四、边界标识法:1、2、二十五、按访问频度查找:list Search ( list H, keytype K )avav{p = H;q = NULL;while ( p->next && ! q ){if (p->next->key == K){q = p->next;q->freq++;while ((H!=p) && (H->next->freq>=q->freq)) H = H->next;if (H!=p){p->next = q->next;q->next = H->next;H->next = q;}}p = p->next;}return q;}二十六、判断是否二叉排序树:int BST ( bitptr t, bitptr &p ){if ( ! t ) return 1;L = BST ( t->lc , p );D = 1;if ( p && p->data > t->data) else D = 0;p = t;R = BST ( t->rc , p );return L && D && R;}int BinarySortTree ( bitptr t ){p=NULL;return BST ( t , p );}二十七、建立 2-3 树:插入20 插入30 插入50插入52 插入60 插入68插入70 删除50 删除68二十八、散列表:(1):0 1 2 34 5 6 7 8 9 10 11 12 13 14 15 161+2+1+1+1+1+2+4+5+2+5+6 31ASL成功 = —————————————— = ——12 125+4+3+2+1+9+8+7+6+5+4+3+2+1 30ASL不成功 = ———————————————— = ——14 7(2):Aug Jun May NovJul1+2+1+1+1+2+3+1+2+1+2+1 9ASL成功 = —————————————— = ——12 63+1+2+2+1+4+3+3+1+2+1+1+1+1 13ASL不成功 = ———————————————— = ——14 7ASL不成功 = 12/14 (与空指针比较次数不算)?二十九、证明快速排序退化时的时间复杂度:当待排序列有序时,有 T ( n ) = T ( n – 1 ) + n – 1= T ( n – 2 ) + 2 * n – 3= T ( n – 3 ) + 3 * n – 6…= T ( n – i ) + i * n – i * ( i+ 1 ) / 2…= T ( n – n ) + n * n – n * ( n + 1 ) / 2= n * ( n – 1 ) / 2故,此时快速排序的时间复杂度为O ( n 2 )。