文档库 最新最全的文档下载
当前位置:文档库 › 算法设计

算法设计

算法设计
算法设计

1.试编写在带头结点的单链表中删除(一个)最小值结点的(高效)算法。

【题目分析】本题要求在单链表中删除最小值结点。单链表中删除结点,为使结点删除后不出现“断链”,应知道被删结点的前驱。而“最小值结点”是在遍历整个链表后才能知道。所以算法应首先遍历链表,求得最小值结点及其前驱。遍历结束后再执行删除操作。

LinkedList Delete(LinkedList L)

∥L是带头结点的单链表,本算法删除其最小值结点。

{p=L->next;∥p为工作指针。指向待处理的结点。假定链表非空。

pre=L;∥pre指向最小值结点的前驱。

q=p;∥q指向最小值结点,初始假定第一元素结点是最小值结点。

while(p->next!=null)

{if(p->next->datadata){pre=p;q=p->next;} ∥查最小值结点

p=p->next;∥指针后移。

}

pre->next=q->next;∥从链表上删除最小值结点

free(q);∥释放最小值结点空间

}∥结束算法delete。

2.将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。

void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){

pa=La->next; pb=Lb->next;

Lc=pc=La; //用La的头结点作为Lc的头结点

while(pa && pb){

if(pa->datadata){ pc->next=pa;pc=pa;pa=pa->next;}

else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;}

else {// 相等时取La的元素,删除Lb的元素

pc->next=pa;pc=pa;pa=pa->next;

q=pb->next;delete pb ;pb =q;}

}

pc->next=pa?pa:pb; //插入剩余段

delete Lb; //释放Lb的头结点}

3.已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。

【题目分析】在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。

void Delete(ElemType A[ ],int n)

∥A是有n个元素的一维数组,本算法删除A中所有值为item的元素。

{i=1;j=n;∥设置数组低、高端指针(下标)。

while(i

{while(i

if(i

if(i

}

4.已知一个带有表头结点的单链表,结点结构为:

假设该链表只给出了头指针list

查找链表中倒数第K位置的结点(K为正整数),若查找成功,算法输出该结点 data域的值,

并返回1,否则只返回0;要求:

(1)简述算法的基本设计思想;

(2)描述算法的详细实现步骤(使用C,或C++实现),关键之处给出详细解释。

int LocateElement(linklist list,int k)

{

P1=list->link; P=list; i=1; while(P1) {

P1=P1->link; i++;

if(i>k) P=P->next; //如果i>k,则p也往后移 }

if(P==list) return 0; //说明链表没有k个结点

else {

printf(“%d\n“,P->data);

return 1; }

}

5. 已知非空线性链表第一个结点的指针为list,请写一个算法,将该链表中数据域值最大的那个结点移到链表的最后面。

void REMOVE(LinkList & list){

LinkList s,r,p,q;

q=list;

p=list->link;

r=list;

While(p!=NULL)

{ if(p->data->q->data) then

{ s=r; q=p; }

r=p;p=p->link;}

if(q!=r) then

{ if (q==list) then list=q->link;

else

s->link=q->link; r->link=q; q->link=NULL;

} }

6.若已知非空线性链表第一个结点的指针为list,请写一个算法,将该链表中数据域值最小的那个结点移到链表的最前端。

void REMOVE(LinkList & list){

LinkList q=list, s ,r;

p=list->link ;

While(p!=NULL)

{

if(p->data->q->data) then

{ s=r; q=p; }

r=p;p=p->link;

}

if(q!=list) then

s->link=q->link; q->link=list;

list=q; }

}

7.已知一个带有表头结点的单链表,头指针为L,请用一个尽可能高效的算法实现,在非头结点p所指元素前,插入元素e,并分析算法的时间复杂度。

时间复杂度O(n)

Delete(Node *L, Node *p)

{ Node *s, *t s = L->next; t = L;

while (s != NULL && s != p){

t = s; s = s->next; }

if (s != NULL){ t->next = s->next; free(s);} }

9.试设计实现在单链表中删去值相同的多余结点的算法。

typedef int datatype;

typedef struct node {datatype data; struct node *next;}lklist;

void delredundant(lklist *&head)

{ lklist *p,*q,*s;

for(p=head;p!=0;p=p->next)

{ for(q=p->next,s=q;q!=0; )

if (q->data==p->data) {s->next=q->next; free(q);q=s->next;}

else {s=q,q=q->next;}

}

}

10.编写算法,判断带头结点的双向循环链表L是否对称。对称是指:设各元素值a1,a2,...,a n, 则有a i=a n-i+1 ,即指:a1= a n,a2= a n-1 。。。。。。。

结点结构为:

int judge(DLinkList L) {

p=L->next; q=L->prior;

while(p!=q) {

if(p->data!=q->data)

return 0;

if(p->next==q)

return 1;

p=p->next; q=q->prior; }

return 1; }

11.已知带头结点的动态单链表L中的结点是按整数值递增排列,试写一算法将值为X的结点插入链表L中,使L仍然有序。

分析:本题算法的思想是先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点。实现本题功能的函数如下:

void insertorder(Linklist &L, Elemtype x) { Linklist p,q,s;

s=(Linklist)malloc(sizeof(Lnode));

s->data=x; s->next=NULL; //产生一个待插入的结点s

q=L;

p=q->next;

while( p && x>p->data)

{ q=p; /使q始终指向p的前驱

p=p->next; }

s->next=p; q->next=s; //将s结点插入到q和p之间

}

12.假设线性表采用顺序存储结构,编写算法,将顺序表L 中所有值为奇数的元素调整到表的前端。

viod f34 (Seqlist head)

{ int temp,m=0;

for(i=0;ilength;i++)

{

if(p->data[i] mod 2 !=0)

{

temp=t->data[m]; t->data[m]= t->data[j];

t->data[i]=temp m++; } } }

20.已知一个整数序列A= (a0, a1,…,a n-1) ,其中0≤a i< n(0 ≤ i< n) 。若存在a p=a p2 =…=a pm=x且m >n/2(0 ≤p k

素。假设A 中的n 个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A 的主元素。若存在主元素,则输出该元素;否则输出-1。要求:

(1)给出算法的基本设计思想。

(2)根据设计思想,采用C 或C++或Java 语言描述算法,关键之处给出注释。

(3

(1)算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的Num 。然后重新计数,确认 NumNum 是否主元素。算法可分为以下两步:①选取候的主元素:依次扫描所给数组中的每个整,将第一遇到Nu m保存到 c中,记录 Nu m的出现次数为的出现次数为 1;若遇到的下一个整数仍等于 NumNum ,则计数加 1,否则计数减 1;当计数减到 0时,将遇到的下一个整数保存c中,计数重新记为中,计数重新记为 1,开始新一轮计数,即从当前位置重复上述过程直到扫描完全部组元素。②判断 c中元素是否真正的主中元素是否真正的主:再次扫描该数组,统计 c中元素出现的次数,若中元素出现的次数,若大于 n/2 ,则为主元素;否则,序列中不存在主元素。

(2)算法实现:(7分)

int Majority(int A[], int n)

{int i, c, count=1; / / c用来保存候选主元素,count用来计数

c = A[0]; / / 设置A[0]为候选主元素

for ( i=1; i

if ( A[i] = = c ) count++; / / 对A中的候选主元素计数

else if ( count > 0) / / 处理不是候选主元素的情况

count--;else / / 更换候选主元素,重新计数

{ c = A[i];count = 1;}

if ( count>0 ) for (i=count=0; i

if ( A[i] = = c ) count++;

if ( count> n/2 ) return c; / / 确认候选主元素

else return -1; / / 不存在主元素

}

1.统计一棵二叉树的叶子结点的个数

// 求二叉树中叶子结点的数目

Status POLeafNodeNum(int& i,BiTree& T)

{ if(T) {

if(!T->lchild && !T->rchild) i++;

POLeafNodeNum(i,T->lchild); POLeafNodeNum(i,T->rchild);}

return OK;}

2.统计一棵二叉树的度为2的结点个数

int Degrees2(BinTreeNode *t) {

if (!t) return 0;

if(t->leftChild && t->rightChild)

return 1+Degrees2(t->leftChild)+Degrees2(t->rightChild);

}

3.统计一棵二叉树的深度

int Height(btre bt)//求二叉树bt 的深度

{int hl,hr;

if (bt==null) return(0);

else {hl=Height(bt->lch); hr=Height(bt->rch);

if(hl>hr) return (hl+1); else return(hr+1);

} }

4.创建一棵二叉树

BiTree Creat() //建立二叉树的二叉链表形式的存储结构

{ElemType x;BiTree bt;

scanf(“%d”,&x); //本题假定结点数据域为整型

if(x==0) bt=null;

else if(x>0)

{bt=(BiNode *)malloc(sizeof(BiNode));

bt->data=x; bt->lchild=creat(); bt->rchild=creat();

}

else error(“输入错误”);

return(bt);

}//结束 BiTree

7.以二叉链表作为二叉树的存储结构,计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。

[题目分析] 求二叉树高度的算法见上题。求最大宽度可采用层次遍历的方法,记下各层结点数,每层遍历完毕,若结点数大于原先最大宽度,则修改最大宽度。

int Width(BiTree bt)//求二叉树bt的最大宽度

{if (bt==null) return (0); //空二叉树宽度为0

else

{BiTree Q[];//Q是队列,元素为二叉树结点指针,容量足够大

front=1;rear=1;last=1;//front队头指针,rear队尾指针,last同层最右结点在队列中的位置

temp=0; maxw=0; //temp记局部宽度, maxw记最大宽度

Q[rear]=bt; //根结点入队列

while(front<=last)

{p=Q[front++]; temp++; //同层元素数加1

if (p->lchild!=null) Q[++rear]=p->lchild; //左子女入队if (p->rchild!=null) Q[++rear]=p->rchild; //右子女入队

if (front>last) //一层结束,

{last=rear;

if(temp>maxw) maxw=temp;//last指向下层最右元素, 更新当前最大宽度

temp=0;

}//if

}//while

return (maxw);

}//结束width

1.设二叉排序树bt以二叉链表为存储结构,试设计算法删除二叉排序树bt中值最大的结点。Status del_max(BiTree &bt){ --------1分 //删除二叉排序树bt中值最大结点

if (!bt) return ERROR; //空树

p = bt;

if (bt->rchild == NULL){ //根无右子树 --------2分

bt = bt->lchild; p->lchild = NULL;//此语句可不要

free(p); }

else{ while(p->rchild != NULL){//p移至最右下结点

q = p; p = p->rchild;}

if(p->lchild != NULL)//有左子树 --------5分

q->rchild = p->lchild;

else q->rchild = NULL;//无左子树

free(p); } }//del_max

1.试写出将S结点插入到双向链表P结点之前的语句序列,结点结构为:

S->priou=P->priou;

P->priou=S;

S->next=P;

P->priou->next=S;

算法设计分析期中试题

《算法设计与分析》期中试卷 一、叙述分治算法的基本思想及一般算法设计模式; 二、叙述动态规划算法的基本步骤及动态规划算法的基本 要素; 三、改进课本P74的Lcs算法,使改进算法不用数组b亦 可在O(m+n)的时间内构造最长公共序列; 四、求下列函数的渐近表达式 (1). 3n2+10n (2).n2/10+2n (3)21+1/n (4)logn3 (5)10log3n 五、对于下列各组函数发f(n)和g(n),确定f(n)=O((g(n))) 或者f(n)= ((g(n)))或者f(n)=θ((g(n))),并简述理由 (1). f(n)=logn2 , g(n)=logn+5; (2). f(n)=logn2 , g(n)= √n; (3), f(n)=n, g(n)= logn2; (4). f(n)=nlogn+n,g(n)=logn; (5). f(n)=10.g(n)=log10; (6). f(n)=log2n g(n)=logn (7). f(n)=2n g(n)= 3n; (8). f(n)=2n g(n)= 100n2;

六、设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当 搜索元素x不再数组中时,返回小于x的最大元素位置i和大于x 的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x 在数组中的位置 七、设a[0:n-1]是有n个元素的数组,k(0<=k<=n-1)是非负整数。 试设计一个算法将子数组a[0:k]与a[k+1:n-1]换位。要求算法在最坏的情况下耗时O(n),且只用到O(1)的辅助空间。 八、在一个由元素组成的表中出现次数最多的元素称为众数。试写 一个寻找众数的算法,并分析其计算复杂性。 九、设计一个O(n2)时间的算法,找出由n个数组成的序列的最长 单调递增子序列。 十、给定n中物品和一背包,物品i的重量是ω,体积是b i,其价 值为v i ,背包的容量为C,容积为D。问:应该如何选择装入背包中的物品,使得装入背包中的物品的总价值最大?在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包,不能将物品i装入背包多次,也不能只装入部分的物品i。 试设计一个解此问题的动态规划算法,并分析算法的计算复杂性。

算法设计与分析课程设计(完整版)

HUNAN CITY UNIVERSITY 算法设计与分析课程设计 题目:求最大值与最小值问题 专业: 学号: 姓名: 指导教师: 成绩: 二0年月日

一、问题描述 输入一列整数,求出该列整数中的最大值与最小值。 二、课程设计目的 通过课程设计,提高用计算机解决实际问题的能力,提高独立实践的能力,将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力。提高适应实际,实践编程的能力。在实际的编程和调试综合试题的基础上,把高级语言程序设计的思想、编程巧和解题思路进行总结与概括,通过比较系统地练习达到真正比较熟练地掌握计算机编程的基本功,为后续的学习打下基础。了解一般程序设计的基本思路与方法。 三、问题分析 看到这个题目我们最容易想到的算法是直接比较算法:将数组的第 1 个元素分别赋给两个临时变量:fmax:=A[1]; fmin:=A[1]; 然后从数组的第 2 个元素 A[2]开始直到第 n个元素逐个与 fmax 和 fmin 比较,在每次比较中,如果A[i] > fmax,则用 A[i]的值替换 fmax 的值;如果 A[i] < fmin,则用 A[i]的值替换 fmin 的值;否则保持 fmax(fmin)的值不变。这样在程序结束时的fmax、fmin 的值就分别是数组的最大值和最小值。这个算法在最好、最坏情况下,元素的比较次数都是 2(n-1),而平均比较次数也为 2(n-1)。 如果将上面的比较过程修改为:从数组的第 2 个元素 A[2]开始直到第 n 个元素,每个 A[i]都是首先与 fmax 比较,如果 A[i]>fmax,则用 A[i]的值替换 fmax 的值;否则才将 A[i]与 fmin 比较,如果 A[i] < fmin,则用 A[i]的值替换 fmin 的值。 这样的算法在最好、最坏情况下使用的比较次数分别是 n-1 和 2(n-1),而平均比较次数是 3(n-1)/2,因为在比较过程中,将有一半的几率出现 A[i]>fmax 情况。

设计模式题库(修改后)

1.设计模式的原理? (C) C. 面向接口编程 2. 以下对"开-闭"原则的一些描述错误的是?(A) A. "开-闭"原则与"对可变性的封装原则"没有相似性. 3.以下属于创建型模式是? (A) B.BUILDER(生成器) C. PROTOTYPE(原型) D.SINGLETON(单件) 4.以下属于结构型模式是? (D) COMPOSITE(组合) B. ADAPTER(适配器) B.FLYWEIGHT(享元) 5.以下属于行为型模式是? (D ) 6. COMMAND(命令) 7. STRATEGY(策略) 8. MEMENTO(备忘录) /*23模式意图*/ 6.以下意图那个是用来描述ABSTRACT FACTORY(抽象工厂)?(A) A.提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 7.以下意图那个是用来描述BUILDER(生成器)?(B) 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 8.以下意图那个是用来描述FACTORY METHOD(工厂方法)?(C) C.定义一个用于创建对象的接口,让子类决定实例化哪一个类。该模式使一个类的实例化延迟到其子类。 9.以下意图那个是用来描述PROTOTYPE(原型)?(D) D.用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 10.以下意图那个是用来描述SINGLETON(单件)?(B) B.保证一个类仅有一个实例,并提供一个访问它的全局访问点。

11.以下意图那个是用来描述ADAPTER(适配器)?(A) A.将一个类的接口转换成客户希望的另外一个接口。本模式使得原本由于接口不兼容 而不能一起工作的那些类可以一起工作。 12.以下意图那个是用来描述BRIDGE(桥接)?(B) B.将抽象部分与它的实现部分分离,使它们都可以独立地变化。 13.以下意图那个是用来描述COMPOSITE(组合)?(C) C.将对象组合成树形结构以表示“部分-整体”的层次结构。 14.以下意图那个是用来描述DECORATOR(装饰)?(D) 动态地给一个对象添加一些额外的职责。 15.以下意图那个是用来描述FACADE(外观)?(A) A.为子系统中的一组接口提供一个一致的界面,本模式定义了一个高层接口,这个接 口使得这一子系统更加容易使用。 16.以下意图那个是用来描述FLYWEIGHT(享元)?(B) B.运用共享技术有效地支持大量细粒度的对象。 17.以下意图那个是用来描述PROXY(代理)?(C) C.为其他对象提供一种代理以控制对这个对象的访问。 18.以下意图那个是用来描述CHAIN OF RESPONSIBILITY(职责链)?(D) D.使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 19.以下意图那个是用来描述COMMAND(命令)?(A) A.将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作 20.以下意图那个是用来描述INTERPRETER(解释器)?(B) B.给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 21.以下意图那个是用来描述ITERATOR(迭代器)?(C) 。 C.提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

算法设计课程教学大纲

算法设计课程教学大纲

【算法设计】课程教学大纲 【课程代码】04034109 【课程类别】考查课 【学分】3 【总学时】72 【讲授学时】42 【实验学时】0 【先修课程】《C++程序设计》、《数据结构》 【适用专业】2012级计算机科学与技术 【教学目的】 计算机算法设计与分析是计算机算法和软件的基础。本课程的目的是通过授课和实验的方式使学生掌握计算机算法的基本概念和基本理论,一些具体算法的复杂性分析;算法设计的基本方法、技术和分析方法;经典数值计算问题、递归与分治、动态规划、贪心法、回溯法、和分支限界法等解决问题的方法。 【课程的基本内容和要求】 (一)算法概述 教学内容: 1.1算法与程序 1.2算法复杂性分析 1.3 NP完全理论 教学要求: 理解程序与算法的概念、区别与联系;掌握算法在最坏情况、最好情况和平均情况下的计算复杂性概念。 (二)递归与分治 教学内容: 1.递归的概念 2.分治法基本思想 3.二分搜索技术 4.合并排序 5.快速排序 6.大整数乘法 教学要求:

理解递归的概念;掌握设计有效算法的分治策略,并掌握范例的设计技巧。(三)动态规划 教学内容: 1. 矩阵连乘问题 2. 动态规划算法的基本要素 3. 最长公共子序列 4. 0-1背包问题 教学要求: 理解动态规划算法的概念,掌握动态规划算法的基本要素,掌握设计动态规划算法的步骤,并通过应用范例学习动态规划算法的设计策略。 (四)贪心算法 教学内容: 1.活动安排问题 2.贪心算法的基本要素 3.最优装载 4.哈夫曼编码 5.单源最短路径 教学要求: 掌握贪心算法的基本要素,理解贪心算法与动态规划算法的差异,理解贪心算法的一般理论。 (五)回溯算法 教学内容: 1.回溯法的算法框架 2.0-1背包问题 3.装载问题 4.n后问题 5.旅行售货员问题 教学要求: 理解回溯法深度优先搜索策略,掌握用回溯法解题的算法框架,包括递归回溯、迭代回溯、子集树算法框架、排列树算法框架。 (六)分支限界算法 教学内容: 1.分支限界法的基本思想 2.单源最短路径问题 3.装载问题 4.0-1背包问题

《计算机算法设计与分析》习题及答案

《计算机算法设计与分析》习题及答案 一.选择题 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是(A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4. 回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 5.下列算法中通常以自底向上的方式求解最优解的是(B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 6、衡量一个算法好坏的标准是( C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 7、以下不可以使用分治法求解的是( D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 8. 实现循环赛日程表利用的算法是(A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 9.下面不是分支界限法搜索方式的是(D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先 10.下列算法中通常以深度优先方式系统搜索问题解的是(D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法

11.备忘录方法是那种算法的变形。( B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 12.哈夫曼编码的贪心算法所需的计算时间为(B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 13.分支限界法解最大团问题时,活结点表的组织形式是(B )。 A、最小堆 B、最大堆 C、栈 D、数组 14.最长公共子序列算法利用的算法是(B)。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.实现棋盘覆盖算法利用的算法是(A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 16.下面是贪心算法的基本要素的是(C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 17.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C.计算限界函数的时间 D. 确定解空间的时间 18.下面哪种函数是回溯法中为避免无效搜索采取的策略(B ) A.递归函数 B.剪枝函数 C。随机数函数 D.搜索函数 19. (D)是贪心算法与动态规划算法的共同点。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、最优子结构性质 20. 矩阵连乘问题的算法可由( B )设计实现。 A、分支界限算法 B、动态规划算法 C、贪心算法 D、回溯算法 21. 分支限界法解旅行售货员问题时,活结点表的组织形式是( A )。

算法设计与分析学习总结

算法分析与设计 学习总结 题目:算法分析与设计学习总结 学院信息科学与工程学院专业2013级计算机应用技术 届次 学生姓名 学号2013110657 二○一三年一月十五日

算法分析与设计学习总结 本学期通过学习算法分析与设计课程,了解到:算法是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。算法能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂性和时间复杂度来衡量。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。计算机系统中的操作系统、语言编译系统、数据库管理系统以及各种各样的计算机应用系统中的软件,都必须使用具体的算法来实现。算法设计与分析是计算机科学与技术的一个核心问题。 设计的算法要具有以下的特征才能有效的完成设计要求,算法的特征有:(1)有穷性。算法在执行有限步后必须终止。(2)确定性。算法的每一个步骤必须有确切的定义。(3)输入。一个算法有0个或多个输入,作为算法开始执行前的初始值,或初始状态。(4)输出。一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。 (5)可行性。在有限时间内完成计算过程。 算法设计的整个过程,可以包含对问题需求的说明、数学模型的拟制、算法的详细设计、算法的正确性验证、算法的实现、算法分析、程序测试和文档资料的编制。算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法和并行算法。 经典的算法主要有: 1、穷举搜索法 穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,bing从中找出那些符合要求的候选解作为问题的解。 穷举算法特点是算法简单,但运行时所花费的时间量大。有些问题所列举书来的情况数目会大得惊人,就是用高速计算机运行,其等待运行结果的时间也将使人无法忍受。我们在用穷举算法解决问题是,应尽可能将明显不符合条件的情况排除在外,以尽快取得问题的解。 2、迭代算法 迭代法是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或方程组)的过程,为实现这一过程所使用的方法统称为迭代法。迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行: (1)选一个方程的近似根,赋给变量x0。 (2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0。 (3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。 若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。 3、递推算法 递推算法是利用问题本身所具有的一种递推关系求问题解的一种方法。它把问题分成若干步,找出相邻几步的关系,从而达到目的。 4、递归算法 递归算法是一种直接或间接的调用自身的算法。 能采用递归描述的算法通常有这样的特征:为求解规模为n的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模

算法课程设计

吉林财经大学课程设计报告 课程名称:算法课程设计 设计题目:插棒游戏 所在院系:管理科学与信息工程学院计算机科学与技术 指导教师: 职称:副教授 提交时间: 2017年4月

目录 一、题目描述与设计要求 (1) 1 题目描述与设计要求 (1) 二、问题分析 (1) 1 解空间 (1) 2 解空间结构 (2) 3 剪枝 (2) 4 回溯法的基本思想 (2) 5 回溯法的适用条件 (3) 6 回溯法的空间树 (4) 7 回溯法的基本步骤 (4) 三、算法设计 (5) 1 伪代码 (5) 四、复杂性分析 (6) 1 时间复杂度 (6) 2 空间复杂度该 (6) 五、样本测试、分析与总结 (6) 1 样本测试 (6) 2 分析 (7) 2.1、数据类型 (7) 2.2 主要函数思路 (7) 2.3 回溯 (8) 3 总结 (8) 参考文献 (9) 附录 (10)

一、题目描述与设计要求 1 题目描述与设计要求 这个类似谜题的游戏在等边三角形的板上布置了 15 个孔。在初始时候,如下图所示,除了一个孔,所有孔都插上了插棒。一个插棒可以跳过它的直接邻居,移到一个空白的位置上。这一跳会把被跳过的邻居从板上移走。设计并实现一个回溯算法,求解该谜题的下列版本: a.已知空孔的位置,求出消去 13 个插棒的最短步骤,对剩下的插棒的最终位置不限。 b.已知空孔的位置,求出消去 13 个插棒的最短步骤,剩下的插棒最终要落在最初的空孔上。 图1 二、问题分析 1 解空间 由于棋盘的对称性,棋盘在变化的过程中会形成多个同构的状态。 例如初始状态时,空孔只有一个,共有15种基本状态。如图2 所示,任意状态与空孔位置在其它的与该空孔颜色相同的点处的状态是同构的,它们可以通过沿中位线翻转和旋转60o 互相转换。也就是说,空孔所在位置的颜色相同的个状态是同构的。如空孔位置在顶点处的三个状态,他们仅通过旋转60o的操作即可互相转换。

最小生成树问题的算法实现及复杂度分析—天津大学计算机科学与技术学院(算法设计与分析)

算法设计与分析课程设计报告 学院计算机科学与技术 专业计算机科学与技术 年级2011 姓名XXX 学号 2013年5 月19 日

题目:最小生成树问题的算法实现及复杂度分析 摘要:该程序操作简单,具有一定的应用性。数据结构是计算机科学的算法理论基础和软件设计的技术基础,在计算机领域中有着举足轻重的作用,是计算机学科的核心课程。而最小生成树算法是算法设计与分析中的重要算法,最小生成树也是最短路径算法。最短路径的问题在现实生活中应用非常广泛,如邮递员送信、公路造价等问题。本设计以Visual Studio 2010作为开发平台,C/C++语言作为编程语言,以邻接矩阵作为存储结构,编程实现了最小生成树算法。构造最小生成树有很多算法,本文主要介绍了图的概念、图的遍历,并分析了PRIM 经典算法的算法思想,最后用这种经典算法实现了最小生成树的生成。 引言:假设要在n个城市之间建立通信联络网,则连接n个城市只需要n-1条线路。这时,自然会考虑这样一个问题,如何在节省费用的前提下建立这个通信网?自然在每两个城市之间都可以设置一条线路,而这相应的就要付出较高的经济代价。n个城市之间最多可以设置n(n-1)/2条线路,那么如何在这些可能的线路中选择n-1 条使总的代价最小呢?可以用连通网来表示n 个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋予边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一个生成树都可以是一个通信网。现在要选择这样一棵生成树,也就是使总的代价最小。这个问题便是构造连通网的最小代价生成树(简称最小生成树)的问题。最小生成树是指在所有生成树中,边上权值之和最小的生成树,另外最小生成树也可能是多个,他们之间的权值之和相等。一棵生成树的代价就是树上各边的代价之和。而实现这个运算的经典算法就是普利姆算法。

《算法设计与分析实用教程》习题参考解答

《算法设计与分析实用教程》参考解答 1-1 加减得1的数学游戏 西西很喜欢数字游戏,今天他看到两个数,就想能否通过简单的加减,使最终答案等于1。而他又比较厌烦计算,所以他还想知道最少经过多少次才能得到1。 例如,给出16,9:16-9+16-9+16-9-9-9+16-9-9=1,需要做10次加减法计算。 设计算法,输入两个不同的正整数,输出得到1的最少计算次数。(如果无法得到1,则输出-1)。 (1)若输入两个不同的正整数a,b均为偶数,显然不可能得到1。 设x*a与y*b之差为“1”或“-1”,则对于正整数a,b经n=x+y-1次加减可得到1。 为了求n的最小值,令n从1开始递增,x在1——n中取值,y=n+1-x: 检测d=x*a+y*b,若d=1或-1,则n=x+y-1为所求的最少次数。 (2)算法描述 // 两数若干次加减结果为1的数学游戏 #include void main() {long a,b,d,n,x,y; printf(" 请输入整数a,b: "); scanf("%ld,%ld",&a,&b); if(a%2==0 && b%2==0) { printf(" -1\n");return;} n=0; while(1) { n++; for(x=1;x<=n;x++) { y=n+1-x;d=x*a-y*b; if(d==1 || d==-1) // 满足加减结果为1 { printf(" n=%ld\n",n);return;} } } } 请输入整数a,b: 2012,19 961 请输入整数a,b: 101,2013 606

算法设计课程习题答案

算法设计课程习题答案 第一章 1-1什么是算法?它与计算过程和程序有什么区别? 算法是指求解一个问题所需要的具体步骤和方法。它是指令的有限序列。算法有一系列明确定义的基本指令序列所描述的,求解特定问题的过程,它能够对合法的输入,在有限时间内产生所要求的输出,取消有穷性限制则是计算过程;而程序是算法的描述。 1-11使用归纳法证明汉诺塔函数的正确性。 用数学归纳法证明汉诺塔函数对任何n (即n 可以是任何正整数)有解。 (1)当盘子数n =1时,只需直接将此盘从A 柱搬到C 柱即可。 (2)现假设n =k 时有解,即可以将k 个盘子(在不违反规则的情况下)从一个源柱,通过一个中间柱移到目的柱上。 (3)现在证明n =k +1时也有解。开始时A 柱上的k +1个盘子可以看成由k 个盘和最底下的一个最大盘组成。根据归纳假设这k 个盘可以(在不违反规则的情况下)通过C 柱移到B 柱上(在这k 个盘的移动过程中,最大盘可以看成不存在)。完成这一大步后,只要将A 柱上的最大盘直接搬到C 柱上。再根据归纳假设B 柱上的这k 个盘可以(在不违反规则的情况下)通过A 柱移到C 柱上。 至此证明结束。 第二章 2-8确定下列各程序段的程序步,确定划线语句的执行次数,计算它们的渐近时间复杂度。 (1)程序步为n log 1+画线语句的执行次数为log n ????。(log )n O 。划线语句的执行次数 应该理解为一个整体。 (2)画线语句的执行次数为 111 (1)(2)16 j n i i j k n n n ===++= ∑∑∑。3 ()n O 。 (3)画线语句的执行次数为 。O 。 (4)当n 为奇数时画线语句的执行次数为 (1)(3) 4 n n ++, 当n 为偶数时画线语句的执行次数为 2(2)4 n +。2 ()n O 。 2-11设有)(f n 和)(n g 如下所示,分析)(f n 为))((n g O 、))((n g Ω还是))((n g Θ。 (1) 当3n ≥时,3 log log n n n <<,所以 ()20log 21f n n n n =+<, 3()log 2g n n n n =+>。可选 21 2 c = ,03n =。对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。注意:是f (n )和g (n )的关系。 (2) 当4n ≥ 时,2 log log n n n <<,所以2 2 ()/log f n n n n =<, 2 2 ()log g n n n n =≥。可选 1c =,04n =。对于 0n n ≥,2 ()()f n n cg n <≤,即 ()(())f n g n =O 。

算法设计试题

高二信息技术选修模块〈算法与程序设计〉 学分认定考试试题 班级学号姓名 一、单选题(每题3分,共42分) 1.一位爱好程序设计的同学想编写程序解决“鸡兔同笼”问题,他制定的如下工作过程中,更恰当的是() A、设计算法,编写程序,分析问题,调试运行程序,检测结果。 B、分析问题,编写程序,设计算法,调试运行程序,检测结果。 C、分析问题,设计算法,编写程序,调试运行程序,检测结果。 D、设计算法,分析问题,编写程序,调试运行程序,检测结果。 2.在编制计算机程序解决问题的过程中,对算法描述正确的是() A、算法是用计算机求解某一问题的方法,是解决问题的有序步骤。 B、算法必须在计算机上用某种语言实现。 C、一个问题对应的算法都只有一种。 D、常见的算法描述方法有自然语言法、流程图法、程序法。 3、要使循环体至少执行一次,应使用循环。 A、Do While条件 B、Do Until 条件 循环体循环体 Loop Loop C、For 初值to条件 D、do 循环体循环体 Next Loop Until 条件 4.小明对《算法与程序设计》情有独钟,下面是他编写的一段程序,请问他是采用了哪种程序语言设计和编写的?() private sub command1_click( ) I=1 Do If I mod 3 then print I I=I+1 Loop while I<=100 End sub A、机器语言 B、Visual Basic语言 C、Basic语言 D、汇编语言 5.结构化程序设计由三种基本结构组成,下面哪个不属于这三种基本结构?() A、顺序结构 B、输入、输出结构 C、选择结构 D、循环结构

五大常用算法

五大常用算法之一:分治算法 分治算法 一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1时,不需任何计算。n=2时,只要作一次比较即可排好序。n=3时只要作3次比较即可,…。而当n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。 二、基本思想及策略 分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。 如果原问题可分割成k个子问题,1

算法分析与设计教程习题解答_秦明

算法分析与设计教程 习题解答 第1章 算法引论 1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。 频率计数是指计算机执行程序中的某一条语句的执行次数。 多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。 指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。 2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促 使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。 3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事 后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。 4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复 杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。 5. 解:①n=11; ②n=12; ③n=982; ④n=39。 第2章 递归算法与分治算法 1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。 2. 解:通过分治算法的一般设计步骤进行说明。 3. 解:int fibonacci(int n) { if(n<=1) return 1; return fibonacci(n-1)+fibonacci(n-2); } 4. 解:void hanoi(int n,int a,int b,int c) { if(n>0) { hanoi(n-1,a,c,b); move(a,b); hanoi(n-1,c,b,a); } } 5. 解:① 22*2)(--=n n f n ② )log *()(n n n f O =

算法设计与分析

Ex.1(p20)若将y ← uniform(0, 1) 改为y ← x, 则上述的算法估计的值是什么?解:若将y ← uniform(0, 1) 改为y ← x,此时有,则k++,即,此时k++,由于此时x ← uniform(0, 1),所以k/n=,则此时4k/n=2。所以上述算法估计的值为2。Ex.2(p23) 在机器上用估计π值,给出不同的n值及精度。解:由ppt上p21可知,的大小,其中k为落入圆内的数目,n为总数,且π=,即需要计算4k/n。我们先令x ← un iform(0, 1),y ← uniform(0, 1)。计算 的值,如果小于等于1,那么此时k++。最后计算4k/n的值即可估计此时的π值。代码的主要部分为: 执行结果为:

结果分析:随着N的取值不断地增加,得到的π值也就越来越精确。 Ex.3(p23) 设a, b, c和d是实数,且a ≤ b, c ≤ d, f:[a, b] → [c, d]是一个连续函数,写一概率算法计算积分: 注意,函数的参数是a, b, c, d, n和f, 其中f用函数指针实现,请选一连续函数做实验,并给出实验结果。 解:的值为y=,y=0,x=a,x=b围成的面积。根据之前的例子我们可以知道 = k(b-a)d/n。其中k是落在函数y=,x=a,x=b以及y=0所包围区间内的个数。代码的主要部分为: 运行结果为:

结果分析: 随着N的取值不断地增加,得到的积分值越来越精确。 Ex4(p24). 设ε,δ是(0,1)之间的常数,证明:若I是的正确值,h是由HitorMiss算法返回的值,则当n ≥ I(1-I)/ε2δ时有: Prob[|h-I| < ε] ≥ 1 –δ 上述的意义告诉我们:Prob[|h-I| ≥ ε] ≤δ, 即:当n ≥ I(1-I)/ ε2δ时,算法的计算结果的绝对误差超过ε的概率不超过δ,因此我们根据给定ε和δ可以确定算法迭代的次数 () 解此问题时可用切比雪夫不等式,将I看作是数学期望。 证明:由切比雪夫不等式可知: P( | X - E(X) | < ε ) ≥ 1 - D(X) / ε2 由题目知,E(X)=I。且根据题意,我们可知,在HotorMiss算法中,若随机选取n个点,其中k个点在积分范围内,则。且k的分布为二项分布B(n,I)(在积分范围内或者不在 积分范围内),则。又因为k=x*n,所以D(X)=I(1-I)/n。再将E(X)和D(X)带入切比雪夫不等式中即可得到 Ex5(p36). 用上述算法,估计整数子集1~n的大小,并分析n对估计值的影响。解:由题知,集合的大小,通过计算新生成的集合中元素的个数来估计原集合的大小,代码的主体部分如下:

二十三种设计模式的通俗理解

二十三种设计模式的通俗理解 1、FACTORY 追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 2、BUILDER MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

3、FACTORY METHOD 请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。 4、PROTOTYPE 跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 5、SINGLETON 俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,

2017算法设计与应用作业

1有52张牌,使它们全部正面朝上,第一轮是从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;第二轮从第3张牌开始,凡是3的倍数位置上的牌,正面朝上的翻成正面朝下的,正面朝下的翻成正面朝上的;以此类推,直到翻得牌超过104张为止。统计最后有几张牌正面朝上以及它们的位置号。 问题分析:52张牌都有一个初始状态,即全部朝上。第一轮开始时,2的倍数位置改变,非2的倍数保持原样;第二轮开始时,3的奇数倍朝下,3的偶数倍朝上;第三轮开始时,4的倍数朝上,即2的偶数倍朝下,以此类推,直到牌数超过104,则进行状态统计。 算法设计:根据题意,首先对第一轮进行记录,算法则应该是依次对位置进行改变,用循环求解翻转问题。 算法分析:这个算法使用循环对牌进行逐层比较,算法复杂度为O(n+1),使用了52个空间的一维数组。 数据结构设计:用一维数组a[52]表示52张牌,设其初始状态为0。计数小于104时,第一轮开始进行翻转,下一轮即n+1轮开始分情况进行翻转,用整型shang 进行朝上个数的统计,位置则由i来确定。

算法如下: #include int main() { int a[52] = {0}; //用一维数组表示52张牌,0表示正面朝上int shang = 0; //正面朝上的个数 int i = 0; int count= 0; //次数统计 int n=1; while(count <=104) { if(n == 1) { for(i = n+1;i <=52;++i) { if(i%(n+1) == 0) { a[i-1] = 1; //front--; ++count; } } n++; } else

计算机算法设计与分析习题及答案

计算机算法设计与分析习 题及答案 Prepared on 24 November 2020

《计算机算法设计与分析》习题及答案 一.选择题 1、二分搜索算法是利用( A )实现的算法。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 2、下列不是动态规划算法基本步骤的是( A )。 A、找出最优解的性质 B、构造最优解 C、算出最优解 D、定义最优解 3、最大效益优先是(A )的一搜索方式。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 4. 回溯法解旅行售货员问题时的解空间树是( A )。 A、子集树 B、排列树 C、深度优先生成树 D、广度优先生成树 5.下列算法中通常以自底向上的方式求解最优解的是(B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 6、衡量一个算法好坏的标准是( C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 7、以下不可以使用分治法求解的是( D )。 A 棋盘覆盖问题 B 选择问题 C 归并排序 D 0/1背包问题 8. 实现循环赛日程表利用的算法是(A )。 A、分治策略 B、动态规划法 C、贪心法 D、回溯法 9.下面不是分支界限法搜索方式的是(D )。 A、广度优先 B、最小耗费优先 C、最大效益优先 D、深度优先

10.下列算法中通常以深度优先方式系统搜索问题解的是(D )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 11.备忘录方法是那种算法的变形。( B ) A、分治法 B、动态规划法 C、贪心法 D、回溯法 12.哈夫曼编码的贪心算法所需的计算时间为(B )。 A、O(n2n) B、O(nlogn) C、O(2n) D、O(n) 13.分支限界法解最大团问题时,活结点表的组织形式是(B )。 A、最小堆 B、最大堆 C、栈 D、数组 14.最长公共子序列算法利用的算法是(B)。 A、分支界限法 B、动态规划法 C、贪心法 D、回溯法 15.实现棋盘覆盖算法利用的算法是(A )。 A、分治法 B、动态规划法 C、贪心法 D、回溯法 16.下面是贪心算法的基本要素的是(C )。 A、重叠子问题 B、构造最优解 C、贪心选择性质 D、定义最优解 17.回溯法的效率不依赖于下列哪些因素( D ) A.满足显约束的值的个数 B. 计算约束函数的时间 C.计算限界函数的时间 D. 确定解空间的时间 18.下面哪种函数是回溯法中为避免无效搜索采取的策略(B ) A.递归函数 B.剪枝函数 C。随机数函数 D.搜索函数 19. (D)是贪心算法与动态规划算法的共同点。

lab4_动态规划算法设计与应用

实验四动态规划算法设计与应用 一. 实验目的和要求 1.加深对动态规划算法的基本原理的理解,掌握用动态规划方法求解最优化问题的方法步骤及应用; 2.用动态规划设计整数序列的最长递增子序列问题的算法,分析其复杂性,并实现; 3.用动态规划设计求凸多边形的三角剖分问题的算法,分析其复杂性,并实现。 4.选做题:用动态规划设计求解0/1背包问题的算法,分析其复杂性,并实现。 二.基本原理 动态规划是一种非常重要的程序设计方法,常用于求解最优化问题。最优化问题:给定若干个约束条件和一个目标函数,在某指定集合中求满足所有约束条件的且使得目标函数值达最大或最小的元素和相应的目标函数值,即:问题的最优值和最优解。 适用动态规划求解的问题的基本要素: (1)满足最优性原理:即一个最优化问题的最优解包含了其子问题的最优解。 (2)无后向性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也即,某状态以后的过程不会影响以前的状态,只与当前状态有关,这种特性也被称为无后效性。 (2)具有重叠的子问题:即问题被分解成的子问题存在互相重叠。动态规划方法对于这些重叠的子问题只求解一次,以提高算法的效率。 三.该类算法设计与实现的要点 动态规划算法求解最优化问题的步骤: (1) 找出问题的最优子结构。分析问题的最优解(最优值)的结构特征。 (2) 递归地定义最优值。根据最优子结构,确定最优值所满足的递归公式。 (3) 计算最优值。根据最优值的递归公式,采用自底向上的迭代或自顶向下的递归,计算最优值。 (4) 构造最优解。在求解最优值的过程中要记录下得到最优值的相应最优解的信息,并根据该信息构造最优解。 注意:在计算最优值时应保存相应的信息: (a) 已经求出的子问题的最优值(避免重复计算)。 (b) 最优解的有关信息。 动态规划算法求解其它问题的步骤: (1) 根据最优化原理分析问题的解的结构。 (2) 递归地定义问题的解。 (3) 计算问题的解。根据解的递归公式,自底向上或自顶向下地计算解,计算过程中注意保存已经求出的子问题的解。 其中,自底向上方法通过迭代来实现,适用于所有的子问题都需要解的情况,实现时要注意根据递归公式正确确定子问题的求解顺序。自顶向下方法通过递归来实现,适用于不必解所有的子问题的情况,实现时要注意标记子问题是否计算过,同一个子问题只在第一次递归调用时计算并存储结果。 四.实验内容 (一) 最长递增子序列问题

相关文档
相关文档 最新文档