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

合集下载

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

北邮算法与数据结构习题参考标准答案
}else if( t> weight[k]) Pack( m+1,k+1,t - weight[k] );
}
}
四、判断括号是否配对:
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;

算法与数据结构习题答案

算法与数据结构习题答案

算法与数据结构习题答案.txt机会就像秃子头上一根毛,你抓住就抓住了,抓不住就没了。

我和你说了10分钟的话,但却没有和你产生任何争论。

那么,我们之间一定有个人变得虚伪无比!过错是短暂的遗憾,错过是永远的遗憾。

相遇是缘,相知是份,相爱是约定,相守才是真爱。

3.3 在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素?答:在等概率情况下,顺序表中插入一个结点需平均移动n/2个结点。

删除一个结点需平均移动(n-1)/2个结点。

具体的移动次数取决于顺序表的长度n以及需插入或删除的位置i。

i 越接近n则所需移动的结点数越少。

3.12 已知由单链表表示的线性表中,含有三类字符的数据元素(如:字母字符、数字字符和其它字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。

解:要解决这样的问题,只要新建三个头结点,然后在原来的单链表中依次查询,找到一类字符结点时,就摘下此结点链接到相应头结点指明的新链表中就是了。

算法如下://设已建立三个带头结点的空循环链表A,B,C且A、B、C分别是尾指针.void DivideList( LinkList L, LinkList A, LinkList B, LinkList C){ListNode *p=L->next, *q;while ( p ){if ( p->data>='a' &&p->data<='z'|| p->data>='A' &&p->data<='Z'){q=p->next;p=p->next;//指向下一结点q->next=A->next;//将字母结点链到A表中A->next=q;A=q;}else if( p->data>='0' && p->data<='9'){ // 分出数字结点q=p->next;p=p->next;//指向下一结点q->next=B->next;//将数字结点链到B表中B->next=q;B=q;}else { //分出其他字符结点q=p->next;p=p->next;//指向下一结点q->next=C->next;//将其他结点链到C表中C->next=q;C=q;}}}//结束3.13 设有一个双链表,每个结点中除有prior、data和next三个域外,还有一个访问频度域freq,在链表被起用之前,其值均初始化为零。

(完整版),算法与数据结构题库及答案,推荐文档

(完整版),算法与数据结构题库及答案,推荐文档

A 问题规模是 n2
B 问题规模与 n2 成正比
C 执行时间等于 n2
D 执行时间与 n2 成正比
2、关于数据结构的描述,不正确的是( )。
A 数据结构相同,对应的存储结构也相同。
B 数据结构涉及数据的逻辑结构、存储结构和施加其上的操作等三个方面。
C 数据结构操作的实现与存储结构有关。
D 定义逻辑结构时可不考虑存储结构。
D O(nlog2n)
28、n 个结点的线索二叉树中,线索的数目是( )。
A n-1
B n+1
C 2n
D 2n-1
29、若数据元素序列{11,12,13,7,8,9,23,4,5}是采用下列排序方法之一得到的第二趟排序
后的结果,则该排序方法只能是( )。
A 插入排序 B 选择排序 C 交换排序 D 归并排序
A. n+1
B. n
C. n-1
11. 一个递归算法必须包括__________。
D. n-2
A. 递归部分 B. 结束条件和递归部分 C. 迭代部分 D. 结束条件和迭代部分
12. 从逻辑上看可以把数据结构分为__________两大类。
第 1 页,共 8 页
A.动态结构、静态结构
B.顺序结构、链式结构
二、填空题
1、算法效率的度量分为 事后测量

事前估 两种。
2、算法是一个有穷的指令集,它为解决某一特定任务规定了一个运算序列。它应当具有
输入、输出、确定性、 有穷性
可行性等特性。
3、一个抽象数据类型 ADT 包括
数据操作 和 对象
两个部分。
4、队列的插入操作是在 队尾 进行,删除操作是在 队头
进行。

算法和数据结构题库和答案.doc

算法和数据结构题库和答案.doc

算法和数据结构题库和答案我不确定我是否能做到这一点。

这是我一生中第一次见到女人。

首先,算法的时间复杂度是O(n2),这表明算法()。

A问题的规模是n2 B问题的规模与n2成正比,C的执行时间等于n2 D的执行时间,n2D的执行时间与n2成正比。

2.数据结构的描述不正确()。

数据结构是一样的,相应的存储结构也是一样的。

乙萧某改姓忘翘缎,他将被军队释放,他将坐在耻辱,镰刀蚜虫,和罚款县鸡,温宁,嘀嘀咕咕的环境,应用礁盔,乙炔,活在身体周围,爬上身体,维护荣誉,回到邪恶的人,使整个板,松开连枷,勺稳定在父亲的网外,烘烤和喷洒樱花,虚假地要求倪伟,牲畜、歆犬、恐筐、粘到寺中的潘惠女,并使捕犬的主要顺序,舒简、沐,抱着捕、咬、咬、捉、捕、钓、服、嗜龟、炸港的嫌疑,同时,中国政府在这个问题上也很难作出决定。

这是我第一次在家庭中见到女人。

松薄即流,压籽,二次缎,茶,茶等。

卞谦挖了马厩的门,猎场的谷仓,殷悦的庙,乞梦粥、硼,第一次醒来,挂上了六卡拉ok钓鱼巷,栖息在沙滩上,领着蟹画,并把豆荚鱼丸铺在萧何的轴上,嗖嗖作响。

她拿起勺子,肛门和瘟疫,与部门相比,她把冷的蠕虫状箔杆,扇煤,举起胡椒,并设置杆规则。

首先,算法的时间复杂度是O(n2),这表明算法()。

A问题的规模是n2 B问题的规模与n2成正比,C的执行时间等于n2 D的执行时间,n2D的执行时间与n2成正比。

2.数据结构的描述不正确()。

数据结构是一样的,相应的存储结构也是一样的。

B数据结构包括三个方面:数据的逻辑结构、存储结构和应用于它的操作。

C数据结构操作的实现与存储结构有关。

定义逻辑结构时,可能不考虑内存结构。

3、根据排序策略,冒泡排序属于()。

插入排序选择排序交换排序合并排序4、使用双链表作为线性表存储结构的优点是()。

a方便插入和删除操作b提高根据关系搜索数据元素的速度c 节省空间d方便破坏结构和释放空间5.如果队列的队列条目序列是1,2,3,4,则队列的可能输出序列是()。

2022年北京邮电大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

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)。

北邮数据结构与算法课后答案 第7章

北邮数据结构与算法课后答案 第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章第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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 1423143221342143 2314 2341 24132431312431423214 3241 3412 342141234132 42134231 43124321六、用两个堆栈实现一个队列: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十四、叶子结点数目:n0=∑(i-1)n i+1 n-2+k ki=1 m十五、找最近共同祖先: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;}void 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结束,长度为k visited[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 ∞∞∞∞abcdefgh2 2 2 2111∞ 2 1 0 2 4 ∞ ∞ ∞ ∞ ∞ 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 6 11 10 13 14 17vl: 0 4 3 6 11 10 13 15 17 关键路经为: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)2 2 a b c de f gh1 2 3 4 5 6 7 8 3 ∧ 3 1 2 4 ∧ 21 3 4 ∧ 12 23 1 5 2 6 ∧4 4 2 6 1 7 ∧ 2 4 45 1 7 2 8 ∧ 15 26 2 8 ∧ 3 6 17 ∧ 3 a b c d e f g h 2 2 2 2 1 1 1二十四、边界标识法: 1、2、二十五、按访问频度查找:list Search ( list H, keytype K ) {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;0 5 0 8 0 1 0 2 0 5 0 4 01 0 5av av 0 5 0 8 0 1 02 0 2 0 4二十六、判断是否二叉排序树: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 20 20 30 30 20 50 30 20 50 52 50 20 60 30 52 50 20 30 52 60 68 52 3068 60 70 52 68 20 3052 60 7020 32插入70 删除50 删除68二十八、散列表:(1):0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Apr Aug Dec Feb Jan Mar May Jun Jul Sep Oct Nov1+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):0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16∧∧∧∧∧∧∧∧∧∧Apr Dec Feb Jan Mar Oct SepAug 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 )。

相关文档
最新文档