北邮算法与数据结构习题参考标准答案
北邮算法与数据结构习题参考答案

北邮算法与数据结构习题参考答案作业参考答案一、(带头结点)多项式乘法 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次。
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,则该二叉树结点的前序遍历序列为(___________),该二叉树对应的树林包括(___________)棵树。
数据结构与算法分析习题与参考答案

大学《数据结构与算法分析》课程习题及参考答案模拟试卷一一、单选题(每题2分,共20分)1. 以下数据结构中哪一个是线性结构?()A. 有向图B.队列C. 线索二叉树D. B树2. 在一个单链表HL中,若要在当前由指针p指向的结点后面插入一个由q指向的结点,则执行如下()语句序列。
A. p=q; p_>n ext=q;B. p_>n ext=q; q_>n ext=p;C. p_>n ext=q _>n ext; p=q;D. q_>n ext=p->n ext; p_>n ext=q;3. 以下哪一个不是队列的基本运算?()A. 在队列第i个元素之后插入一个元素B. 从队头删除一个元素C.判断一个队列是否为空D. 读取队头元素的值4. 字符A、B、C依次进入一个栈,按出栈的先后顺序组成不同的字符串,至多可以组成()个不同的字符串?A. 14B.5C.6D.8由权值分别为3,8,6,2的叶子生成一棵哈夫曼树,它的带权路径长度为()5.A. 11B.35C. 19D. 536.A. E、G F、 A C D BB. E、A、G C F、B、DC. E、A、C、B D G FD. E、G A、C D F、B7.A. A 、B、 C D E、G FB. E 、A、G C F、B、DC. E 、A、C B、D G FE. B D C '、AF、G E以下6-8题基于图1。
该二叉树结点的前序遍历的序列为该二叉树结点的中序遍历的序列为(8.该二叉树的按层遍历的序列为()9.下面关于图的存储的叙述中正确的是 ()。
A .用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关B .用邻接表法存储图,占用的存储空间大小与图中边数和结点个数都有关 C. 用邻接矩阵法存储图,占用的存储空间大小与图中结点个数和边数都有关 D .用邻接矩阵法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关10. 设有关键码序列(q , g , m z , a , n , p , x , h),下面哪一个序列是从上述序列出发建 堆的结果?()A. a , g , h , m n , p , q , x , zB. a ,g , m h , q , n , p , x , zC. g, m, q , a , n , p , x , h , z D. h,g , m p , a , n , q , x , z二、填空题(每空1分,共26分)1.数据的物理结构被分为 、、 和四种。
北邮数据结构与算法课后答案 第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 个元素不能使用这种方法。
数据结构与算法测试题+参考答案

数据结构与算法测试题+参考答案一、单选题(共80题,每题1分,共80分)1、某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用什么存储方式最节省运算时间?A、仅有头指针的单循环链表B、双链表C、仅有尾指针的单循环链表D、单链表正确答案:C2、数据结构研究的内容是()。
A、数据的逻辑结构B、数据的存储结构C、建立在相应逻辑结构和存储结构上的算法D、包括以上三个方面正确答案:D3、下列关于无向连通图特征的叙述中,正确的是:所有顶点的度之和为偶数边数大于顶点个数减1至少有一个顶点的度为1A、只有1B、1和2C、1和3D、只有2正确答案:A4、下面的程序段违反了算法的()原则。
void sam(){ int n=2;while (n%2==0) n+=2;printf(“%d”,n);}A、确定性B、可行性C、有穷性D、健壮性正确答案:C5、对任意给定的含 n (n>2) 个字符的有限集 S,用二叉树表示 S 的哈夫曼编码集和定长编码集,分别得到二叉树 T1 和 T2。
下列叙述中,正确的是:A、出现频次不同的字符在 T2 中处于相同的层B、出现频次不同的字符在 T1 中处于不同的层C、T1 的高度大于 T2 的高度D、T1 与 T2 的结点数相同正确答案:A6、数据序列{ 3,2,4,9,8,11,6,20 }只能是下列哪种排序算法的两趟排序结果?A、快速排序B、选择排序C、插入排序D、冒泡排序正确答案:A7、设散列表的地址区间为[0,16],散列函数为H(Key)=Key%17。
采用线性探测法处理冲突,并将关键字序列{ 26,25,72,38,8,18,59 }依次存储到散列表中。
元素59存放在散列表中的地址是:A、11B、9C、10D、8正确答案:A8、采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是:A、每次划分后,先处理较短的分区可以减少递归次数B、递归次数与每次划分后得到的分区处理顺序无关C、递归次数与初始数据的排列次序无关D、每次划分后,先处理较长的分区可以减少递归次数正确答案:B9、以下数据结构中,()是非线性数据结构。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
四、判断括号是否配对:
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;
if (!i)p=p->next;
}
if (!i)for( j=1;j<=m;j++ )if(p->str[j]==ch)i=j;
}
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
=2iM ( n-i ) + 2i–1
若n=i,则M (n-n)=0,故:M ( n ) =2nM(n-n)+2n–1
if (! i)p->next=S; else//S插在T后
{ //ch所在结点分裂,S插在T中分裂的两结点间
q= newstruct node; q->str=p->str; q->next=p->next;
for(j=i; j<=m; j++)p->str[j]= ‘#’; p->next=S;
}
intEmptyQ ( )
{
if (Empty (S1) &&Empty(S2))return1;return 0;
}
voidEnqueue ( elemtypex)
{
if (Full(S1))if (Empty(S2))while(! Empty (S1))Push(S2,Pop(S1));
if (!Full(S1))Push(S1,x);
return 1;
}
五、堆栈可能的输出:
1234124313241342 14231432
21342143 23142341 24132431
312431423214324134123421
412341324213423143124321
六、用两个堆栈实现一个队列:
intFullQ()
{
if(Full (S1)&&!Empty (S2)) return 1;return0;
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-n
f1=(2n-i+1)*i/2
f2=j
c=-n
}
elemtype Dequeue( )
{
if (Empty(S2))while(!Empty(S1))Push(S2,Pop(S1));
if (! Empty(S2))returnPop(S2);
}
七、生成新串及字符第一次出现位置:
intIndex ( string S,stringT)
{
for (i=1;i+ Len(T)-1<=Len(S); i++ )
十、循环右移k位:
12345 6 78(n=8, k=3)
if (!Index(T,ch)&& ! Index(R,ch) )
{R=Concat(R, ch);P[j++]=i; }
}
}
八、块链字符串插入:
{为避免字符串内部块间大量的数据移动,最好的方法是定义两种
字符串中不出现的字符作为空标记和串结束标记,如‘#’和‘$’;
也可只使用空标记,串结束以块尾指针为空表示,其算法如下:
{
case‘(’:
case‘[’:
case ‘{’:
Push(Q, s[i]);break;
case‘)’:
case‘]’:
case‘}’:
if( Empty(Q))return0;t=Pop(Q);
if(!Matching( t,s[i]))return 0;
}
}
if(! Empty(Q) ) return0;
作业参考答案
一、(带头结点)多项式乘法C= A×B:
void PolyAdd ( list &C,listR)//R为单个结点
{
p=C;
while((!p->next) &&(p->next->exp>R->exp)) p=p->next;
if ((p->next)||(p->next->exp<R->exp))
ifEqual( Sub ( S,I, Len(T)), T) returni;
return0;
}
voidCreatNewStr (stringS, stringT, stringR, arrant P)
{
R=“”; j=0;
for(i=1;i<=Len(S);i++ )
{
ch=Sub( S, i, 1 );
{R->next=p->next;p->next=R;}else
{p->next->inf +=R->inf;deleteR;
if(!p->next->inf)
{ R=p->next;p->next=R->next;delete R;}
}
}
voidPolyMul(listA, list B,list&C)